Simulacrum, từ simulacrum Latin, là một sự bắt chước, giả mạo hoặc hư cấu. Khái niệm này được liên kết với mô phỏng, đó là hành động mô phỏng .Một...
Hàm đồ hoạ cơ bản trong ngôn ngữ C/C++
Bạn đang đọc: Hàm đồ hoạ cơ bản trong ngôn ngữ C/C++
Khởi động chế độ đồ hoạ
* Khởi động chế độ đồ hoạ ta cần một số hàm sau:
– Hàm void initgraph ( int * graphdriver, int * graphmode, char * s ) dùng để khởi động chính sách đồ họa, trong đó s là đường dẫn tới tệp egavga.bgi, nếu s = ” ” ( rỗng ) thì máy tự tìm tệp egavga.bgi trên thư mục chủ .
– Giá trị của graphdriver và graphmode được xác định trong bảng sau:
+ Nếu graphdriver = VGA (hay 9) thì giá trị của graphmode có thể là VGALO (hay 0). Ứng với độ phân giải màn hình 640 x 200 điểm ảnh, graphdriver=VGAHI (hay 2) ứng với độ phân giải 640 x 480 điểm ảnh.
+ Nếu graphdriver=DETECT (hay 0) thì chương trình tự tìm kiểu màn hình đang dùng và gán graphdriver.
– Hàm int graphresult ( void ) cho mã lỗi khi khởi động đồ họa. Hàm cho giá trị bằng 0 tức là không có lỗi, cho giá trị khác không ( mã lỗi ) thì có lỗi .– Hàm char * grapherrormsg ( int k ) cho lời lý giải bằng tiếng anh của lỗi đồ họa, có mã lỗi là k .– Hàm void closegraph ( void ) dùng để đóng chính sách đồ họa .
* Cấu trúc chung của một chương trình đồ hoạ:
– Khởi động mạng lưới hệ thống đồ họa .– Xác định màu nền ( màu màn hình hiển thị ), màu nét vẽ, màu tô và kiểu tô ( mẫu tô ) .– Vẽ, tô màu những hình mà ta mong ước .– Các thao tác đồ họa khác như cho hiện chữ … .– Đóng mạng lưới hệ thống đồ họa trở về mode văn bản .
Ví dụ: Khởi động đồ hoạ nếu thành công thì vẽ một hình chữ nhật, ngược lại thông báo mã lỗi và tên lỗi bằng tiếng Anh.
#include#include #include #include int main() { int gd=0,gm=0, maloi; // gd : graphdriver, gm: graphmode, initgraph(&gd,&gm,""); // khoi dong do hoa if ( (maloi=graphresult()) != 0) { printf("khong the khoi dong do hoa \n"); printf("ma loi : %d \n",maloi); printf("Tran Van Nhuom : %s",grapherrormsg(maloi)); printf("\n an phim bat ky de thoat"); getch(); exit(1); } bar(1,1,100,100); getch(); closegraph(); return 0; }
Các hàm đồ hoạ thông dụng trong C/C++
– Hàm int getmaxx ( void ) : cho tọa độ màn hình hiển thị x lớn nhất của kiểu màn hình hiển thị đang dùng .– Hàm int getmaxy ( void ) : cho tọa độ màn hình hiển thị y lớn nhất của kiểu màn hình hiển thị đang dùng .– Hàm int getmaxcolor ( void ) : cho giá trị màu lớn nhất đang dùng .– Hàm void setbkcolor ( int color ) : đặt màu nền, màu nền ngầm định ngay sau khi khởi động đồ họa sẽ là màu đen BLACK ( 0 ) .– Hàm int getbkcolor ( void ) : lấy màu nền hiện tại .– Hàm void setcolor ( int color ) : đặt màu nét vẽ. Màu ngầm định ngay khi khởi động là WHITE ( 15 ) .– Hàm int getcolor ( void ) : lấy màu vẽ hiện tại .– Hàm void cleardevice ( void ) : xóa hàng loạt màn hình hiển thị đồ họa ( công dụng tựa như clrscr ( ) trong chính sách mode văn bản ) .– Hàm void restorecrtmode ( void ) : Phục hồi lại chính sách màn hình như trước khi khởi động đồ họa .– Hàm int getgraphmode ( void ) : lấy kiểu màn hình hiển thị đồ họa hiện tại .– Hàm void setgraphmode ( int mode ) : lựa chọn kiểu đồ họa khác với kiểu ngầm định đặt bởi initgraph, xóa màn hình hiển thị .– Hàm moveto ( int x, int y ) : chuyển dời con trỏ vẽ tới tọa độ ( x, y ) trên màn hình hiển thị .– Hàm int getx ( void ) : cho tọa độ x của con trỏ vẽ hiện tại .– Hàm int gety ( void ) : cho tọa độ y của con trỏ vẽ hiện tại .
Ví dụ: Đặt màu nền, màu vẽ, rồi lưu lại giá trị của màu nền, màu vẽ, lấy toạ độ max của kiểu màn hình đang dùng sau đó đóng đồ hoạ và in giá trị này.
#include#include #include #include int main() { int driver=0, mode = 0, maloi; /* driver để chế độ DETECT tự phát hiện kiểu màn hình đang dùng. */ initgraph(&driver,&mode,"C:/TC/BGI"); /* khởi động đồ hoạ với tệp egavga.bgi ở thư mục c:\tc\bgi. Nếu đặt là “” (xâu rỗng) thì tự tìm tệp này ở thư mục chứa tệp .c hay .cpp của chương trình */ if ((maloi=graphresult())!=0 ) // nếu không khởi động được đồ hoạ thì báo lỗi { printf("khong the khoi dong do hoa \n"); printf("ma loi : %d \nTran Van Nhuom %s ",maloi, grapherrormsg(maloi) ); getch(); exit(1); } setbkcolor(WHITE); // đặt màu nền là màu trắng ,có thể là setbkcolor(15) setcolor(RED); // đặt màu vẽ là màu đỏ, có thể đặt setcolor (4); line(10,10,100,100); // vẽ một đường thẳng getch(); // tạm dừng màn hình đợi ấn phím bất kỳ int bk=getbkcolor(), cl=getcolor(); // lưu giá trị màu nền và màu vẽ int x=getmaxx(), y=getmaxy(); // lưu toạ độ lớn nhất của kiểu màn hình đang sử dụng closegraph(); printf("getbkcolor = %d getcolor= %d",bk,cl); printf("\ngetmaxx = %d getmaxy= %d",x,y); getch(); return 0; }
Các hàm dùng vẽ điểm, đường và miền
Hàm vẽ điểm
– Hàm void putpixel ( int x, int y, int color ) : tô điểm có tọa độ ( x, y ) trên màn hình hiển thị theo màu color .– Hàm int getpixel ( int x, int y ) : trả về màu của điểm ảnh tại vị trí có tọa độ ( x, y ) .
Ví dụ: Vẽ bầu trời sao, dừng màn hình lấy giá trị màu tại điểm ảnh có toạ độ (100,100).
#include#include #include #include void main() { int driver=0, mode = 0, maloi; initgraph(&driver,&mode,"C:/TC/BGI"); if ( (maloi=graphresult()) !=0 ) { printf("khong the khoi dong do hoa \n"); printf("ma loi : &d \nTran Van Nhuom %s ",maloi, grapherrormsg(maloi) ); getch(); exit(1); } randomize(); // khởi tạo hàm radom (cho số ngẫu nhiên) int i=0; while (i<200) { putpixel(random(639), random(476), WHITE); /* random(639) tức là cho số ngẫu nhiên trong khoảng 0->639, vẽ một điểm có toạ độ x,y cho ngẫu nhiên với màu trắng */ i++; } getch(); int mau=getpixel(100,100); /* lấy màu của điểm ảnh trên màn hình tại vị trí có toạ độ (100,100) */ closegraph(); printf(“mau cua diem anh tai vi tri co toa do (100,100) la : %d”,mau); getch(); }
Hàm vẽ đường
– Hàm void line ( int x1, int y1, int x2, int y2 ) : vẽ đường thằng nối 2 điểm có tọa độ ( x1, y1 ) và ( x2, y2 ), sau khi vẽ xong con trỏ vẽ quay về vị trí cũ ( không biến hóa vị trí )– Hàm void lineto ( int x, int y ) : vẽ đường thẳng từ vị trí con trỏ vẽ hiện tại đến điểm có tọa độ ( x, y ), vẽ xong con trỏ tới điểm có tọa độ ( x, y ) .– Hàm void linerel ( int dx, int dy ) : vẽ đường thẳng từ vị trí con trỏ vẽ hiện tại ( giả sử con trỏ vẽ hiện tại có tọa độ ( x, y ) ) đến điểm có tọa độ ( x + dx, y + dy ), vẽ xong con trỏ tới điểm mới .
– Hàm void setlinestyle(int kiểu, int mẫu, int độ_lớn) : quy định dạng, mẫu và độ lớn của nét vẽ
+ Kiểu có giá trị từ 0 đến 4 :
+ Độ_lớn xác định độ lớn của đường vẽ nó có hai giá trị : NORM_WIDTH (1) nét bình thường, THICK_WIDTH (2) nét vẽ to.
+ Mẫu sử dụng khi kiểu = 4 để tạo mẫu của đường vẽ theo ý người lập trình.
Ví dụ: int mau=0x1111 ; setlinestyle(4,mau,1); line(1,0,100,100); giá trị của mau ở hệ 16 là 0x1111, hay trong hệ nhị phân là 0001 0001 0001 0001 (ứng với các bit 0 thì điểm ảnh không sáng, ứng với các bit 1 thì điểm ảnh sáng).
Với mẫu ở trên ta được một đường thằng gồm những chấm cách nhau liên tục 3 px .Nếu kiểu < 4 thì mẫu phải bằng 0
Ví dụ: Mô phỏng vẽ đường thằng với mẫu tự tạo như ở trên, và mẫu mặc định.
#include#include #include #include int main() { int kieu=4, mau=0x1111, do_lon=1; int gd=0,gm=0,maloi; initgraph(&gd,&gm,"C:/TC/BGI"); if ( (maloi=graphresult() ) != 0) { printf("ma loi : %d \nTran Van Nhuom : %s",maloi,grapherrormsg(maloi)); getch(); exit(1); } setlinestyle(3,0,1); // vẽ với mẫu có sẵn lineto(100,100); setlinestyle(kieu,mau,do_lon); // vẽ với mẫu tự tạo line(0,110, 200,200); setlinestyle(0,0,1); // vẽ đường thẳng với mẫu có sẵn linerel(300,200); getch(); closegraph(); return 0; }
Hàm vẽ đường
– Hàm void arc(int x, int y, int gd, int gc, int r) : vẽ một cung tròn với tâm có toạ độ (x,y), bán kính r, từ góc đầu tiên là gr đến góc cuối là gc (góc tính bằng độ). Màu của nét vẽ do hàm setcolor() đặt.
– Hàm void circle ( int x, int y, int r ) : vẽ đường tròn với tâm có tọa độ ( x, y ), nửa đường kính r .– Hàm ellipse ( int x, int y, int gd, int gc, int rx, int ry ) : vẽ một cũng ellipse với tâm là ( x, y ) từ góc đầu gd đến góc cuối gc, nửa đường kính trục x là rx, nửa đường kính trục y là ry .– Hàm void rectangle ( int x1, int y1, int x2, int y2 ) : vẽ một đường chữ nhật có đỉnh trên bên trái là ( x1, y1 ) đỉnh dưới bên phải là ( x2, y2 ) .
Hàm vẽ miền
– Hàm void setfillstyle(int mẫu, int màu) : đặt mẫu tô và màu tô cho các hình đặc và miền đóng.
+Màu có giá trị từ 0 đến 15 (xem lại ở bảng màu).
+ Mẫu có giá trị từ 0 đến 12 được cho ở bảng dưới. Với mẫu có giá trị 12 thì tự thiết kế mẫu tô theo 8 byte.
– Hàm void pieslice ( int x, int y, int gd, int gc, int r ) : vẽ và tô màu một hình quạt có tâm là ( x, y ), bá kính r, từ góc đầu gd đến góc cuối gc .– Hàm void sector ( int x, int y, int gd, int gc, int rx, int ry ) : vẽ và tô màu một mảnh ellipse có tâm là ( x, y ), từ góc đầu đến gd, đến góc cuối gc, có nửa đường kính trục x là rx, nửa đường kính trục y là ry .– Hàm fillellipse ( int x, int y, int rx, int ry ) : hàm vẽ và tô màu một elip có tâm ( x, y ) và nửa đường kính hai trục là rx, ry .– Hàm void bar ( int x1, int y1, int x2, int y2 ) vẽ và tô màu một hình chữ nhật .– Hàm void bar3d ( int x1, int y1, int x2, int y2, int depth, int top ) : vẽ một khối hộp chữ nhật, màu vẽ xác lập bởi hàm setcolor. Mặt trước có tọa độ góc trên trái là ( x1, y1 ) góc dưới phải là ( x2, y2 ), được tô màu bởi hàm setfillstyle. Chiều sâu của khối hộp là depth điểm. Nếu top = 0 ( TOPOFF ) thì hộp không có lắp .Ví dụ :
#include#include #include #include void main() { int driver=0, mode = 0, maloi; initgraph(&driver,&mode,"C:/TC/BGI"); if ( (maloi=graphresult()) !=0 ) { printf("khong the khoi dong do hoa \n"); printf("ma loi : %d \nTran Van Nhuom %s ",maloi, grapherrormsg(maloi) ); getch(); exit(1); } setcolor(WHITE); // đặt màu cho nét vẽ là màu trắng arc(320,240,45,135,100); //vẽ một cung tròn với góc từ 450 đến 1350 getch(); // tạm dừng màn hình cleardevice(); // xoá màn hình đồ hoạ ellipse(320,240,0,360,150,110); /* vẽ một cung elip với góc vẽ từ 00 đến 3600 (vẽ một elip) */ getch(); cleardevice(); circle(320,240,160); // vẽ đường tròn getch(); cleardevice(); rectangle(140,60,500,420); // vẽ đường chữ nhật getch(); cleardevice(); setfillstyle(1,YELLOW); // đặt mẫu tô và màu tô cho những hàm có phần tô miền pieslice(320,240,45,300,200); /*vẽ và tô màu một hình quạt với màu và mẫu tô được xác định bởi setfillstyle */ getch(); cleardevice(); for (int i=0; i<12; i++) // tô miền đóng với 12 mẫu tô khác nhau { setfillstyle(i,getmaxcolor()); // kiểu tô dược thay lần lượt giá trị từ 0 -> 11 sector(320,240,45,250,300,200); // vẽ và tô màu một mảnh elip getch(); } cleardevice(); setfillstyle(1,LIGHTMAGENTA); bar(20,260,300,460); // vẽ và tô màu một hình chữ nhật bar3d(340,120,520,360,50,1); vẽ và tô màu một hình hộp getch(); closegraph(); }
Hàm vẽ đường gấp khúc, tô màu nền
– Hàm void drawpoly ( int n, int a [ ] ) : vẽ đường gấp khúc qua n điểm ( x1, y1 ), ( x2, y2 ), …, ( xn, yn ). Trong đó a = { x1, y1, x2, y2, …. xn, yn }. Nếu điểm ở đầu cuối trùng với điểm đầu ta được đường gấp khúc khép kín .– Hàm void fillpoly ( int n, int a [ ] ) vẽ và tô màu một đa giác có n đỉnh ( x1, y1 ), ( x2, y2 ), …, ( xn, yn ). Trong đó a = { x1, y1, x2, y2, …. xn, yn } .– Hàm floodfill ( int x, int y, int màu_biên ) : tô màu một miền kín trên màn hình hiển thị được bao quanh bởi một đường có màu là màu_biên, ( x, y ) là một điểm tùy ý ở bên trong miền kín. Màu tô và mẫu tô xác lập bởi hàm setfillstyle. Nếu ( x, y ) nằm ngoài miền kín thì vùng ngoài miền kín được tô. Nếu trên màn hình hiển thị không có miền kín như đã chỉ thì cả màn hình hiển thị được tô màu .
Ví dụ: Vẽ đường gấp khúc, đường gấp khúc khép kín và sử dụng floodfill để tô kín miền kín vừa vẽ, sử dụng fillpoly để vẽ và tô đa giác với 12 mẫu tô khác nhau.
#include#include #include #include int main() { int driver=0, mode = 0, maloi; initgraph(&driver,&mode,"C:/TC/BGI"); if ( (maloi=graphresult()) !=0 ) { printf("khong the khoi dong do hoa \n"); printf("ma loi : %d \nTran Van Nhuom %s ",maloi, grapherrormsg(maloi) ); getch(); exit(1); } int p1[10]={20,240,620,20,490,460,320,440,70,240}; int p2[8]={20,240,620,20,590,460,320,240}; int p3[10]={20,240,620,20,490,460,320,440,20,240}; setcolor(5); // đặt màu vẽ là 5 drawpoly(5,p1); // vẽ một đường gấp khúc getch(); cleardevice(); setfillstyle(1,BLUE); // đặt kiểu tô và màu tô drawpoly(5,p3); // vẽ đường gấp khúc kín floodfill(22,240,5); // tô kín đường gấp khúc kín vẽ ở trên getch(); cleardevice(); setcolor(LIGHTCYAN); // đặt lại màu vẽ mới for(int i=0; i< 12; i++) { setfillstyle(i, 3); //đặt lần lượt 12 kiểu tô khác nhau fillpoly(4,p2); /*vẽ và tô kín đa giác với kiểu tô và màu tô được xác định bởi setfillstyle */ getch(); } closegraph(); return 0; }
Cửa sổ trong chế độ đồ hoạ
Thông thường khi khởi động chính sách đồ họa với màn hình hiển thị VGA ta được độ phân giải 640 × 480, đó gọi là hành lang cửa số đồ họa gốc được tạo tiên phong. C \ C + + cung ứng thêm một số ít hàm để tạo thêm những cửa số con khác nằm trong cửa số chính này và cửa số con được ưu tiên hơn hành lang cửa số chính .
Để xác định một cửa sổ ta sử dụng 2 hàm sau:
– Hàm void setviewport ( int x1, int y1, int x2, int y2, int clip ) : tạo một hành lang cửa số có góc trên bên trái ( x1, y1 ), góc dưới bên phải là ( x2, y2 ). Nếu clip = 1 thì không được cho phép vẽ ra ngoài hành lang cửa số. Nếu clip = 0 thì được cho phép vẽ ra ngoài hành lang cửa số ( ta thường dùng để lập hệ tọa độ âm khí và dương khí của toán học trên màn hình hiển thị ). Sau khi vẽ cửa số con trỏ ở tọa độ ( 0,0 ) của cửa số hiện hành. Sau khi khởi động đồ họa hành lang cửa số ngầm định là ( 0,0,639,479, clip ) .– Hàm void clearviewport ( void ) : xóa toàn bộ những gì có trong hành lang cửa số .
#include#include #include #include int main() { int driver=0, mode = 0, maloi; initgraph(&driver,&mode,"C:/TC/BGI"); if ( (maloi=graphresult()) !=0 ) { printf("khong the khoi dong do hoa \n"); printf("ma loi : %d \nTran Van Nhuom %s ",maloi, grapherrormsg(maloi) ); getch(); exit(1); } setbkcolor(WHITE); // đặt màu nền cho cửa sổ mặc định setviewport(50,50,200,200,1); // tạo một cửa sổ mới setfillstyle(1,BLUE); // đặt kiểu và màu tô floodfill(51,51,WHITE); // tô kín cửa sổ mới setcolor(RED); // đặt màu vẽ mới line(100,100,350,100); // vẽ đường nằm ngang trên cửa sổ mới getch(); clearviewport(); // xoá toàn bộ những gì có trong cửa sổ hiện hành line(100,100,350,300); // vẽ một đường thẳng khác trên cửa sổ hiện hành getch(); closegraph(); return 0; }
Yêu cầu thay đổi thông số clip từ 1 sang 0 để thấy rõ việc tạo cửa sổ mới và khi vẽ trên cửa sổ.
– Hàm void getviewsettings ( struct viewporttype * p ) : lấy thông tin về hành lang cửa số hiện hành, kiểu viewporttype được định nghĩa trong thư viện graphics như sau :
Struct viewporttype {
Int left; int top; int right; int bottom; int clip;
} ;
Ví dụ: Lấy và in thông tin về cửa sổ hiện tại.
#include#include #include #include int main() { int driver=0, mode = 0, maloi; initgraph(&driver,&mode,"C:/TC/BGI"); if ( (maloi=graphresult()) !=0 ) { printf("khong the khoi dong do hoa \n"); printf("ma loi : %d \nTran Van Nhuom %s ",maloi, grapherrormsg(maloi) ); getch(); exit(1); } struct viewporttype p1,p2; getviewsettings(&p1); // lấy thông tin về cửa sổ mặc định khi khởi động đồ hoạ setviewport(10,10,300,200,0); // tạo mới một cửa sổ getviewsettings(&p2); // lấy thông tin của cửa sổ vừa tạo mới closegraph(); printf("thong tin cua man hinh khi bat dau khoi dong do hoa\n"); printf("(%d,%d) la goc tren ben trai cua so \n",p1.left,p1.top); printf("(%d,%d) la goc duoi ben phai cua so\n",p1.right,p1.bottom); printf("thong so clip la %d",p1.clip); printf("\n\n thong tin cua so moi duoc tao ra \n"); printf("(%d,%d) la goc tren ben trai cua so \n",p2.left,p2.top); printf("(%d,%d) la goc duoi ben phai cua so\n",p2.right,p2.bottom); printf("thong so clip la %d",p2.clip); getch(); return 0; }
Viết chữ trong đồ hoạ
Để viết chữ trong chính sách đồ họa thì thứ nhất ta phải chọn font chữ, cỡ chữ, hướng in, chỉnh sửa chiều dọc hay ngang so với điểm in .
– Hàm void settextstyle(int phông, int hướng, int cỡ): hàm thiết đặt font chữ, hướng in, cỡ chữ.
+ Tham số phông quy định font chữ, các giá trị sau:
+ Tham số hướng quy định hướng in, nhận các giá trị
HORIZ_DIR (0) : in ngang (giá trị ngầm định).
VERT_DIR (1) : in dọc.
+ Tham số cỡ quy định cỡ chữ, có giá trị từ 1 đến 10 (to nhất).
– Hàm void settextjustify(int ngang, int dọc) : quy định nơi hiển thị văn bản của outtextxy theo quan hệ với toạ độ (x,y), của outtext theo quan hệ với vị trí hiện tại của con trỏ (giả sử (x,y)).
+ Tham số ngang có giá trị
+ Tham số dọc có các giá trị
+ Hàm outtextxy(int x, int y, char *s) : in xâu s theo vị trí (x,y).
Ví dụ: settextstyle(0,0,3) ; settextjustify(1,1) ; outtext (230,230, “Can Tho Que Toi”);
– Hàm void outtext ( char * s ) : in xâu s theo vị trí hiện tại của con trỏ vẽ .– Hàm int texthight ( char * s ) : trả về chiều cao theo px của xâu s .– Hàm int textwidth ( char * s ) : trả về bề rộng của xâu s .– Hàm sprintf ( char * s, char * xâu_điều_khiển, danh_sách_các_biến ) ; thao tác giống hàm printf nhưng không in ra màn hình hiển thị mà cho hiệu quả vào xâu s. Hàm này được khai trong thư viện stdio. h
Ví dụ int n=5; char s[200];
Sprintf(s,“bien n co gia tri la %d”,n);
Sau khi thực hiện lệnh trên xâu s được kết quả là “bien n co gia tri la 5”
Ví dụ: Minh hoạ in chữ ra màn hình.
#include#include #include #include int main() { int driver=0, mode = 0, maloi; initgraph(&driver,&mode,"C:/TC/BGI"); if ( (maloi=graphresult()) !=0 ) { printf("khong the khoi dong do hoa \n"); printf("ma loi : %d \nTran Van Nhuom %s ",maloi, grapherrormsg(maloi) ); getch(); exit(1); } setcolor(GREEN); for (int i=0; i<=4; i++ ) {settextstyle(i,0,1); // đặt font chữ thay đổi từ 0 đến 4, hướng in là ngang cỡ 1 outtextxy(100,230,"Le Van Be - Cong Nghe Phan Mem"); /* in xâu tại vị trí bắt đầu là (100,230) */ getch(); cleardevice(); } settextstyle(3,1,1); // thay đổi font và hướng in (hướng dọc) outtext("Le Van Be - Cong Nghe Phan Mem"); // in tại vị trí con trỏ vẽ hiện hành getch(); closegraph(); return 0; }
Tạo hình ảnh chuyển động
– Hàm unsigned imagesize ( int x1, int y1, int x2, int y2 ) cho số byte thiết yếu để lưu ảnh trong khoanh vùng phạm vi hình chữ nhật ( x1, y1, x2, y2 ) .– Hàm void getimage ( int x1, int y1, int x2, int y2, void * p ) : chép những điểm ảnh trong vùng chữ nhật ( x1, y1, x2, y2 ) vào vùng nhớ do con trỏ p trỏ tới ( vùng nhớ này và con trỏ p cho bởi hàm malloc, độ lớn vùng nhớ cho bởi hàm imagesize ) .– Hàm void putimage ( int x, int y, void * p, int kiểu_chép ) : chép ảnh tử vùng nhớ do con trỏ p trỏ tới ra màn hình hiển thị sao cho góc trên trái vùng ảnh có tọa độ ( x, y ). Giá trị của kiểu chép được cho trong bảng sau :
a. Tạo ảnh chuyển động không có màn hình nền
B1- Tạo ảnh bằng màu vẽ.
B2- xoá ảnh bằng màu nền.
B3- tạo lại ảnh bằng màu vẽ tại vị trí mới.
Ví dụ: cho quả bóng chuyển động ngang trên màn hình, hết chiều ngang màn hình bóng quay lại.
Xem thêm: Đèn giao thông sử dụng PLC S71200 có điều chỉnh thời gian kết hợp thời gian thực – Tài liệu text
#include#include #include #include #include void bong(int x, int y, int r, int mau) { setcolor(mau); setfillstyle(1,mau); pieslice(x,y,0,360,r); } int main() { int driver=0, mode = 0, maloi; initgraph(&driver,&mode,"C:/TC/BGI"); if ( (maloi=graphresult()) !=0 ) { printf("khong the khoi dong do hoa \n"); printf("ma loi : %d \nTran Van Nhuom %s ",maloi, grapherrormsg(maloi) ); getch(); exit(1); } setbkcolor(CYAN); int x=30,y=100; do { if (x>=640-30) x=50; bong(x,y,30,CYAN); x+=4; bong(x,y,30,RED); delay(200); // tạm dừng 200 mili giây (hàm này trong thư viện dos.h) }while (!kbhit()); // lặp vô hạn tới khi ấn một phím bất kỳ thì dừng getch(); closegraph(); return 0; }
b. Tạo ảnh chuyển động mà không xoá màn hình nền
Vẽ ảnh trong vùng chữ nhật ( x1, y1, x2, y2 ), dùng hàm imagesize tính số byte càn thiết để lưu ảnh trong vùng chữ nhật vừa vẽ ( giả sử là n byte ), dùng hàm malloc để cấp phép vùng nhớ n byte và cho con trỏ p trỏ và vùng nhớ này, dùng hàm getimage chép ảnh từ vùng chữ nhật vào vùng nhớ p, xóa màn hình hiển thị, tạo màn hình hiển thị nền, dùng lệnh putimage với kiểu chép XOR_PUT để in ảnh lưu trong P ra màn hình hiển thị với tọa đọ góc trên bên trái là ( x, y ), tạm dừng chương trình một lát, dùng putimage với kiểu chép XOR_PUT in lại ảnh lưu trong P ra màn hình hiển thị cũng tại ( x, y ) để xóa ảnh cũ ( vì 1 xor 1 cho 0 ), biến hóa những thành phần của tọa độ ( x, y ) in ảnh tai tọa độ mới …
Ví dụ: Vẽ quả bóng màu đỏ và nhớ vào vùng nhớ p, xoá màn hình, vẽ bầu trời sao, cho quả bóng chuyển động ngẫu nhiên trên màn hình đến khi ấn một phím bất kỳ.
#include#include #include #include #include void bong(int x, int y, int r, int mau) { setcolor(mau); setfillstyle(1,mau); pieslice(x,y,0,360,r); } int main() { int driver=0, mode = 0, maloi; initgraph(&driver,&mode,"C:/TC/BGI"); if ( (maloi=graphresult()) !=0 ) { printf("khong the khoi dong do hoa \n"); printf("ma loi : %d \nTran Van Nhuom %s ",maloi, grapherrormsg(maloi) ); getch(); exit(1); } setcolor(RED); setfillstyle(1,RED); pieslice(50,50,0,360,50); char *p; int n= imagesize(0,0,100,100); p=(char *)malloc(n); getimage(0,0,100,100,p); getch(); cleardevice(); randomize(); for (int i=0;i<=300; i++) { int k=random(16); setcolor(k); setfillstyle(1,k); pieslice(random(640), random(480), 0,360,2); } int x=random(640-100), y=random(480-100),x1,y1; do{ putimage(x,y,p,1); /* in bóng màu đỏ với phép XOR (vẽ bóng trên màn hình chỗ nào đã có màu lần trước thì màu đó được in đè lên bóng do ta sử dụng xor); */ delay(100); // tạm dừng putimage(x,y,p,1); /* in với phép XOR một lần nữa (xoá bóng vừa in trên màn hình do bóng lần trước in là màu đỏ lại in lại màu đỏ nhưng theo phép xor thì 1 XOR 1 =0 tức là 2 màu đỏ đè lên nhau sẽ ra màu nền cũ trước đó) */ do{ /* mục đích của vòng do while này nhằm không cho quả bóng hiển thị ngoài vùng màn hình (0,0,540,340) và tạo giá trị toạ độ ngẫu nhiên mới cho bóng */ x1 =x+random(50) -25; y1 =y+random(50) -25; } while ( (x1<0) || ( x1> (639-100) ) || (y1<0) || (y1>(439-100) ) ) ; x=x1; y=y1; }while(!kbhit()) ; getch(); closegraph(); return 0; }
Source: https://vh2.com.vn
Category : Tin Học