Biến color được chọn theo danh sách đã liệt kê trong phần setcolor(). Nếu dùng giá trị không
hợp lệ cho pattern và color thì hàm graphresult() sẽ trả về mã lỗi là -11 . Hàm floodfill()
dùng để to màu một hình kín . Nó cần biết điểm bắt đầu tô . Hàm sẽ tô cho đến khi gặp
đường biên có màu xác định bằng biến border . Có thể tô bên trong hay ngoài hình vẽ tuỳ
điểm bắt đầu . Nếu tô một vùng không kín thì màu tô sẽ lan ra trong lẫn ngoài vật thể . Sau
đây là chương trình tô vòng tròn .
Chương trình 6-9 :
#include
#include
#define x 200
#define y 200
#define r 150
void main()
{
int gd,gm;
gd=DETECT;
clrscr();
initgraph(&gd,&gm,"c:\\bc\\bgi");
setcolor(RED);
circle(x,y,r);
setfillstyle(CLOSE_DOT_FILL,BLUE);
floodfill(x,y,RED);
getche();
closegraph();
}
18 trang |
Chia sẻ: hachi492 | Ngày: 07/01/2022 | Lượt xem: 395 | Lượt tải: 0
Bạn đang xem nội dung tài liệu Giáo trình Turbo C nâng cao và C++ - Chương 6: Đồ họa trong C, để tải tài liệu về máy bạn click vào nút DOWNLOAD ở trên
60
Ch−ơng 6 : đồ hoạ trong c
Đ1. Khái niệm chung
Turbo C có khoảng 100 hàm đồ hoạ . Các hàm này đ−ợc chia làm hai kiểu :
Loại theo kiểu văn bản ( ví dụ hàm tạo cửa sổ )
Loại theo kiểu đồ hoạ
Đ2. Hàm theo kiểu văn bản
Các hàm này đ−ợc dùng với màn hình đơn sắc hay màn hình đồ hoạ . Ta phải đặt vào
đầu ch−ơng trình dòng #include .
1. Cửa sổ : Mục đích của các hàm đồ hoạ theo kiểu văn bản là tạo ra các cửa sổ . Cửa sổ là
vubgf hình chữ nhật trên màn hình dùng để giới hạn vùng xuất dữ liệu . Nếu ta soạn thảo
văn bản trong cửa sổ thì con nháy chỉ di chuyển trong phạm vi của cửa sổ chứ không phải
toàn bộ màn hình . Ta xét một ch−ơng trình tạo ra cửa sổ và điền đầy vào đó dòng “ Xin
chao “
Ch−ơng trình 6-1 :
#include
#include
#define left 10
#define top 8
#define right 52
#define bot 21
void main()
{
int i;
clrscr();
window(left,top,right,bot);
textcolor(RED);
textbackground(GREEN);
for (i=0;i<100;i++)
{
cputs(" Xin chao ");
delay(100);
}
gotoxy(15,8);
cputs("Ket thuc");
getche();
}
Trong ch−ơng trình ta có hàm :
window(x1,y1,x2,y2) dùng để ấn định một cửa sổ có toạ độ góc trên trái là x1,y1 và
góc d−ới phải là x2,y2
textcolor(RED) để ấn định màu chữ là đỏ
textbackcolor(GREEN) để ấn định màu nền văn bản là xanh lá cây
gotoxy(x,y) để di chuyển con nháy về toạ độ x,y
61
cputs(string) để đặt chuỗi string trong một cửa sổ . Khi gặp biên của cửa sổ chuỗi sẽ
đ−ợc xuống dòng . Màu trong chế độ đồ hoạ đ−ợc quy định nh− sau :
Số Màu
0 BLACK
1 BLUE
2 GREEN
3 CYAN
4 RED
5 MAGENTA
6 BROWN
7 LIGHTGRAY
8 DARKGRAY
9 LIGHTBLUE
10 LIGHTGREEN
11 LIGHTCYAN
12 LIGHTRED
13 LIGHTMAGENTA
14 YELLOW
15 WHITE
2. Dời chỗ văn bản : Muốn dời chỗ một vùng hình chữ nhật của văn bản từ nơi này sang nơi
khác ta dùng hàm movetext() . Ta xét ch−ơng trình sau tạo ra một cửa sổ , điền đầy cửa sổ
bằng một đoạn văn bản và dời cửa sổ sang vị trí khác trên màn hình
Ch−ơng trình 6-2 :
#include
#include
#define left 26
#define top 7
#define right 65
#define bot 20
#define desleft 1
#define destop 1
#define numcolor 16
void main()
{
int i;
clrscr();
window(left,top,right,bot);
textbackground(GREEN);
for (i=0;i<100;i++)
{
textcolor(i%numcolor);
cputs(" Xin chao ");
delay(200);
}
delay(2000);
movetext(left,top,right,bot,desleft,destop);
62
getche();
}
Hàm movetext(x1,y1,x2,y2,x0,y0) dùng di chuyển cửa sổ x1,y1,x2,y2 đến vị trí mới
mà toạ độ góc trên trái bây giờ là x0,y0 .
3.L−u trữ và phục hồi màn hình văn bản : Ta có thể l−u trữ một vùng văn bản hình chữ
nhật trên màn hình và sau đó phục hồi lại tại một vị trí nào đó trên màn hình . Nhờ vậy ta có
thể tạo một cửa sổ nhỏ trên đầu văn bản hiện hành . Ta xét ví dụ sau
Ch−ơng trình 6-3 :
#include
#include
#define left 1
#define top 1
#define right 80
#define bot 25
int buf[80][25];
void main()
{
int i,x,y;
clrscr();
for (i=0;i<300;i++)
cputs(" Turbo C ");
getche();
gettext(left,top,right,bot,buf);
clrscr();
getch();
puttext(left,top,right,bot,buf);
getch();
}
Ch−ơng trình l−u toàn bộ màn hình vào vùng đệm có tên là buf nhớ hàm
gettext(x1,y1,x2,y2,buf) l−u vn trong hình chữ nhật x1,y1,x2,y2 vào biến buf . Hàm
puttext(x1,y1,x2,y2,buf) đặt lại văn bản trong hình chữ nhật x1,y1,x2,y2 l−u bởi biến buf ra
màn hình .
3. Một số hàm đồ hoạ văn bản khác :
• void clreol(void) : xoá đến cuối dòng
• int cprintf(const char *format) đ−a kí tự ra một cửa sổ
• void textattr(int newattr) ấn định màu cùng lúc cho văn bản và nền
• void gettextinfo(struct text_info *r) : đọc các thông tin nh− kiểu màn hình , vị trí và kích
th−ớc cửa sổ , màu nền và văn bản ,vị trí con nháy
• void normvideo(void) trả lại độ sáng cũ
• void insline(void) : chèn thêm một dòng
• void delline(void) xoá một dòng
• void hightvideo(void) tăng độ sáng
• void lowvideo(void) : giảm độ sáng
• void textmode(int newmode) chuyển đổi giữa các kiểu văn bản . Hàm dùng các đối số sau
:
Trị Hằng ý nghĩa
63
-1 LASTMODE Kiểu văn bản tr−ớc đó
0 BW40 Đen trắng 40 cột
1 C40 Màu 40 cột
2 BW80 Đen trắng 80 cột
3 C80 Màu 80 cột
7 MONO Đơn sắc 80 cột
Đ3. Các hàm đồ hoạ
1. Khởi tạo kiểu đồ hoạ : Để khởi tạo đồ hoạ ta dùng hàm initgraph() đ−ợc khai báo trong
graphics.h với cú pháp :
void far initgraph(int *graphdrive , int *graphmode , char *path);
với các biến graphdrive chứa trình điều khiển đồ hoạ
graphmode kiểu đồ hoạ
path đ−ờng dẫn đến th− mục chứa các drive đồ hoạ . Trong phần này ta phải
dùng hai dấu \\ vì dấu \ đã đ−ợc dùng cho kí tự escape .
Để thuận tiện ta khởi tạo đồ hoạ tự động bằng cách viết :
graphdrive = detect;
initgraph(graphdrive , graphmode , path);
Ta có ch−ơng trình vẽ đ−ờng thẳng và đ−ờng tròn nh− sau :
Ch−ơng trình 6-4 :
#include
#include
void main()
{
int gd,gm;
gd=DETECT;
initgraph(&gd,&gm,"c:\\bc\\bgi");
line(0,0,100,100);
circle(100,100,50);
getche();
closegraph();
}
2. Lỗi đồ hoạ : Để biết lỗi đồ hoạ ta dùng hàm int far graphresult(void) . Sau khi biết mã lỗi
ta chuyển nó sang cho hàm grapherrormsg() . Hàm này trả về con trỏ chỉ đén lỗi . Sau đây là
ch−ơng trình minh hoạ
Ch−ơng trình 6-5 :
#include
#include
#include
#include
void main()
{
int gd,gm,ge;
char *ep;
gd=DETECT;
initgraph(&gd,&gm,"c:\\bc\\bgi");
ge=graphresult();
64
if (ge)
{
printf("Ma loi %d",ge);
ep=grapherrormsg(ge);
puts(ep);
getch();
exit(1);
}
line(0,0,100,100);
circle(100,100,50);
getche();
closegraph();
}
3. Đ−ờng thẳng và màu sắc : Để thiết lập dạng , mẫu và bề dày của đ−ờng thẳng ta dùng
hàm void far setlinestyle(int style,int pattern, int thickness) . Tham biến style có thể là :
Trị Hằng Y nghĩa
0 SOLID_LINE Đ−ờng đặc
1 DOTTED_LINE Đ−ờng chấm
2 CENTER_LINE Đ−ờng gạch
3 DASHED_LINE Đ−ờng gạch dài
4 USERBIT_LINE Đ−ờng tự tạo
Tham biến thickness có thể nhân một trong hai giá trị sau :
Trị Hằng Y nghĩa
1 NORM_WIDTH dãy 1 điểm ảnh
2 THICK_WIDTH dãy 3 điểm ảnh
Để xác định màu cho đ−ờng thẳng ta dùng hàm void setcolor(int color) . Ta có ch−ơng trình
sau
Ch−ơng trình 6-6 :
#include
#include
#include
#include
void main()
{
int gd,gm,ge;
int x1=0,y1=0;
int x2=199,y2=199;
int xc=100,yc=100;
int r=90;
char *ep;
gd=DETECT;
initgraph(&gd,&gm,"c:\\bc\\bgi");
ge=graphresult();
if (ge)
65
{
printf("Ma loi %d",ge);
ep=grapherrormsg(ge);
puts(ep);
getch();
exit(1);
}
setlinestyle(1,1,1);
setcolor(LIGHTGREEN);
line(x1,y1,x2,y2);
circle(xc,yc,r);
getche();
closegraph();
}
4. Ellipse và đa giác : Để vẽ ellipse ta dùng hàm
void far ellipse(int x,int y , int gd,int gc,int xr , int yr)
x,y - toạ độ tâm ellipse
gd,gc - góc bắt đầu vẽ và góc kết thúc vẽ
xr,yr - toạ độ tâm ellipse
Ch−ơng trình 6-7 : Vẽ một loạt ellipse
#include
#include
#include
#include
void main()
{
int gd,gm,ge;
int x=150,y=150;
int g1=0,g2=360;
int xr=150,yr;
char *ep;
gd=DETECT;
initgraph(&gd,&gm,"c:\\bc\\bgi");
ge=graphresult();
if (ge)
{
printf("Ma loi %d",ge);
ep=grapherrormsg(ge);
puts(ep);
getch();
exit(1);
}
setcolor(RED);
for (yr=0;yr<100;yr+=10)
ellipse(x,y,g1,g2,xr,yr);
getche();
closegraph();
}
Để vẽ đa giác ta dùng hàm
66
void far drawpoly(int number , int far *addrlist)
number - số đỉnh đa giác cộng thêm 1
addrlist - mảng chứa toạ độ các đỉnh , toạ độ điểm đầu và cuối phải trùng nhau
Ch−ơng trình 6-8 : Vẽ một hình hộp chữ nhật
#include
#include
#define left 50
#define top 50
#define right 150
#define bot 180
int a[]={150,50,180,20,180,135,150,180};
int b[]={50,47,150,47,180,17,95,17,50,47};
void main()
{
int gd,gm;
gd=DETECT;
clrscr();
initgraph(&gd,&gm,"c:\\bc\\bgi");
setcolor(RED);
rectangle(left,top,right,bot);
setcolor(2);
drawpoly(4,a);
drawpoly(5,b);
getche();
closegraph();
}
5. Tô màu và mẫu tô : Turbo C có nhiều hàm để tô màu . Hàm thông dụng nhất để tô bên
trong một đa giác và mẫu tô hiện hành là void far fillpoly(int number , int far * addlist) .
Màu và mẫu tô đ−ợc thiết lập nhờ hàm void far setfillstyle(int pattern , int color) . Biến
pattern có thể nhận một trong các trị sau :
Trị Hằng ý nghĩa
0 EMPTY_FILL Rỗng
1 SOLID_FILL Màu đặc
2 LINE_FILL Đ−ờng ngang
3 LTSLASH_FILL //// chéo mảnh
4 SLASH_FILL //// chéo dày
5 BKSLASH_FILL \\\\ chéo ng−ợc
6 LTBKSLASH_FILL \\\\ chéo ng−ợc mảnh
7 HATCH_FILL Sọc d−a th−a
8 XHATCH_FILL Sọc d−a dày
9 INTERLEAVE_FILL Đ−ờng xen kẽ
10 WIDE_DOT_FILL Chấm th−a
11 CLOSE_DOT_FILL Chấm dày
12 USER_FILL Mẫu tự do
67
Biến color đ−ợc chọn theo danh sách đã liệt kê trong phần setcolor(). Nếu dùng giá trị không
hợp lệ cho pattern và color thì hàm graphresult() sẽ trả về mã lỗi là -11 . Hàm floodfill()
dùng để to màu một hình kín . Nó cần biết điểm bắt đầu tô . Hàm sẽ tô cho đến khi gặp
đ−ờng biên có màu xác định bằng biến border . Có thể tô bên trong hay ngoài hình vẽ tuỳ
điểm bắt đầu . Nếu tô một vùng không kín thì màu tô sẽ lan ra trong lẫn ngoài vật thể . Sau
đây là ch−ơng trình tô vòng tròn .
Ch−ơng trình 6-9 :
#include
#include
#define x 200
#define y 200
#define r 150
void main()
{
int gd,gm;
gd=DETECT;
clrscr();
initgraph(&gd,&gm,"c:\\bc\\bgi");
setcolor(RED);
circle(x,y,r);
setfillstyle(CLOSE_DOT_FILL,BLUE);
floodfill(x,y,RED);
getche();
closegraph();
}
Màu dùng để tô có thể giống hay khác với màu dùng cho đ−ờng viền của vùng . Tuy
vậy màu dùng cho tham biến border của floodfill() phải giống màu vè vật thể (trong ch−ơng
trình là màu RED)
6. Đồ thị : Turbo C có nhiều hàm giúp đơn giản hoá việc vẽ đồ thị các hàm là bar() , bar3d()
và pieslice() .
void bar (int top , int left , int right , int bottom)
void far bar3d(int left , int top , int right , int right , int bottom , int depth , int topflag)
topflag = 0 - có nắp , topflag = 1 - không có nắp
void far pieslice(int x , int y , int startangle , int endangle , int r)
Ta có ch−ơng trình minh hoạ
Ch−ơng trình 6-10 :
#include
#include
#define n 10
#define bwidth 10
#define sep 12
#define di (bwidth+sep)
#define shft 15
#define width ((n+1)*di)
#define left 5
#define depth 3
#define topflag 1
#define bot 170
68
#define top 5
#define ppd (float)(bot-top)/100
void main()
{
int gd,gm,i;
int data[n]={41,47,54,62,63,59,75,83,89,96};
gd=DETECT;
clrscr();
initgraph(&gd,&gm,"c:\\bc\\bgi");
setcolor(RED);
rectangle(top,left,left+width,bot);
for (i=0;i<n;i++)
{
setfillstyle(SOLID_FILL,1+i%3);
bar3d(left+shft+i*di,bot-data[i]*ppd,left+shft+i*di+bwidth,bot,depth,topflag);
}
getche();
closegraph();
}
Sau đây là ch−ơng trình dùng pieslice()
Ch−ơng trình 6-11 :
#include
#include
#define n 6
#define r 90
int data[n]={11,19,44,32,15,7};
void main()
{
int gd,gm,i,x,y;
float datasum,startangle,endangle,relangle;
gd=DETECT;
clrscr();
initgraph(&gd,&gm,"c:\\bc\\bgi");
x=getmaxx()/2;
y=getmaxy()/2;
setcolor(RED);
for (i=0,datasum=0;i<n;i++)
datasum+=data[i];
endangle=0;
relangle=10;
for (i=0;i<n;i++)
{
startangle=(i+1)*relangle;
setfillstyle(SOLID_FILL,i%4);
pieslice(x,y,startangle,endangle,r);
getch();
}
69
getche();
closegraph();
}
7. Viewport : Viewport là một vùng nhì thấy đ−ợc của màn hình . Khi mới khởi động
viewport là toàn bộ màn hình . Để xác định một viewport ta dùng hàm setviewport() có cú
pháp :
void far setviewport(int left , int top , int right , int bot , int clip)
Tham biến clip cho biết hình vẽ có hiện ra ngoài viewport hay không . Nếu clip 0 thì
không thấy đ−ợc hình bên ngoài viewport . Để xoá một viewport ta dùng hàm void far
clearviewport(void)
Ch−ơng trình 6-12 :
#include
#include
void main()
{
int gd,gm,i;
int left=0,top=0,right=150,bot=150;
int x1=0,y1=0,x2=199,y2=199;
int x=100,y=100;
int clip=1;
int r=90;
gd=DETECT;
clrscr();
initgraph(&gd,&gm,"c:\\bc\\bgi");
setviewport(left,top,right,bot,clip);
setcolor(RED);
rectangle(left,top,right,bot);
line(x1,y1,x2,y2);
circle(x,y,r);
getch();
closegraph();
}
8. Vẽ theo toạ độ t−ơng đối : Trong C ta có thể dùng toạ độ t−ơng đối so với điểm hiện
hành CP-current point . Để vẽ đ−ờng thẳng ta dùng hàm void far lineto(int x, int y) . Hàm
này vẽ đ−ờng thẳng từ điểm CP đến điểm mới có toạ độ là x,y . Hàm void far linerel(int dx ,
int dy) vẽ đ−ờng thẳng từ CP(xc,yc) đến điểm có toạ độ (xc+dx,yc+dy) . Th−ờng ta hay kết
hợp với hàm void far moveto(int x, int y) để di chuyển điểm hiện hành tới điểm mới có toạ
độ (x,y)
Ch−ơng trình 6-13 : Vẽ một bàn cờ
#include
#include
#define max 160
#define grid 20
#define size 18
void main()
{
int gd,gm,i,j;
void square(int );
70
gd=DETECT;
clrscr();
initgraph(&gd,&gm,"c:\\bc\\bgi");
for (i=0;i<max;i+=grid)
for (j=0;j<max;j+=grid)
{
moveto(j,i);
square(size);
}
getch();
closegraph();
}
void square(int side)
{
linerel(side,0);
linerel(0,side);
linerel(-side,0);
linerel(0,-side);
}
9. Điểm ảnh : Để đặt một điểm ảnh lên màn hình ta dùng hàm :
void far putpixel(int x , in y, int color)
Ch−ơng trình 6-14 : Lập ch−ơng trình vẽ hình sin bằng putpixel
#include
#include
#include
void main()
{
int gd,gm,x,y;
double g,sg;
gd=DETECT;
clrscr();
initgraph(&gd,&gm,"c:\\bc\\bgi");
line (1,100,200,100);
for (x=0;x<200;x++)
{
g=((double)x/200)*(2*3.14159);
sg=sin(g);
y=100-100*sg;
putpixel(x,y,RED);
}
getch();
closegraph();
}
Để xác định màu của một điểm ta dùng hàm int getpixel(int x,int y)
10 . ảnh bit và làm ảnh chuyển động : Để cất gữi một hình ảnh vào bộ nhớ ta dùng hàm :
void far getimage(int left , int top , int right , int bot , void far * addbuf)
71
left , top , right , bot - các góc của hình chữ nhật chứa ảnh
addbuf - địa chỉ bộ nhớ dùng chứa ảnh
Hàm này cần biết kích th−ớc của hình . Kích th−ớc này đ−ợc xác định theo hàm :
unsigned far imagesize(int left , int top , int right , int bot)
Giá trị của hàm đ−ợc truyền cho hàm malloc() để cấp phát bộ nhớ . Con trỏ do hàm malloc()
trả về đ−ợc truyền cho hàm putimage để khôi phục lại hình đã cất . Cú pháp của putimage()
là :
void far putimage(int left , int top , void far * addbuf,int putop)
left,top là góc trên trái của vùng sẽ đ−a ảnh ra
addbuf - địa chỉ bộ nhớ dùng chứa ảnh
putop là các đ−a ảnh ra . Các hằng putop là :
Trị Hằng ý nghĩa
0 COPY_PUT Thay hình cũ bằng hình mới
1 XOR_PUT XOR hình cũ bằng hình mới
2 OR_PUT OR hình cũ bằng hình mới
3 AND_PUT AND hình cũ bằng hình mới
5 NOT_PUT Thay hình cũ bằng đảo hình mới
Ch−ơng trình 6-15 : Lập ch−ơng trình thể hiện quả bóng dội
#include
#include
#include
#define left 0
#define top 0
#define right 639
#define bottom 479
#define r 8
void main()
{
int gd,gm,x,y;
int dx,dy,oldx,oldy;
void far *buf;
unsigned size;
gd=DETECT;
clrscr();
initgraph(&gd,&gm,"c:\\bc\\bgi");
rectangle(left,top,right,bottom);
x=y=r+10;
setcolor(LIGHTGREEN);
setfillstyle(SOLID_FILL,LIGHTGREEN);
circle(x,y,r);
floodfill(x,y,LIGHTGREEN);
size=imagesize(x-r,y-r,x+r,y+r);
buf=malloc(size);
getimage(x-r,y-r,x+r,y+r,buf);
dx=1;
dy=1;
72
while (!kbhit())
{
putimage(x-r,y-r,buf,COPY_PUT);
delay(5);
oldx=x;
oldy=y;
x=x+dx;
y=y+dy;
if (x=right-r-2)
dx=-dx;
if (y=bottom-r-2)
dy=-dy;
putimage(oldx-r,oldy-r,buf,XOR_PUT);
delay(5);
}
closegraph();
}
Đ4. Văn bản trong đồ hoạ
1. Các fonts : Để chọn fonts chữ ta dùng hàm :
void far settextstyle(int font , int direction , int charsize)
Các fonts chứa trong các tập tin trong bảng sau
Trị Hằng Tập tin
0 DEFAULT_FONT Cài sẵn
1 TRIPLEX_FONT trip.chr
2 SMALL_FONT litt.chr
3 SANSERIF_FONT sans.chr
4 GOTHIC_FONT goth.chr
5 SCRIPT_FONT scrip.chr
6 SIMPLEX_FONT simp.chr
7 TRIPLEX_SCR_FONT tscr.chr
8 COMPLEX_FONT lcom.chr
9 EUROPEAN_FONT euro.chr
10 BOLD_FONT bold.chr
Đối direction có thể nhận một trong hai trị :
0 (HORIZ_DIR) - từ trái sang phải
1 (VERT_DIR) - từ trên xuống d−ới
Khi đối charsize có trị là 1 , kích th−ớc chữ là nhỏ nhất . Khi kích th−ớc là 2 , chữ sẽ tăng
gấp đôi v.v. Để in chuỗi ra màn hình trong chế độ đồ hoạ ta dùng các hàm :
void far outtext( char far * string);
void far outtextxy(int x , int y , char far *string);
Ch−ơng trình 6-16 : Dùng hàm settextstyle() để viết chữ
#include
#include
73
#define FONTSIZE 4
void main()
{
int gd,gm;
gd=DETECT;
clrscr();
initgraph(&gd,&gm,"c:\\bc\\bgi");
settextstyle(GOTHIC_FONT,HORIZ_DIR,FONTSIZE);
outtextxy(0,0,"Gothic");
settextstyle(TRIPLEX_FONT,HORIZ_DIR,FONTSIZE);
outtextxy(0,40,"Triplex");
settextstyle(SMALL_FONT,HORIZ_DIR,FONTSIZE);
outtextxy(0,80,"Small");
settextstyle(SANS_SERIF_FONT,HORIZ_DIR,FONTSIZE);
outtextxy(0,100,"Sanserif");
settextstyle(DEFAULT_FONT,HORIZ_DIR,FONTSIZE);
outtextxy(0,160,"Default");
settextstyle(EUROPEAN_FONT,HORIZ_DIR,FONTSIZE);
outtextxy(0,200,"Euro");
settextstyle(BOLD_FONT,HORIZ_DIR,FONTSIZE);
outtextxy(0,240,"Bold");
settextstyle(COMPLEX_FONT,HORIZ_DIR,FONTSIZE);
outtextxy(0,300,"Complex");
settextstyle(SCRIPT_FONT,HORIZ_DIR,FONTSIZE);
outtextxy(0,340,"Script");
settextstyle(SIMPLEX_FONT,HORIZ_DIR,FONTSIZE);
outtextxy(0,370,"Simplex");
settextstyle(TRIPLEX_SCR_FONT,HORIZ_DIR,FONTSIZE);
outtextxy(0,420,"Triplex script");
getch();
closegraph();
}
2. Justify và định kích th−ớc văn bản : Hàm định vị trí văn bản là ;
void far settextjustify(int horiz , int vert);
Đối horiz nhận các biến trong bảng sau
Trị Hằng ý nghĩa
0 LEFT_TEXT CP nằm bên trái văn bản
1 CENTER_TEXT CP nằm bên chính giữa văn bản
2 RIGHT_TEXT CP nằm bên phải văn bản
Đối vert nhận một trong các giá trị sau :
Trị Hằng ý nghĩa
0 BOTTOM_TEXT CP nằm ở đáy văn bản
1 CENTER_TEXT CP nằm bên chính giữa văn bản
2 TOP_TEXT CP nằm ở đỉnh văn bản
74
Ch−ơng trình 6-17 :
#include
#include
#define cl 150
#define lead 40
#define fontsize 3
void main()
{
int gd,gm,i;
gd=DETECT;
clrscr();
initgraph(&gd,&gm,"c:\\bc\\bgi");
settextstyle(TRIPLEX_FONT,HORIZ_DIR,fontsize);
line(cl,0,cl,200);
for (i=0;i<lead*5;i+=lead)
line(0,i,300,i);
moveto(cl,0);
outtext("Default");
moveto(cl,lead);
settextjustify(LEFT_TEXT,TOP_TEXT);
outtext("Left-top");
moveto(cl,lead*2);
settextjustify(RIGHT_TEXT,TOP_TEXT);
outtext("Right-top");
moveto(cl,lead*3);
settextjustify(CENTER_TEXT,TOP_TEXT);
outtext("Center-top");
moveto(cl,lead*4);
settextjustify(CENTER_TEXT,BOTTOM_TEXT);
outtext("Center-bottom");
getch();
closegraph();
}
Để thay đổi kích th−ớc và tỉ lệ chữ ta dùng hàm :
void far setusercharsize(int multx , int divx , int multy , int divy);
multx - nhân chiều rộng của kí tự
divx - chia chiều rộng của kí tự
multy - nhân chiều cao của kí tự
divx - chia chiều cao của kí tự
Ch−ơng trình 6-18 : Tạo một đồ thị có ghi chú
#include
#include
#include
#define n 12
#define bwidth 20
#define sep 24
#define shft 30
#define left 5
75
#define depth 6
#define topflag 1
#define bot 300
#define top 5
#define ticks 10
#define twidth 10
#define maxdata 100
#define xtitle 40
#define ytitle 40
#define font SANS_SERIF_FONT
#define di (bwidth+sep)
#define width (((n+1)*di))
#define pbt ((float)(bot-top))
#define ppd ((float)(bot-top)/maxdata)
void main()
{
int gd,gm,i;
float a,b,c,d;
int data[n]={41,47,54,62,63,59,75,83,89,96,55,2};
char month[12][4]={"Jan","Feb","Mar","Apr","May","Jun","Jul",
"Aug","Sep","Oct","Nov","Dec"};
char string[40];
clrscr();
gd=DETECT;
initgraph(&gd,&gm,"c:\\bc\\bgi");
rectangle(left,top,left+width,bot);
setusercharsize(4,3,4,3);
settextstyle(font,HORIZ_DIR,0);
moveto(xtitle,ytitle);
outtext("1998 Sales");
setusercharsize(2,3,2,2);
settextstyle(font,HORIZ_DIR,0);
for (i=0;i<ticks;i++)
{
line(left,bot-i*pbt/10,left+twidth,bot-i*pbt/10);
line(left+width-twidth,bot-i*pbt/10,left+width,bot-i*pbt/10);
moveto(left+width+sep,bot-(i+1)*pbt/10);
itoa(i*(maxdata/ticks),string,10);
outtext(string);
}
setusercharsize(2,3,2,2);
settextstyle(font,VERT_DIR,0);
for (i=0;i<n;i++)
{
setfillstyle(SOLID_FILL,i);
bar3d(left+shft+i*di,bot-data[i]*ppd,left+shft+i*di+bwidth,bot,depth,topflag);
moveto(left+i*di+bwidth-1,bot+5);
outtext(month[i]);
}
76
getch();
closegraph();
}
Đ5. Ví dụ kết thúc
Ch−ơng trình 6-19 : Lập ch−ơng trình vẽ một mặt Mallbrot
#include
#include
#include
#define ymax 400
#define xmax 400
#define maxcount 16
void main()
{
int gd,gm;
int x,y,count;
float xscale,yscale;
float left,top,xside,yside,zx,zy,cx,cy,tempx;
clrscr();
gd=DETECT;
initgraph(&gd,&gm,"c:\\bc\\bgi");
left=-2.0;
top=1.25;
xside=2.5;
yside=-2.5;
xscale=xside/xmax;
yscale=yside/ymax;
rectangle(0,0,xmax+1,ymax+1);
for (y=1;y<=ymax;y++)
{
for (x=1;x<=xmax;x++)
{
cx=x*xscale+left;
cy=y*yscale+top;
zx=zy=0;
count=0;
while((zx*zx+zy*zy<4) && (count<maxcount))
{
tempx=zx*zx-zy*zy+cx;
zy=2*zx*zy+cy;
zx=tempx;
count++;
}
putpixel(x,y,count);
if (kbhit())
exit(0);
}
77
}
getch();
closegraph();
}
Các file đính kèm theo tài liệu này:
- giao_trinh_turbo_c_nang_cao_va_c_chuong_6_do_hoa_trong_c.pdf