用opengl实现直线的裁剪

来源:互联网 发布:监管数据接口功能说明 编辑:程序博客网 时间:2024/04/30 07:02
#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;} 
原创粉丝点击