资源描述:
《直线段的裁剪.docx》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库。
1、实验:直线段的裁剪姓名:龙泽学号:指导教师:吴昊实验内容:采用Liang-Barsky算法对直线段进行裁剪。实验设计:本次实验采用的是Liang-Barsky算法,根据这个算法需先定义直线段的起点坐标(x1,y1),终点坐标(x2,y2),以及裁剪框(矩形)的左边界(wxl),右边界(wxr),上边界(wyt),下边界(wyb),如voidLine_Clipping(floatx1,floaty1,floatx2,floaty2,floatWxl,floatWxr,floatWyt,floatWyb),再结合鼠标mouse函数,实现点击
2、鼠标左键显示矩形框和待裁剪的直线段,点击鼠标右键进行裁剪并显示裁剪过后的直线段,最终显示出来。由于在Line_Clipping函数下用到了line函数,所以我在上面定义了个line函数来绘制直线段(绘制直线段所采用的算法为Bresenham算法)。程序代码:#include#include//初始化OpenGL场景voidmyinit(void){glClearColor(1,1,1,0);//将背景置成白色glMatrixMode(GL_PROJECTION);gluOrtho2D(0,50
3、0,0,500);//设置投影变换,使用正交投影}voidsetPixel(intx,inty)//在指定位置(x,y)绘制点图元{glBegin(GL_POINTS);glVertex2i(x,y);//绘制点的坐标glEnd();}//绘制直线的方法voidline(intx1,inty1,intx2,inty2)//输入线段的两个端点坐标和画线颜色{intx,y,dx,dy,s1,s2,p,temp,interchange,i;x=x1;y=y1;//设置象素坐标初值dx=abs(x2-x1);dy=abs(y2-y1);//分别
4、计算之间的差值if(x2>x1)s1=1;elses1=-1;if(y2>y1)s2=1;elses2=-1;//判断起点和终点的位置,以确定是该加一个单位还是该减一个单位if(dy>dx)//y方向增长快,将总步数设为y2-y1,每一步的y值为:y=y+1{temp=dx;dx=dy;dy=temp;interchange=1;}elseinterchange=0;//x方向增长快,将总步数设为x2-x1,每一步的x值为:x=x+1p=2*dy-dx;//设置初始误差判别值for(i=1;i<=dx;i++){setPixel(x,y
5、);if(p>=0){if(interchange==0)y=y+s2;elsex=x+1;p=p-2*dx;}if(interchange==0)x=x+s1;elsey=y+s2;p=p+2*dy;}}//Liang-Barsky算法intClip_Top(floatp,floatq,float&umax,float&umin){floatr=0.0;if(p<0.0)//线段从裁剪窗口外部延伸到内部,取最大值r并更新umax{r=q/p;if(r>umin)return0;//umin>umax的情况,弃之elseif(r>uma
6、x)umax=r;}elseif(p>0.0)//线段从裁剪窗口内部延伸到外部,取最小值r并更新umin{r=q/p;if(rumax的情况,弃之elseif(r7、dx=x2-x1,dy=y2-y1,umax=0.0,umin=1.0;//比较左、右边界,获得最大的umaxif(Clip_Top(-dx,x1-Wxl,umax,umin))//左边界if(Clip_Top(dx,Wxr-x1,umax,umin))//右边界//比较下、上边界,获得最小的uminif(Clip_Top(-dy,y1-Wyb,umax,umin))//下边界if(Clip_Top(dy,Wyt-y1,umax,umin))//上边界line((int)(x1+umax*dx),(int)(y1+umax*dy),(i
8、nt)(x1+umin*dx),(int)(y1+umin*dy));}voiddisplay(void)//需要点击鼠标显示,所以这里的display函数下为空{}//鼠标响应函数,控制当鼠标接收到不同的