OPENGL—引數裁剪(Liang-Barsky演算法)
阿新 • • 發佈:2019-01-11
#include"stdafx.h" #include<Gl/glut.h> #include <cmath> #include <iostream> using namespace std; void drawpolygon(double cd[]) { glBegin(GL_LINE_LOOP); glLineWidth(10); for (int i = 0; i < 8; i = i + 2) { glVertex2f(cd[i], cd[i + 1]); } glEnd(); } void drawline(double cd[]) { glBegin(GL_LINES); glLineWidth(10); for (int i = 0; i < 8; i = i + 2) { glVertex2f(cd[i], cd[i + 1]); } glEnd(); } void putpixel(int x, int y) { glColor3f(1.0, 0.0, 0.0); glPointSize(3.0f); glBegin(GL_POINTS); glVertex2f(x, y); glEnd(); glFlush(); } void DDALine(int x0,int y0,int x1,int y1) { int dx,dy,epsl,k; float x,y,xIncre,yIncre; dx=x1-x0; dy=y1-y0; x=x0; y=y0; if(abs(dx)>abs(dy)) epsl=abs(dx); else epsl=abs(dy); xIncre=(float)dx/(float)epsl; yIncre=(float)dy/(float)epsl; for(k=0;k<=epsl;k++) { putpixel(int(x+0.5),(int)(y+0.5)); x+=xIncre; y+=yIncre; } } int LBLineClipTest(float p,float q,float &umax,float &umin) { float r=0.0; if(p<0.0) { r=q/p; if(r>umin) return 0; else if(r>umax) umax = r; } else if(p>0.0) { r=q/p; if(r<umax) return 0; else if(r<umin) umin = r; } else if(q<0.0) return 0; return 1; } void LBLineClip(float xwl,float xwr,float ywb,float ywt,float x1,float y1,float x2,float y2) { float umax,umin,deltax,deltay,i1,j1; deltax=x2-x1; deltay=y2-y1; umax=0.0; umin=1.0; if(LBLineClipTest(-deltax,x1-xwl,umax,umin)) { if(LBLineClipTest(deltax,xwr-x1,umax,umin)) { if(LBLineClipTest(-deltay,y1-ywb,umax,umin)) { if(LBLineClipTest(deltay,ywt-y1,umax,umin)) { i1=int(x1+umax*deltax+0.5); j1=int(y1+umax*deltay+0.5); x2=int(x1+umin*deltax+0.5); y2=int(y1+umin*deltay+0.5); cout<<i1<<" "<<j1<<" "<<x2<<" "<<y2<<endl; } DDALine(i1,j1,x2,y2); } } } } void display() { double re[8] = {200, 200, 400, 200, 400, 400, 200, 400}; double line[4] = {100,0, 500, 500}; glClear(GL_COLOR_BUFFER_BIT); glViewport(0, 0, 600, 600); glColor3f(0, 0, 0); drawpolygon(re); drawline(line); LBLineClip(200, 400, 200, 400, 500, 500,100, 0); glFlush(); } int _tmain(int argc, char **argv) { glutInit(&argc, argv); glutInitDisplayMode(GLUT_SINGLE | GLUT_RED); glutInitWindowSize(600, 600); glutInitWindowPosition(100, 100); glutCreateWindow("引數裁剪"); glClearColor(1, 1, 1, 0.0); glMatrixMode(GL_PROJECTION); gluOrtho2D(0.0, 600.0, 0.0, 600.0); glutDisplayFunc(display); glutMainLoop(); return 0; }
執行結果: