Giáo trình Ngôn ngữ lập trình C++ (Phần 3)
• Tạo ảnh chuyển động:
Nguyên tắc tạo ảnh giống nh-phim hoạt hình:
- Vẽ một hình.
- Để trễ một thời gian xác định.
- Xoá hình đó.
- Vẽ hình tiếp theo.
- Để trễ một thời gian xác định.
.
Vẽ hình:
- Cách 1: Vẽ lại hình ở các vị trí khác nhau.
- Cách 2: L-u ảnh vào một vùng nhớ, rồi đ-a ảnh ra màn hình
ở các vị trí khác nhau.
Xoá ảnh:
- Cách 1: Dùng hàm cleardevice.
- Cách 2: Dùng hàm putimage (mode XOR_PUT) để xếp
chồng lên ảnh cần xoá.
- Cách 3: L-u trạng thái màn hình vảo mộtnơi nào đó, vẽ ảnh,
đ-a trạng thái cũ màn hình ra đè lên ảnh vừa vẽ.
Ví dụ1 : Cắt dán ảnh.
, int clip); Trong đó (x1, y1) là tọa độ góc trên trái, (x2, y2) là toạ độ góc d−ới phải. Các tham số này phải thoả mãn: 0 <= x1 <= x2 0 <= y1 <= y2. Tham số clip có thể nhận một trong hai giá trị: clip = 1 không cho phép vẽ ra ngoài viewport. clip = 0 cho phép vẽ ra ngoài viewport. Sau khi thiết lập viewport, ta có hệ toạ độ mới mà góc trên bên trái của viewport sẽ có toạ độ là (0, 0). • Xác nhận Viewport hiện hành: Để xác nhận viewport hiện hành ta dùng hàm: void getviewsettings(struct viewporttype *vp); ở đây kiểu viewporttype đã đ−ợc định nghĩa nh− sau: struct viewport { int left, top, right, bottom; int clip; }; • Xoá Viewport: Để xoá một viewport ta dùng hàm: 107 Đại học Thái Nguyên-Tr−ờng ĐHSP. Khoa Toán-Tin Nguyễn Mạnh Đức – Ngôn ngữ lập trình C++ void clearviewport(void); • Xoá màn hình và đ−a con trỏ về (0, 0) của màn hình: void cleardevice(void); Khi thực hiện hàm này sẽ xoá mọi thứ trên màn hình. • Toạ độ âm d−ơng: Nhờ Viewport ta có thể viết các ch−ơng trình đồ hoạ theo toạ độ âm d−ơng. Muốn vậy ta thiết lập viewport sao cho tâm tuyệt đối của màn hình là góc trên bên trái của viewport và cho tham số clip = 0 để có thể vẽ ra ngoài giới hạn của viewport. Đoạn trình sau thực hiện công việc trên: int xc = getmaxx()/2, yc = getmaxy()/2; setviewport(xc, yc, 2*xc, 2*yc, 0); Nh− vậy màn hình sẽ đ−ợc chia thành 4 phần với toạ độ âm d−ơng nh− sau: Phần t− trái trên : x âm, y âm. Phần t− trái d−ới : x âm, y d−ơng. Phần t− phải trên : x d−ơng, y âm. Phần t− phải d−ới: x d−ơng, y d−ơng. Ví dụ ch−ơng trình 8.3 : Vẽ đồ thị hàm sinX. # include # include # include # include # define TYLEX 20 # define TYLEY 80 void main() { int driver = DETECT, mode, xc, yc; initgraph(&driver, &mode, "c:\\tc\\bgi"); if (graphresult() != 0) exit(1); xc = getmaxx()/2; yc = getmaxy()/2; 108 Đại học Thái Nguyên-Tr−ờng ĐHSP. Khoa Toán-Tin Nguyễn Mạnh Đức – Ngôn ngữ lập trình C++ setviewport(xc, yc, xc*2, yc*2, 0); setcolor(YELLOW); setbkcolor(BLUE); // Ve cac truc toa do line(-xc, 0, xc, 0); // truc x line(xc-10, -5, xc, 0); // mui ten tren truc x line(xc-10, 5, xc, 0); // mui ten duoi truc x line(0, -yc, 0, yc); // truc y line(-5, -yc+10, 0, -yc); // mui ten trai truc y line( 5, -yc+10, 0, -yc); // mui ten phai truc y outtextxy(5, 5, "0,0"); outtextxy(xc-10, 10, "X"); outtextxy(15, -yc+5, "Y"); // Ve ham sin(x) int x, y, i; for (i=-400; i<=400; i++) { x = (2*M_PI*i*TYLEX/200); y = (sin(2*M_PI*i/200)*TYLEY); putpixel(x, y, YELLOW); } getch(); closegraph(); } 8.2.5. Xử lý văn bản trên màn hình đồ hoạ • Hiển thị chuỗi ký tự: void outtext(char *s); Hàm này hiển thị chuỗi s tại vị trí con trỏ. void outtextxy(int x, int y, char *s); Hàm này hiển thị chuỗi s tại toạ độ (x, y). 109 Đại học Thái Nguyên-Tr−ờng ĐHSP. Khoa Toán-Tin Nguyễn Mạnh Đức – Ngôn ngữ lập trình C++ • Fonts chữ: Các fonts nằm trong các tệp .CHR, để chọn và nạp font hãy dùng hàm: void settextstyle(int font, int direction, int size); Tham số font để nhận kiểu chữ và có nhận một trong các giá trị sau: Hằng Giá trị Kiểu chữ DEFAULT_FONT 0 Mặc định TRIPLEX_FONT 1 Triplex SMALL_FONT 2 Nhỏ SANS_SERIF_FONT 3 Sans Seif GOTHIC_FONT 4 Gothic Tham số direction xác định h−ớng hiển thị, nhận một trong hai giá trị sau: Hằng Giá trị H−ớng hiển thị HORIZ_DIR 0 Nằm ngang từ trái sang phải VERT_DIR 1 Thẳng đứng từ d−ới lên. Tham số size là hệ số phóng đại, nhận giá trị từ 1 tới 10. • Vị trí hiển thị: Hàm settextjustify cho phép ấn định nơi hiển thị văn bản so với vị trí của con trỏ hay với toạ độ (x, y) của outtextxy. Hàm có dạng nh− sau: void settextjustify(int horiz, int vert); Tham số horiz có thể nhận một trong các giá trị sau: Hằng Giá trị Kiểu hiển thị LEFT_TEXT 0 Văn bản hiện bên phải con trỏ CENTER_TEXT 1 Chỉnh tâm văn bản theo vị trí con trỏ RIGHT_TEXT 2 Văn bản hiện bên trái con trỏ 110 Đại học Thái Nguyên-Tr−ờng ĐHSP. Khoa Toán-Tin Nguyễn Mạnh Đức – Ngôn ngữ lập trình C++ Tham số vert có thể nhận một trong các giá trị sau: Hằng Giá trị Kiểu hiển thị BOTTOM_TEXT 0 Văn bản hiện bên trên con trỏ CENTER_TEXT 1 Chỉnh tâm văn bản theo vị trí con trỏ TOP_TEXT 2 Văn bản hiện bên d−ới con trỏ Ví dụ: settextjustify(1, 1); ottextxy(100, 100, “ABC”); Kết quả là điểm (100, 100) sẽ nằm giữa chữ B. 8.2.6. Cắt dán hình, tạo ảnh chuyển động • Hàm unsigned imagesize(int x1, int y1, int x2, int y2) trả về số byte cần thiết để l−u trữ ảnh trong phạm vi hình chữ nhật (, ). • Hàm void *malloc(unsigned n) trả về con trỏ trỏ tới vùng nhớ n byte mới đ−ợc cấp phát. • Hàm void getimage(int x1, int y1, int x2, int y2, void *bitmap) sao chép các điểm ảnh của hình chữ nhật (, ) và các thông tin về bề rộng chiều cao của hình chữ nhật vào vùng nhớ do bitmap trỏ tới. Vùng nhớ và và biến bitmap cho bởi hàm malloc, độ lớn của vùng nhớ đ−ợc xác định bằng hàm imagesize. • Hàm void putimage(int x, int y, void *bitmap, int copymode) để sao l−u ảnh trong vùng nhớ bitmap ra màn hình tại điểm (x, y). Tham số copymode xác định kiểu sao chép ảnh, nó có thể nhận các giá trị sau: Hằng Giá trị Kiểu hiển thị COPY_PUT 0 Sao chép nguyên si. XOR_PUT 1 Các điểm ảnh trong bitmap kết hợp với các điểm ảnh trên màn hình bằng phép XOR 111 Đại học Thái Nguyên-Tr−ờng ĐHSP. Khoa Toán-Tin Nguyễn Mạnh Đức – Ngôn ngữ lập trình C++ OR_PUT 2 Các điểm ảnh trong bitmap kết hợp với các điểm ảnh trên màn hình bằng phép OR AND_PUT 3 Các điểm ảnh trong bitmap kết hợp với các điểm ảnh trên màn hình bằng phép AND NOT_PUT 4 Các điểm ảnh xuất hiện trên màn hình đảo ng−ợc (NOT) với ảnh trong bitmap Chú ý: Nếu dùng XOR_PUT để chép hình, rồi lặp lại câu lệnh đó thì hình sẽ bị xoá và màn hình trở lại nh− cũ. Kỹ thuật này dùng để tạo ccác hình ảnh chuyển động. • Tạo ảnh chuyển động: Nguyên tắc tạo ảnh giống nh− phim hoạt hình: - Vẽ một hình. - Để trễ một thời gian xác định. - Xoá hình đó. - Vẽ hình tiếp theo. - Để trễ một thời gian xác định. ... Vẽ hình: - Cách 1: Vẽ lại hình ở các vị trí khác nhau. - Cách 2: L−u ảnh vào một vùng nhớ, rồi đ−a ảnh ra màn hình ở các vị trí khác nhau. Xoá ảnh: - Cách 1: Dùng hàm cleardevice. - Cách 2: Dùng hàm putimage (mode XOR_PUT) để xếp chồng lên ảnh cần xoá. - Cách 3: L−u trạng thái màn hình vảo một nơi nào đó, vẽ ảnh, đ−a trạng thái cũ màn hình ra đè lên ảnh vừa vẽ. Ví dụ1 : Cắt dán ảnh. 112 Đại học Thái Nguyên-Tr−ờng ĐHSP. Khoa Toán-Tin Nguyễn Mạnh Đức – Ngôn ngữ lập trình C++ // Minh hoa cat dan anh #include #include #include void main() { int drive = DETECT, mode; initgraph(&drive, &mode, "c:\\tc\\bgi"); bar(0, 0, getmaxx(), getmaxy()); unsigned size = imagesize(10, 20, 30, 40); char *p = (char*)malloc(size); getimage(10, 20, 30, 40, p); getch(); cleardevice(); putimage(getmaxx()/2, getmaxy()/2, p, COPY_PUT); getch(); closegraph(); } Ví dụ 2: ảnh chuyển động. //Chuong trinh ve duong Archimedian # include # include # include # define K 2 void archimed() { double goc = 0.0, f, xc, yc; xc = getmaxx() / 2; yc = getmaxy() / 2; setviewport(xc, yc, 2*xc, 2*yc, 0); setbkcolor(BLUE); while (!kbhit()) { f = K * goc; putpixel(f * cos(goc), f * sin(goc), YELLOW); goc += 0.001; } } 113 Đại học Thái Nguyên-Tr−ờng ĐHSP. Khoa Toán-Tin Nguyễn Mạnh Đức – Ngôn ngữ lập trình C++ void main() { int drive = DETECT, mode; initgraph(&drive, &mode, "c:\\tc\\bgi"); archimed(); getch(); closegraph(); } Ví dụ 3: Vẽ trái bóng chuyển động. // Ve_Bong_Chuyen_Dong; # include # include # include const r = 20, step = 5; int x, y; void Vebong(int color) { setcolor(color); setfillstyle(SOLID_FILL, color); fillellipse(x, y, r, r); } void main() { int drive = DETECT, mode; initgraph(&drive, &mode, "c:\\tc\\bgi"); x = r; y = getmaxy()/2; setbkcolor(BLUE); do { Vebong(BLUE); x = x + step; if (x>=getmaxx()-r-step) x = r; Vebong(YELLOW); delay(120); } while (!kbhit()); closegraph(); } Ví dụ 4: ảnh chuyển động. 114 Đại học Thái Nguyên-Tr−ờng ĐHSP. Khoa Toán-Tin Nguyễn Mạnh Đức – Ngôn ngữ lập trình C++ // Minh hoa mot trai bong nay #include #include #include #include #include double x, y, omega, k, theta, a ; double quydao(double x) { return a*fabs(sin(omega*x+theta))*exp(-k*x);} void main() { int drive = DETECT, mode; initgraph(&drive, &mode, "c:\\tc\\bgi"); line(0, getmaxy()-96, getmaxx(), getmaxy()-96); setbkcolor(BLUE); randomize(); do { x = 0.0; omega = M_PI-0.1; k = random(50) / 100; theta = M_PI/(random(20)+1); a = random(100) + 250; do { setfillstyle(SOLID_FILL, BLUE); setcolor(BLUE); fillellipse(x*100, getmaxy()-100-y, 4, 4); x+=0.001; y = quydao(x); setfillstyle(SOLID_FILL, YELLOW); setcolor(BLUE); fillellipse(x*100, getmaxy()-100-y, 4, 4); delay(2); k += 0.0001; } while (!kbhit() && x*100<getmaxx()+5); } while (!kbhit()); getch(); closegraph(); } 115 Đại học Thái Nguyên-Tr−ờng ĐHSP. Khoa Toán-Tin Nguyễn Mạnh Đức – Ngôn ngữ lập trình C++ 116 8.3. Âm thanh 8.3.1. Tạo âm thanh trong Turbo C Công cụ cơ bản để tạo âm thanh là các hàm: void sound(unsigned frequency); Phát âm thanh có tần số là frequency (Hertz). viod nosound(void); Tắt âm thanh. void delay(int n); Tạm dừng trong n mili giây. void sleep(int n); Buộc máy dừng trong n mili giây. Các hàm trên nằm trong tệp dos.h . Bằng cách sử dụng khéo léo các hàm sound, delay và nosound chúng ta có thể tạo ra các âm thanh kỳ thú, các bản nhạc kỳ diệu. 8.3.2. Ví dụ # include void main() { sound(150); delay(500); nosound(); }
File đính kèm:
- Giáo trình Ngôn ngữ lập trình C++ (Phần 3).pdf