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

