版权声明:本文为博主原创文章,未经博主允许不得转载。 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;
}
运行结果: