用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; }
相关文章推荐
- opengl实现直线扫描算法和区域填充算法
- Mac下OpenGL实现直线算法-OpenGL教程(2)
- 直线的DDA算法的C实现(opengl实现)
- opengl实现直线扫描算法和区域填充算法
- opengl DDA直线算法的实现
- OpenGL写的直线裁剪法
- 《计算机图形学基础》OpenGL画点画直线画虚线实现不同线宽
- opengl 直线裁剪Cohen-Sutherland算法
- 《计算机图形学》实验一:利用OpenGL实现直线光栅化的DDA算法
- WEB前端实现裁剪上传图片功能
- 基于OpenGL的三种直线生成算法
- Hough变换 直线检测原理及其Matlab实现
- OpenGL编程指南第版本学习笔记 --- OpenGL程序实现过程(win32 + OpenGL)
- 图片拍照或相册选择的实现以及裁剪功能
- OpenGL(十四)环境反射 环境折射 的shader实现
- opengl中层次建模的实现
- Hough变换检测直线的Java实现
- openGL代码入门笔记[2]:绘制直线、圆以及椭圆
- OpenGL: 实现立体显示(源代码)
- 用JAI实现TIF(TIFF)格式图片的裁剪