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(xYT) code=9;//若点在左上侧 
		     else code=1;//若点在左中侧 
	} 
	else if(x>XR)//若点在右侧 
	{ 
			if(yYT) code=10;//若点在右上侧 
		     else code=2;//若点在右中侧 
	} 
	else 
	{ 
			if(yYT) 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; 
}