www.pudn.com > 028246-cohen.rar > clip.cpp
#include#include #include #include #include #define ROUND(a) ((int)(a+0.5)) //定义画此线的函数 #define drawOneLine(x1,y1,x2,y2); glBegin(GL_LINES); \ glVertex2f ((x1),(y1)); glVertex2f ((x2),(y2)); glEnd(); void myinit(void) { glShadeModel (GL_FLAT); glClearColor (0.0, 0.0, 0.0, 0.0); } void CALLBACK myReshape(int w, int h) { glViewport(0, 0, w, h); glMatrixMode(GL_PROJECTION); glLoadIdentity(); if (w <= h) gluOrtho2D (0.0, 1.0, 0.0, 1.0*(GLfloat)h/(GLfloat)w); else gluOrtho2D (0.0, 1.0*(GLfloat)w/(GLfloat)h, 0.0, 1.0); glMatrixMode(GL_MODELVIEW); } //定义全局变量确定裁减框的上下左右边界的值 float XL=0.2f; float XR=0.7f; float YB=0.3f; float YT=0.8f; //把整个平面分成九个区域后,给每个区域进行统一的编码(用十进制编码) int setcode(float x,float y) { int code; if(x YT) code=9;//若点在左上侧 else code=1;//若点在左中侧 } else if(x>XR)//若点在右侧 { if(y YT) code=10;//若点在右上侧 else code=2;//若点在右中侧 } else { if(y YT) code=8;//若点在正上侧 else code=0;//若点在正中侧 } return code; } //对给定线段进行裁减的裁减函数 void clip(float x0,float y0,float x2,float y2) { int c1,c2,c; float x,y; c1=setcode(x0,y0);//确定(x0,y0)所在区域 c2=setcode(x2,y2);//确定(x2,y2)所在区域 while(c1!=0||c2!=0)//若线段不完全可见,则进入循环 { if((c1&c2)!=0) break;//若线段完全不可见,则跳出循环 c=c1;//先对线段(x0,y0)端进行裁减 if(c==0){c=c2;}//若经裁减后点(x0,y0)在设定可见的区域内了,则对线段(x2,y2)端进行裁减 if(c==9||c==1||c==5)//若点在设定可见区域左侧 { y=y0+(y2-y0)*(XL-x0)/(x2-x0); x=XL; } else if(c==10||c==2||c==6)//若点在设定可见区域右侧 { y=y0+(y2-y0)*(XR-x0)/(x2-x0); x=XR; } else if(c==5||c==4||c==6)//若点在设定可见区域下侧 { x=x0+(x2-x0)*(YB-y0)/(y2-y0); y=YB; } else if(c==9||c==8||c==10)//若点在设定可见区域上侧 { x=x0+(x2-x0)*(YT-y0)/(y2-y0); y=YT; } if(c==c1)//经裁减后端点的变化 {x0=x;y0=y;c1=setcode(x0,y0);} else{x2=x;y2=y;c2=setcode(x2,y2);} } //将可见线段设定为蓝色并画出裁减后的线段 glColor3f(0.1f,0.1f,1.0f) drawOneLine(x0,y0,x2,y2); } void CALLBACK display(void) { glClear(GL_COLOR_BUFFER_BIT); glColor4f(0.0f,1.0f,1.0f,0.1f); glBegin(GL_POLYGON);//画出设定的可见矩形区域 glVertex2f(0.2f,0.3f); glVertex2f(0.7f,0.3f); glVertex2f(0.7f,0.8f); glVertex2f(0.2f,0.8f); glEnd(); glColor3f(1.0,1.0,1.0); drawOneLine(0.1f,0.6f,0.6f,0.2f);//给定线段 clip(0.1f,0.6f,0.6f,0.2f);//对给定线段进行裁减 glFlush(); } int main(int argc, char** argv) { auxInitDisplayMode (AUX_SINGLE | AUX_RGB); auxInitPosition (0, 0, 400, 400); auxInitWindow (argv[0]); myinit(); auxReshapeFunc (myReshape); auxMainLoop(display); return 1; }