?? 4-2.c
字號(hào):
/*多邊形裁剪*/
/*坐標(biāo)系:屏幕左上角為原點(diǎn),向下為縱坐標(biāo)正方向*/
#include<graphics.h>/*加入c圖形庫(kù)*/
#include<conio.h>/*鍵盤(pán)控制*/
#include<math.h>
#define LEFT 1
#define RIGHT 2
#define BOTTOM 4
#define TOP 8
#define XL 100
#define XR 500
#define YB 100
#define YH 300/*定義視窗四邊*/
encode(x,y,code)/*編碼算法*/
int x,y;
int *code;
{int c;
c=0;
if(x<XL)c=c|LEFT;
else if(x>XR)c=c|RIGHT;
if(y<YB)c=c|BOTTOM;
else if(y>YH)c=c|TOP;
*code=c;
return;
}
draw_ett(x1,y1,x2,y2,x,y)/*求最遠(yuǎn)可見(jiàn)點(diǎn)*/
int x1,x2,y1,y2;
int *x,*y;
{
int code1,code2,code;
float xx,yy;
float d,d1,d2;/*設(shè)成float型是為了防止平方時(shí)溢出*/
encode(x1,y1,&code1);
encode(x2,y2,&code2);
if(code2==0)/*(x2,y2)端點(diǎn)可見(jiàn)即為(x1,y1)的最遠(yuǎn)可見(jiàn)點(diǎn)*/
{
xx=x2;yy=y2;
*x=xx;
*y=yy;
return;
}
if((code1&code2)!=0)return;/*原線(xiàn)段不可見(jiàn)*/
L1: xx=(x1+x2)/2;
yy=(y1+y2)/2;
encode((int)xx,(int)yy,&code);/*不將xx、yy變成整型將產(chǎn)生錯(cuò)誤*/
d1=(yy-y1)*(yy-y1);
d2=(xx-x2)*(xx-x2);/*這里求中點(diǎn)距頂點(diǎn)位置,請(qǐng)思考沒(méi)用一個(gè)頂點(diǎn)坐標(biāo)的原因(注意d是float型)*/
d=sqrt(d1+d2);
// printf("%d,%d,%f,%f,%f,%f,%f\n",x1,y1,xx,yy,d1,d2,d);
if(getch()==17)exit();/*讀入鍵盤(pán)按鍵*/
if(d<=1){
*x=xx;
*y=yy;
return;
}
if((code&code2)!=0)/*中點(diǎn)到(x2,y2)端點(diǎn)線(xiàn)段不可見(jiàn)*/
{
x2=xx;
y2=yy;
}
else {
x1=xx;
y1=yy;
}
putpixel(xx,yy,14);/*畫(huà)出中點(diǎn)位置便于觀察*/
goto L1;
}
void main()
{
int x1,y1,x2,y2,xx,yy,xxx,yyy;
int driver,mode;
driver=DETECT;/*初始化顯示模式參數(shù)*/
initgraph(&driver,&mode,"..\\bgi");/*初始化顯示為VGA驅(qū)動(dòng)的640*480、16色模式*/
printf("Press any key to continue except 'Ctrl+Q' to quit.\n");
//scanf("%d,%d,%d,%d",&x1,&y1,&x2,&y2);/*可以手動(dòng)輸入直線(xiàn)兩頂點(diǎn)*/
x1=100;y1=80;x2=500;y2=350;/*直線(xiàn)兩頂點(diǎn)*/
setcolor(12);
line(x1,y1,x2,y2);
line(XL,YH,XR,YH);
line(XL,YB,XR,YB);
line(XL,YH,XL,YB);
line(XR,YH,XR,YB);/*視窗邊框*/
xx=0;
yy=0;
xxx=0;
yyy=0;
draw_ett(x1,y1,x2,y2,&xx,&yy);/*求得(x1,y1)的最遠(yuǎn)端可見(jiàn)點(diǎn)*/
draw_ett(xx,yy,x1,y1,&xxx,&yyy);/*求得(xx,yy)的最遠(yuǎn)端可見(jiàn)點(diǎn)*/
line(x1,y1,x2,y2);/*覆蓋運(yùn)行過(guò)程中在原直線(xiàn)上產(chǎn)生的中點(diǎn)*/
setcolor(14);
line(xx,yy,xxx,yyy);/*剪切后直線(xiàn)*/
if(getch()==17)exit();/*讀入鍵盤(pán)按鍵*/
closegraph();/*關(guān)閉圖形模式*/
}
?? 快捷鍵說(shuō)明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -