梁友栋Barsky直线裁剪算法计算机图形学课程设计样本Word格式文档下载.docx

上传人:b****2 文档编号:13412466 上传时间:2022-10-10 格式:DOCX 页数:17 大小:254.71KB
下载 相关 举报
梁友栋Barsky直线裁剪算法计算机图形学课程设计样本Word格式文档下载.docx_第1页
第1页 / 共17页
梁友栋Barsky直线裁剪算法计算机图形学课程设计样本Word格式文档下载.docx_第2页
第2页 / 共17页
梁友栋Barsky直线裁剪算法计算机图形学课程设计样本Word格式文档下载.docx_第3页
第3页 / 共17页
梁友栋Barsky直线裁剪算法计算机图形学课程设计样本Word格式文档下载.docx_第4页
第4页 / 共17页
梁友栋Barsky直线裁剪算法计算机图形学课程设计样本Word格式文档下载.docx_第5页
第5页 / 共17页
点击查看更多>>
下载资源
资源描述

梁友栋Barsky直线裁剪算法计算机图形学课程设计样本Word格式文档下载.docx

《梁友栋Barsky直线裁剪算法计算机图形学课程设计样本Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《梁友栋Barsky直线裁剪算法计算机图形学课程设计样本Word格式文档下载.docx(17页珍藏版)》请在冰豆网上搜索。

梁友栋Barsky直线裁剪算法计算机图形学课程设计样本Word格式文档下载.docx

1)巩固和实践计算机图形学课程中理论和算法;

2)学习体现计算机图形学算法技巧;

3)培养认真学习、积极摸索精神。

总体规定:

策划、设计并实现一种可以充分体现图形学算法演示系统,界面规定美观大方,能清晰地演示算法执行每一种环节。

开发环境:

ViusalC++6.0,VC或其她你以为比较熟悉环境。

1.2内容与规定

实验分为五项内容。

1.2.1直线生成

内容:

用Bresenham算法画直线

规定:

1)鼠标移动时,显示鼠标当前位置

2)显示鉴别式计算过程和下一点选取方略

3)记录生成点坐标

4)图形生成过程可以重复进行

1.2.2圆弧生成

用Bresenham算法画圆

5)橡皮筋技术实现

1.2.3线段裁剪

用梁友栋-Barsky算法进行线段裁剪

1)对于线段裁剪,线段被窗口四条边裁剪过程要显示出来

2)用橡皮筋形式输入剪裁线段

1.2.4多边形裁剪

用Sutherland-Hodgman算法进行多边形裁剪

1)裁剪过程需先输入一多边形,然后用窗口四边裁剪过程中要显示顶点增删过程。

1.2.5综合

把前四次实验内容整合到一起

第2章总体设计

2.1Bresenham算法画直线

2.1.1Bresenham算法画直线理论基本

计算机是如何画直线?

简朴来说,就是过各行各列像素中心构造一组虚拟网格线,按直线从起点到终点顺序计算各直线与歌垂直网格线交点,然后拟定各列像素中与此交点近来像素。

真实直线是持续,但咱们计算机显示精度有限,不也许真正显示持续直线,于是咱们用一系列离散化后点(像素)来近似体现这条直线。

2.1.2Bresenham算法画直线原理

接下来问题就是如何尽量高效地找到这些离散点,Bresenham直线算法就是一种非常不错算法。

Bresenham直线算法是用来描绘由两点所决定直线算法,它会算出一条线段在n维光栅上最接近点。

这个算法只会用到较为迅速整数加法、减法和位元移位,惯用于绘制电脑画面中直线。

是计算机图形学中最先发展出来算法。

这个算法流程图如下:

  

可以看到,算法其实只考虑了斜率在0~1之间直线,也就是与x轴夹角在0度到45度直线。

只要解决了此类直线画法,其他角度直线绘制所有可以通过简朴坐标变换来实现。

2.2Bresenham算法画圆

2.2.1Bresenham算法画圆理论基本

Bresenham画圆算法与Bresenham直线算法同样,其基本办法是运用鉴别变量来判断选取近来像素点,鉴别变量数值仅仅用某些加、减和移位运算就可以计算出来。

为了简便起见,考虑一种圆心在坐标原点圆,并且只计算八分圆周上点,别的圆周上点运用对称性就可得到。

为什么只计算八分圆周上点就可以了呢?

和上面直线算法类似,圆也有一种“八对称性”,如下图所示。

显然,咱们只需要懂得了圆上一种点坐标(x,y),运用八对称性,咱们立即就能得到此外七个对称点坐标。

2.2.2Bresenham算法画圆原理

和直线算法类似,Bresenham画圆算法也是用一系列离散点来近似描述一种圆,如下图。

Bresenham画圆算法流程图如下。

可以看到,与画线算法相比,画圆循环中用到了整数乘法,相对复杂了某些。

2.3梁友栋-Barsky算法进行线段裁剪

2.3.1梁友栋-Barsky算法进行线段裁剪基本原理

咱们懂得,一条两端点为P1(x1,y1)、P2(x2,y2)线段可以用参数方程形式表达:

x=x1+u·

(x2-x1)=x1+u·

Δx,y=y1+u·

(y2-y1)=y1+u·

Δy 式中,Δx=x2-x1,Δy=y2-y1,参数u在0~1之间取值,P(x,y)代表了该线段上一种点,其值由参数u拟定,由公式可知,当u=0时,该点为P1(x1,y1),当u=1时,该点为P2(x2,y2)。

如果点P(x,y)位于由坐标(xwmin,ywmin)和(xwmax,ywmax)所拟定窗口内,那么下式成立:

xwmin≤x1+u·

Δx≤xwmax,ywmin≤y1+u·

Δy≤ywmax

这四个不等式可以表达为:

pk≤qk,k=1,2,3,4

其中,p、q定义为p1=-Δx,q1=x1-xwmin

p2=Δx,q2=xwmax-x1

p3=-Δy,q3=y1-ywmin

p4=Δy,q4=ywmax-y1

可以懂得:

任何平行于窗口某边界直线,其pk=0,k值相应于相应边界(k=1,2,3,4相应于左、右、下、上边界)。

如果还满足qk<

0,则线段完全在边界外,应舍弃该线段。

如果pk=0并且qk≥0,则线段平行于窗口某边界并在窗口内,见图中所示。

1、当pk<

0时,线段从裁剪边界延长线外部延伸到内部;

2、当pk>

0时,线段从裁剪边界延长线内部延伸到外部;

例如,当Δx≥0时,对于左边界p1<

0(p1=-Δx),线段从左边界外部到内部;

对于右边界p2>

0(p2=Δx),线段从右边界内部到外部。

当Δy<

0时,对于下边界p3>

0(p3=-Δy),线段从下边界内部到外部;

对于上边界p4<

0(p4=Δy),线段从上边界外部到内部。

当pK≠0时,可以计算出参数u值,它相应于无限延伸直线与延伸窗口边界k交点,即:

对于每条直线,可以计算出参数u1和u2,该值定义了位于窗口内线段某些:

1、u1值由线段从外到内遇到矩形边界所决定(pk<

0),对这些边界计算rk=qk/pk,u1取0和各个r值之中最大值。

2、u2值由线段从内到外遇到矩形边界所决定(pk>

0),对这些边界计算rk=qk/pk,u2取0和各个r值之中最小值。

3、如果u1>

u2,则线段完全落在裁剪窗口之外,应当被舍弃;

否则,被裁剪线段端点可以由u1和u2计算出来。

2.4Sutherland-Hodgman算法进行多边形裁剪

2.4.1Sutherland—Hodgman多边形裁剪算法思想

该算法基本思想是每次用窗口一条边界及其延长线来裁剪多边形各边。

多边形普通由它顶点序列来表达,通过裁剪规则针对某条边界裁剪后,成果形成新顶点序列,又留待下条边界进行裁剪,直到窗口所有边界都裁剪完毕,算法形成最后顶点序列,才是成果多边形(它也许构成一种或各种多边形)。

当多边形一种顶点Pi相对于窗口某条边界及其延长线进行剪裁时,不外乎下列四种状况(即裁剪规则):

1、顶点Pi在内侧,前一顶点Pi-1也在内侧,则将Pi纳入新顶点序列;

2、顶点Pi在内侧,前一顶点Pi-1在外侧,则先求交点Q,再将Q、Pi依次纳入新顶点序列;

3、顶点Pi在外侧,前一顶点Pi-1在内侧,则先求交点Q,再将Q纳入新顶点序列;

4、顶点Pi与前一顶点Pi-1均在外侧,则顶点序列中不增长新顶点。

2.4.2点在边界内侧判断办法

为了判断点与否在边界内侧可用坐标比较法和更通用向量叉积符号鉴别法。

1、坐标比较法

将点某个方向分量与边界进行比较。

例如,判断某点与否在下边界内侧,用条件鉴别式:

if(p[i][1]>

=ymin)即可。

2、向量叉积法

为简朴计,测试点表达为P点。

假设窗口边界方向为顺时针,如图中所示,对于其中任一边界向量,从向量起点A向终点B看过去:

如果被测试点P在该边界线右边(即内侧),AB×

AP方向与X-Y平面垂直并指向屏幕里面,即右手坐标系中Z轴负方向。

反过来,如果P在该边界线左边(即外侧),这时AB×

AP方向与X-Y平面垂直并指向屏幕外面,即右手坐标系中Z轴正方向。

设:

点P(x,y)、点A(xA,yA)、点B(xB,yB),向量AB={(xB-xA),(yB-yA)},向量AP={(x-xA),(y-yA)},那么AB×

AP方向可由下式符号来拟定:

V=(x[B]-x[A])*(y-y[A])-(x-x[A])*(y[B]-y[A]))

因而,当V≤0时,P在边界线内侧;

而V>

0时,P在边界线外侧。

2.4.4Sutherland-Hodgeman多边形裁剪算法特点

Sutherland-Hodgeman多边形裁剪算法具备普通性,被裁剪多边形可以是任意凸多边形或凹多边形,裁剪窗口不局限于矩形,可以是任意凸多边形。

上面算法是多边形相对窗口一条边界进行裁剪实现,对于窗口每一条边界依次调用该算法程序,并将前一次裁剪成果多边形作为下一次裁剪时被裁剪多边形,即可得到完整多边形裁剪程序。

第3章详细设计

3.1Bresenham算法画直线

3.1.1Bresenham算法画线算法详细实现过程

1、画点(x1,y2);

dx=x2-x1;

dy=y2-y1;

计算误差初值P1=2dy-dx;

i=1;

2、求直线下一点位置:

xi+1=xi+1;

ifPi>

0则yi+1=yi+1;

否则yi+1=yi;

3、画点(xi+1,yi-1);

4、求下一种误差Pi+1;

0则Pi+1=Pi+2dy-2dx;

否则Pi+1=Pi+2dy;

5、i=i+1;

ifi<

dx+1则转2;

否则end。

由上述算法思想编制算法程序。

这个程序合用于所有8个方向直线生成。

程序画出一条端点为(x1,y1)和(x2,y2)直线。

其中变量含义是:

P是误差;

const1和const2,是误差逐点变化量;

inc是y单位递变量,值为1或-1;

tmp是用作象限变换时暂时变量。

程序以判断|dx|>

|dy|为分支,并分别将2a,3a象限直线和3b,4b象限直线变换到1a,4a和2b,1b方向去,以求得程序解决简洁。

3.2Bresenham算法画圆

3.2.1Bresenham算法画圆核心代码

依照Bresenham算法思想编写程序代码,在Bresenham算法画线基本上画圆,程序代码如下:

voidBresenhamCircle(intx0,inty0,intR)//,intcolor)

{intx,y,d;

x=0;

y=R;

d=3-2*R;

while(x<

y){glColor3f(0.0f,1.0f,0.0f);

putpixel(x0+x,y0+y);

putpixel(x0+x,y0-y);

putpixel(x0-x,y0+y);

putpixel(x0-x,y0-y);

putpixel(x0+y,y0+x);

putpixel(x0+y,y0-x);

putpixel(x0-y,y0+x);

putpixel(x0-y,y0-x);

if(d<

0)d=d+4*x+6;

else{d=d+4*(x-y)+10;

y=y-1;

}

x++;

}

3.3梁友栋-Barsky算法进行线段裁剪

3.3.1梁友栋-Barsky算法推导过程

情形一 

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 解决方案 > 学习计划

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1