OPENGL—参数裁剪(Liang-Barsky算法)

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/LY_624/article/details/72925932
#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;
}

运行结果:


猜你喜欢

转载自blog.csdn.net/LY_624/article/details/72925932
今日推荐