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.

pdf19 trang | Chuyên mục: C/C++ | Chia sẻ: dkS00TYs | Lượt xem: 2435 | Lượt tải: 1download
Tóm tắt nội dung Giáo trình Ngôn ngữ lập trình C++ (Phần 3), để xem tài liệu hoàn chỉnh bạn click vào nút "TẢI VỀ" ở trên
, 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:

  • pdfGiáo trình Ngôn ngữ lập trình C++ (Phần 3).pdf