Trư
ờng ðại học Nô
ng nghi
ệp 1
-
Giáo trình
Tin h
ọc
ñ
ại
c
ươ
ng
177177
CHƯƠNG VII
ðỒ HOẠ VÀ ÂM THANH
1- ðồ hoạ
1.1 - Khái niệm chung
Màn hình máy vi tính hiện nay có nhiều loại khác nhau, các máy AT-386, AT-486, AT-
Driver - là một số nguyên xác ñịnh kiểu màn hình; GM: Graph Mode - cũng là một số nguyên
xác ñịnh Mode ñồ hoạ).
Trước hết trong phần khai báo biến các tham số này phải khai thuộc kiểu Integer, sau
ñó trong phần thân chương trình phải chọn các giá trị thích hợp cho kiểu màn hình và Mode
ñồ hoạ.
Thông thường chúng ta không biết chính xác kiểu màn hình và Mode ñồ hoạ của máy
tính ñang sử dụng nên sẽ gặp lúng túng khi khai báo. Trong trường hợp này tốt nhất là ñể
Pascal tự xác ñịnh giúp chúng ta các tham số này.
Nếu ngay sau từ khoá Begin của phần thân chương trình chúng ta khai báo
Trư
ờng ðại học Nô
ng nghi
ệp 1
-
Giáo trình
Tin h
ọc
ñ
ại
c
ươ
ng
178
320x200
320x200
640x200
EGA 3 EGALO
EGAHi
0
1
640x200
640x350
IBM8514 6 IBM8514L
O
IBM8514Hi
0
1
640x480, 256 màu
1024x768, 256 màu
VGA 9 VGALO
VGAMed
VGAHi
0
1
2
640x200
640x350
640x480
Ví dụ 44 trình bày cách sử dụng thủ tục Initgraph ñể thiết kế chương trình vẽ một
ñường tròn có tâm tại chính giữa màn hình và bán kính là 50 Pixel. Các tham số GD,GM sẽ
do Pascal tự xác ñịnh, các tệp ñiều khiển ñồ hoạ ñặt trong thư mục TP trên ñĩa cứng C.
ươ
ng
179179
GD:=VGA;
GM:=VGAHi;
INITGRAPH(GD,GM,'C:\TP\BGI');
Chú ý: Có thể thay thế tên màn hình bằng giá trị tương ứng ñã có trong bảng.
Tham số DP ( Driver Path ) là ñường dẫn tới thư mục chứa các tệp ñiều khiển kiểu
màn hình ñồ hoạ, trong ví dụ trên ñược khai là 'c:\tp\bgi' nghĩa là ổ ñĩa C thư mục TP, còn
BGI là ñuôi tệp ñều khiển. Trong trường hợp chúng ta không khai báo gì cho DP, nghĩa là ñể
một chuỗi rỗng '' thì Pascal sẽ tự tìm các tệp ñiều khiển ñồ hoạ trong thư mục chủ (là nơi mà
Pascal ñược khởi ñộng).
1.3 - Kiểm tra lỗi ñồ hoạ
Dòng thứ 8 trong ví dụ 44
If graphresult <> grok then halt(1);
Là câu lệnh kiểm tra lỗi ñồ hoạ. Việc kiểm tra ñược thực hiện thông qua hàm của hàm
graphresult. Lỗi ñồ hoạ thường phát sinh khi không tìm thấy các trình ñiều khiển ñồ hoạ,
hoặc khi chúng ta khai báo không ñúng các tham số GD, GM, DP. Nếu phát hiện ra lỗi hàm
Graphresult sẽ nhận một trong các giá trị cho trong bảng sau, mỗi giá trị ứng với một hằng
ñ
ại
c
ươ
ng
180180
1.4 - Một số thủ tục cơ bản ñể vẽ hình
* MOVETO(x,y) : Di chuyển con trỏ ñến toạ ñộ x,y (x là hoành ñộ, y là tung ñộ)
x,y là các giá trị kiểu Integer, với màn hình VGA thì 0<= x <=639, 0<= y <= 479
* LINETO(x,y): Vẽ một ñường thẳng từ vị trí con trỏ hiện thời tới toạ ñộ x,y kết thúc quá
trình vẽ con trỏ nằm tại toạ ñộ mới.
Pascal có sẵn hai hàm ñể xác ñịnh toạ ñộ góc dưói bên phải màn hình ñó là Getmaxx và
Getmaxy. ðể vẽ ñường chéo của màn hình từ toạ ñộ 0,0 ta có thể viết các lệnh
MOVETO(0,0);
LINETO(Getmaxx,Getmaxy);
* LINE(x1,y1,x2,y2 : Thủ tục này vẽ một ñường thẳng từ toạ ñộ x1,y1 ñến toạ ñộ x2,y2
* LINEREL(dX,dY): Vẽ ñường thẳng từ vị trí hiện thời ( toạ ñộ x,y) tới toạ ñộ x+dx, y+dy.
* CIRCLE(x,y,r): Vẽ ñường tròn tâm tại toạ ñộ x,y bán kính bằng r Pixel
* PUTPIXEL(x,y, n): Thủ tục này sẽ vẽ một ñiểm sáng tại toạ ñộ x,y với màu là n. Giá trị n
- Một màu ñã ñịnh sẽ có tác dụng cho ñến khi có lệnh ñịnh màu mới
Trư
ờng ðại học Nô
ng nghi
ệp 1
-
Giáo trình
Tin h
ọc
ñ
ại
c
ươ
ng
181181
• Vẽ hình khép kín và tô màu
* RECTANGLE(x1,y1,x2,y2) : Vẽ khung hình chữ nhật toạ ñộ góc trên bên trái là x1,y1 , toạ
ñộ góc dưới bên phải là x2,y2.
1.5 - Viết chữ trong chế ñộ ñồ hoạ
Khi ñã chuyển sang làm việc ở chế ñộ ñồ hoạ ta không thể viết chữ bình thường như
trong chế ñộ văn bản. Muốn viết chữ trong các hình vẽ ta sử dụng một số thủ tục sau ñây:
* OUTTEXT(chuỗi) : Thủ tục này sẽ cho hiện chuỗi ký tự tại vị trí con trỏ hiện thời.
Chuỗi có thể viết trực tiếp hoặc thông qua biến chuỗi như trong ví dụ 45 sau ñây:
Ví dụ 45
Var
chuviet : string[30]
Begin
outtext('cong hoa xa hoi chu nghia ');
Trư
ờng ðại học Nô
ng nghi
ệp 1
-
Giáo trình
Tin h
ọc
ñ
ại
c
ươ
ng
begin
gd:=detect;
initgraph(gd,gm,'a:\tp5\bgi');
if graphresult<>grok then halt(1);
moveto(0,0); setcolor(5);
lineto(300,300); delay(2500);
circle(400,300,100); delay(1500);
restorecrtmode; (* Chuyển về chế ñộ văn bản *)
gotoxy(20,20);textcolor(9);
write('Happy New Year');
readln;
setgraphmode(2); (* Trở về chế ñộ ñồ hoạ với n=2 cho màn hình VGA*)
setcolor(blue);
circle(100,100,50);
delay(2000);
restorecrtmode; (* Chuyển sang chế ñộ văn bản lần thứ hai*)
textcolor(3);
gotoxy(20,0);write('DAI HOC NONG NGHIEP I HA NOI');
readln;
closegraph; (* Kết thúc chế ñộ ñồ hoạ*)
end.
Việc sử dụng các thủ tục ñồ hoạ không có gì phức tạp, với một chút cố gắng bạn có thể
vẽ ñợc những hình rất ñẹp theo mong muốn. Dưới ñây là một chương trình vẽ ñồ thị hình sin.
Chạy chương trình ta sẽ thấy ba ñường hình sin với các biên ñộ và màu sắc khác nhau.
Ví dụ 46
Trư
ờng ðại học Nô
ng nghi
if graphresult<>grok then Halt(1);
x:=0; t3:=100; n:=0; t2:=10;
while t2<=600 do
Begin
setcolor(green);
y:=sin(x);
t1:=round(y*50);
t3:=round(y*70);
t4:=round(y*100);
t1:=200-t1;
t3:=200-t3;
t4:=200+t4;
moveto(10,200);
lineto(620,200);
line(10,80,10,300);
settextstyle(3,0,3);
outtextxy(610,205,'x');
settextstyle(3,0,3);
outtextxy(15,75,'y');
settextstyle(4,0,3);
setcolor(5);
outtextxy(200,300,'do thi ham sin(x)');
setcolor(12);
moveto(10,200);
putpixel(t2,t1,11);
putpixel(t2,t3,14);
setcolor(red);
putpixel(t2,t4,random(14));
setcolor(12);
delay(5);
184
end;
repeat until keypressed;
closegraph;
End.
Chương trình dưới ñây thiết kế một ñồng hồ ba kim , tốc ñộ chạy của kim giây tuỳ
thuộc vào lệnh DELAY(n) , nếu chọn DELAY(1000) thì cứ 1 giây kim giây chuyển một vị trí.
Khi nhập chương trình vào máy cần lưu ý khai báo lại ñường dẫn ñến thư mục chứa các tệp
*.BGI
Program VEDONGHO;
uses crt,graph;
var
x,y, maxx,maxy, gd,gm,color,i,j,t:integer;
N:real;
LAM,TT:CHAR;
begin
gd:=detect;
initgraph(gd,gm,'c:\tp5\BGI');
setcolor(5);
rectangle(30,20,610,450);
rectangle(31,21,609,449);
rectangle(32,22,608,448);
Giáo trình
Tin h
ọc
ñ
ại
c
ươ
ng
185185
outtextxy(410,370,'V');
outtextxy(310,400,'VI');
outtextxy(210,370,'VII');
outtextxy(135,290,'VIII');
outtextxy(130,210,'IX');
outtextxy(155,130,'X');
outtextxy(220,60,'XI');
setcolor(blue);
Settextstyle(4,0,5);
linerel(round(110*cos((t*30-92)*pi/180)),round(110*sin((t*30-92)*pi/180)));
for i:=0 to 60 do { Kim phut }
begin
setcolor(12);
moveto(320,240);
setlinestyle(0,0,3);
SetWriteMode(xorput);
linerel(round(130*cos((i*6-89)*pi/180)),round(130*sin((i*6-89)*pi/180)));
moveto(320,240);
Trư
ờng ðại học Nô
ng nghi
ệp 1
-
Giáo trình
Tin h
ọc
ñ
ại
c
ươ
ng
186
moveto(320,240);
linerel(round(110*cos((t*30-89)*pi/180)),round(110*sin((t*30-89)*pi/180)));
moveto(320,240);
linerel(round(110*cos((t*30-90)*pi/180)),round(110*sin((t*30-90)*pi/180)));
moveto(320,240);
linerel(round(110*cos((t*30-91)*pi/180)),round(110*sin((t*30-91)*pi/180)));
moveto(320,240);
linerel(round(110*cos((t*30-92)*pi/180)),round(110*sin((t*30-92)*pi/180)));
end;
repeat until keypressed;
END.
2 – Âm thanh
Trong các máy PC thông dụng công suất của loa rất nhỏ do ñó việc tạo âm thanh chỉ có
tính chất biểu diễn. Muốn tạo ra âm thanh cao thấp khác nhau ta chỉ cần ñưa vào loa các xung
ñiện với tần số khác nhau. Turbo Pascal ñã có ba thủ tục thiết kế sẵn ñể làm việc này
SOUND(n) : tạo ra âm thanh với tần số n , ở ñây n phải là một số nguyên dương
DELAY(n) : Kéo dài tín hiệu âm thanh trong khoảng thời gian n miligiây nếu sau ñó có
thủ tục ngắt âm Nosound.
NOSOUND : ngắt tín hiệu âm thanh
Cần chú ý rằng khi có thủ tục sound và Delay tín hiệu âm thanh sẽ ñược phát ra chừng
nào chưa có Nosound mặc dù ta ñã ñịnh khoảng thời gian trễ qua thủ tục Delay.
Trư
ờng ðại học Nô
ng nghi
ệp 1
-
Giáo trình
Tin h
ọc
biết cách tạo ra các nốt thăng, giáng ñể có thể tạo ra một bản nhạc theo ý muốn.
Nếu chúng ta chỉ muốn nghe một bản nhạc phát ra từ máy thì có thể tạo nên một chương
trình thiết kế các nốt nhạc sau ñó ghép chúng lại thành bản nhạc tuỳ ý.
Chương trình dưới ñây thiết kế bản nhạc Làng tôi, các chương trình con T0, T1 T5
tạo ra trường ñộ, ví dụ T0 là nốt tròn, T1 là nốt ñen các chương trình con khác tạo ra các nốt
nhạc của hai quãng tám trầm và trung, trong ñó có một số nốt thăng và giáng.
Program Vancao;
uses crt;
procedure T0; Begin delay(20000); Nosound; End;
procedure T1; Begin delay(10000); Nosound; End;
procedure T2; Begin delay(5000); Nosound; End;
procedure T3; Begin delay(2500); Nosound; End;
procedure T4; Begin delay(1250); Nosound; End;
procedure T5; Begin delay(30000); Nosound; End;
Procedure nt(i:integer);
Begin Sound(i); End;
Procedure do1; Begin nt(256); End; {quang tam tram}
Procedure do11; Begin nt(270); End; {not do thang}
Procedure re1; Begin nt(299); End;
Procedure mi1; Begin nt(342); End;
Procedure fa1; Begin nt(363); End;
Procedure son1; Begin nt(406); End;
Procedure la1; Begin nt(449); End;
Procedure si1; Begin nt(492); End;
Procedure do2; Begin nt(534); End; {quang tam trung}
Procedure re2; Begin nt(600); End; {not Re giang}
Procedure mi2; Begin nt(685); End;
Procedure fa2; Begin nt(634); End;
clrscr; gotoxy(25,12); textcolor(14); textbackground(red);
Write(' LANG TOI * Nhac tien chien ');
Repeat
do11;t0;mi1;t1;son1;t0;la1;t1;son1;t0;
son1;t1;do2;t1;si1;t1;la1;t1;son1;t0;
la1;t1;son1;t1;fa1;t1;mi1;t1;son1;t0;t1;
do11;t0;re1;t1;mi1;t0;son1;t1;do2;t0;re2;t1;mi2;t0;t1;
re2;t1;do2;t1;re2;t1;do2;t1;son1;t0;mi1;t1;son1;t1;do2;t5;t1;
do2;t1;do2;t2;la1;t1;la1;t1;si1;t1;la1;t1;son1;t0;t1;
fa1;t1;fa1;t1;la1;t0;t4;la1;t1;mi1;t0;re1;t1;son1;t5;t1;
do1;t0;re1;t1;mi1;t0;fa1;t1;son1;t0;mi1;t1;re1;t5;
do1;t1;do2;t0;si1;t1;re2;t0;son1;t1;do2;t5;
Until keypressed; Nosound;
End;
BEGIN
Langtoi;
END.
Dưới ñây là ví dụ thiết kế bàn phím thành các phím của một chiếc ñàn dương cầm. Các
nốt ñô, rê, mi, fa, son, la , xi ñố sẽ bấm các chữ cái tương ứng ( D, R, M, F, S, L, X, Z).
Muốn dừng âm ta bấm phím P (PAUSE), còn muốn dừng chương trình bấm E (EXIT).
Program nhac;
uses crt,graph;
var
n :char; i,j:integer;
begin
ại
c
ươ
ng
189189
if n = 'r' then begin nosound; delay(10); sound(587); end;
if n = 'm' then begin nosound; delay(10); sound(659); end;
if n = 'f' then begin nosound; delay(10); sound(698); end;
if n = 's' then begin nosound; delay(10); sound(784); end;
if n = 'l' then begin nosound; delay(10); sound(880); end;
if n = 'x' then begin nosound; delay(10); sound(988); end;
if n = 'z' then begin nosound; delay(3); sound(1050); end;
if n = 'w' then begin nosound; delay(3); sound(1190); end;
if n = 't' then begin nosound; delay(3); sound(1300); end;
if n = 'p' then nosound;
until upcase(n) ='E';
nosound;
end.
Trư
ờng ðại học Nô
ng nghi
ệp 1
-
Giáo trình
Tin h
ọc
ñ
ại
c
ươ
ng
190190
Tài liệu tham khảo