Giáo trình C - Chương 6: Đồ họa trong C

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 <conio.h>

#include <dos.h>

#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();

}

pdf18 trang | Chuyên mục: C/C++ | Chia sẻ: dkS00TYs | Lượt xem: 3003 | Lượt tải: 1download
Tóm tắt nội dung Giáo trình C - Chương 6: Đồ họa trong C, để xem tài liệu hoàn chỉnh bạn click vào nút "TẢI VỀ" ở trên
oà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(); 
 } 

File đính kèm:

  • pdfGiao_Trinh_C_Chuong6.pdf