计算机图形学课程设计
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
计算机图形学课程结业设计简单图形的生成及二维裁剪
简单图形的生成
现在的计算机能够生成各种复杂的图形,但无论其多么复杂,它都是由一些基本图形组合而成的。在此我们将讨论简单图形中直线、圆的生成。
1. 直线的生成
直线是点的集合,几何学中的一条直线是由两点决定,直线在数学上可以有多种表示方法,而在计算机图形学里,直线是由离散的像素点逼近理想直线段的点的集合。数学上的直线是没有宽度的,而计算机图形学中显示出的直线的宽度与像素点的大小有关,一个像素宽的直线的线粗为像素的边长。由计算机生成的图形中有大量的直线段,而且曲线也是由一系列短直线段逼近生成的。因此,研究直线生成的方法是计算机图形学的基本问题之一。
对计算机生成直线的一般要求是:线段端点的位置要准确;构成线段的像素点的集合应尽可能分布均匀,其密度应该与线段的方向及长度无关;线段生成的速度要快。生成直线的算法有多种,这里仅介绍DDA 算法。
该直线生成算法称为数值微分算法(Digital Differential Analyzer 简称DDA )。它是一种根据直线的微分方程来产生直线的方法。
设直线的起点坐标为),(s s y x ,终点坐标为),(e e y x ,则
=dx dy k x
y
x x y y s e s e =∆∆=-- (3-1)
k 是直线的斜率。
可通过计算x 方向的增量x ∆引起y 的改变来生成直线 由y y y i i ∆+=+1(i y 为直线上某步的初值) 则 +
=+i i y y 1x x x y y ∆⋅--1
21
2 (3-2)
也可通过计算由y 方向的增量y ∆引起x 的改变来生成直线 若设 x x x i i ∆+=+1 则由式(3-1)可得
y y y x x x x i i ∆⋅--+
=+1
21
21 (3-3)
式 (3-2)和(3-3)是递推的。
本算法的基本思想是:选定12x x -和12y y -中较大者作为步进方向。假设12x x -较大,取该方向上一个像素单位长,即x 每次递增1(一个像素),然后利用(3-2)式计算相应的y 值,把每次计算出的(11,++i i y x )经取整后顺序输出到显示器,则得光栅化后的直线。
下面给出简单DDA 算法,选择x ∆和y ∆中较大者为一个像素单位,其相应方向的增
量为1,具体算法如下:
DDA 算法是根据直线的斜率来计算出下一个
y 值,经取整以后确定下一个像素点,因为进行取整运算,故难以避免所取像素点偏离实际直线的某一侧。
2. 圆的生成
由于圆是图形和图像中经常使用的元素,因此在大多数图形软件中都包含有生成圆和圆弧的过程。也会提供一个即能显示圆曲线,又能显示椭圆曲线的绘图函数。
1、圆的特性
圆的定义为所有离一中心位置),(c c y x 距离为给定值r 的点集,用如下方程表示:
2
22)()(r y y x x c c =-+- (3-9)
利用这个方程,我们可以沿x 轴从r x c -到
r x c +以单位步长计算对应的y 值来得到圆周上每点
的位置:
)
(2x x r y y c c --±=
(3-10)
((x
但这并非是生成圆的最好方法。这个方法的一个问题是每一步包含很大的计算量。而且所画像素点位置的间距是不一致的,在靠近x 轴的
0和
180处像素点的间距越来越大。当然可以在圆斜率的绝对值大于1后,交换x 和y (即步进y 值,计算x 值)来调整间距。但这样增加了算法所需的计算量和处理过程。
另一种消除不等间距的方法是使用极坐标r 和θ来计算沿圆周的点。以参数极坐标形式表示圆方程可得方程组:
使用上述方法,以固定角度为步长生成显示时,圆就可沿圆周等距点绘制出来。
但这个方法使用了三角函数调用和浮点运算,运算速度太慢。必须寻找那些不需要费时
的三角和浮点运算,而只需作一些简单的整数和判别运算即可确定圆上的像素点集的方法。
考虑到圆的对称性可以减少计算量。只要能生成8分圆,那么圆的其他部分可通过一系列的简单对称变换得到。如图3.4所示,假设已知一个圆心在原点的圆,圆上一点(y x ,),根据对称性可得另外七个8分圆上的对应点为(x y ,),(x y -,),(y x -,),(y x --,),(x y -
-,),(x y ,-),(y x ,-)。因此,只需讨论8分圆的生成算法。
另外,为了方便起见,我们只考虑中心在原点、半径为整数r 的圆 222r y x =+,对于中心不在原点的圆,可先通过平移变换,化为中心在原点的圆,再进行扫描转换,把所得的像素坐标加上一个位移量即可得到所求像素坐标。
2、中点画圆法
考虑中心在原点、半径为r 的圆的第二个8分圆。我们来讨论如何从(0,r )到(2/r ,2/r )顺时针地确定最佳逼近于该圆弧的像素序列。假定当前已确定了圆弧上的一个像素点为),(P P x x P ,那么,下一个像素只能是正右方的),1(1P P y x P +或右下方的
)1,1(2-+P P y x P 。如图3.5所示,其构造函数为:
222),(r y x y x F -+=
对于圆上的点,0),(=y x F ;对于圆外的点,),(y x F >0;而对于圆内的点,),(y x F <0。假设M 是1P 和2P 的中点,即
)5.0,1(-+=P P y x M 。那么,当
)(M F <0时,M 在圆内,这说明1P 距离圆弧更
近,应取1P 作为下一像素。而当0)(>M F 时,2P 离圆弧更近,应取2P 。当0)(=M F 时,在1P 与2P 之中随便取一个即可,我们约定取2P 。
与中点画线法一样,构造判别式:
)5.0,1()(-+==P P y x F M F d (3-12)
θcos r x x c +=
θrsim y y c +=
(3-11)
图3.5 中点画圆法示意图