您的位置:首页 > 运维架构

用opengl实现直线的裁剪

2009-12-17 11:29 435 查看
#include"gl/glut.h"
void Initial(void)
{
glClearColor(1.0f,1.0f,1.0f,1.0f);
glMatrixMode(GL_PROJECTION);
gluOrtho2D(-200.0,200.0,-200.0,200.0);
}
void drawline(int x0,int y0,int x1,int y1)
{glBegin(GL_LINES);
glVertex2i(x0,y0);
glVertex2i(x1,y1);
glEnd();
}
/*void MidBresenhamLine(int x0,int y0,int x1,int y1)
{
int dx,dy,d,UpIncre,DownIncre,x,y;
if(x0>x1){
x=x1;x1=x0;x0=x;
y=y1;y1=y0;y0=y;
}
x=x0;y=y0;
dx=x1-x0;
dy=y1-y0;
d=dx-2*dy;
UpIncre=2*dx-2*dy;  DownIncre=-2*dy;
while(x<=x1){
glBegin(GL_POINTS);
glVertex2i(x,y);
glEnd();
x++;
if(d<0){
y++;
d+=UpIncre;
}
else d+=DownIncre;
}
}*/
int LBLineClipTest(float p,float q,float &umax,float &umin)
{
float r=0.0;
if(p<0.0){ //p小于0时比较最大值
r=q/p;
if(r>umin) return 0; //umax小于 umin直线段才有在窗口内的部分
else if(r>umax)umax=r;
}
else if(p>0.0){   //p大于0时比较最小值
r=q/p;
if(r<umax) return 0;  //umax小于 umin直线段才有在窗口内的部分
else if(r<umin)umin=r;
}
else if(q<0.0) return 0;  // 处理p=0的情况
return 1;
}
void LBLineClip(float xw1,float xwr,float ywb,float ywt,float x1,float y1,float x2,float y2)
{
float umax,umin,deltax,deltay;
deltax=x2-x1; deltay=y2-y1; umax=0.0; umin=1.0;
if(LBLineClipTest(-deltax,x1-xw1,umax,umin)){ //处理左边界交点
if(LBLineClipTest(deltax,xwr-x1,umax,umin)){  //处理右边界交点
if(LBLineClipTest(-deltay,y1-ywb,umax,umin)){  //处理下边界交点
if(LBLineClipTest(deltay,ywt-y1,umax,umin)){ //处理上边界交点
x1=int(x1+umax*deltax+0.5);
y1=int(y1+umax*deltay+0.5);
x2=int(x1+umin*deltax+0.5);
y2=int(y1+umin*deltay+0.5);
}
drawline(x1,y1,x2,y2);
//MidBresenhamLine(x1,y1,x2,y2);
}
}
}
}

void Display(void)
{
glClear(GL_COLOR_BUFFER_BIT);
glColor3f(1.0f,0.0f,0.0f);
glBegin(GL_LINES);
glVertex2i(100,100);
glVertex2i(-100,100);
glVertex2i(-100,100);
glVertex2i(-100,-100);
glVertex2i(-100,-100);
glVertex2i(100,-100);
glVertex2i(100,-100);
glVertex2i(100,100);
glEnd();
// MidBresenhamLine(-32,-41,-85,-105);
drawline(-32,-41,165,178);
glColor3f(0.0f,1.0f,0.0f);
LBLineClip( -100, 100, -100,100,-32,-41,165,178);
glFlush();
}
int main(int argc,char*argv[])
{
glutInit(&argc,argv);
glutInitDisplayMode(GLUT_SINGLE|GLUT_RGB);
glutInitWindowSize(400,400);
glutInitWindowPosition(100,120);
glutCreateWindow("多边形的裁剪");
glutDisplayFunc(Display);
Initial();
glutMainLoop();
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  float include buffer