470 likes | 740 Vues
计算机图形学. 武汉大学电子信息学院 王泉德 qdwang@sohu.com. 第二章 直线. 在光栅显示器的荧光屏上生成一个图形,实质上是往帧缓存寄存器的相应单元中填入数据。 计算机生成图形时,需要绘制大量的直线,设计快速有效的直线绘制算法意义重大。 一般来讲,水平、垂直直线和对角线能准确地画出,但要准确绘制一条斜线并不容易。 在光栅显示器上画( x1, y1 )到( x2, y2 )的直线,实质上是确定最佳逼近直线的象素序列。. 1 、绘制直线的要求. ( 1 )生成的直线要直 选择最靠近直线的象素点来逼近直线。. 理想绘制效果.
E N D
计算机图形学 武汉大学电子信息学院 王泉德 qdwang@sohu.com
第二章 直线 • 在光栅显示器的荧光屏上生成一个图形,实质上是往帧缓存寄存器的相应单元中填入数据。 • 计算机生成图形时,需要绘制大量的直线,设计快速有效的直线绘制算法意义重大。 • 一般来讲,水平、垂直直线和对角线能准确地画出,但要准确绘制一条斜线并不容易。 • 在光栅显示器上画(x1, y1)到(x2, y2)的直线,实质上是确定最佳逼近直线的象素序列。
1、绘制直线的要求 (1)生成的直线要直 选择最靠近直线的象素点来逼近直线。 理想绘制效果 实际绘制效果
(2)起点和终点要准确: 在绘制直线的过程中由于受精度的影响,直线的终点与原终点有一个累积误差,导致直线的终点不准。
(3)直线的粗细要均匀 由于选点不均匀,造成直线粗细不均匀,直观上反映出直线的亮度不均匀。
(4)直线宽度应该与线段的长度和斜率无关:要取得均匀的线段宽度,应该保持每单位长度的点数是常数。(4)直线宽度应该与线段的长度和斜率无关:要取得均匀的线段宽度,应该保持每单位长度的点数是常数。 (5)显示线段的速度应快:直线的绘制是生成计算机图形的基础,其绘制速度直接影响到计算机图形生成的效率,常采用硬件来实现。
2、直线的方程 直线的点斜式方程为: (1) 若其始坐标和终点坐标分别为: 则斜率为 (2) 截距为 (3) 对任何沿直线给定的x的增量△x,对应的y增量△y: △y﹦m·△x 同样,对应于y的增量△y,x的增量△x为: △x﹦(1/m)△y 直线的绘制算法以直线方程(1)、(2)和(3)式为基础。
3、 逐点比较法 (1)算法的基本思想: 在绘制直线的过程中,每绘制一个点,就与原直线进行比较,根据比较的结果决定下一步的走向,这样一步一步逼近直线。保证要绘制的点尽可能的靠近直线而不发生远离直线的趋向。
K2 K1 计算当前点偏差:=tg-tg • (2)绘制思路 • 由当前点到下一个点的走法是只在X方向或Y 方向走一步。 1) =0,点在直线上; 2) >0,点在直线上方,下一步走X方向; 3) <0,点在直线下方,下一步走Y方向。
假定起点为坐标原点偏差计算公式为: 可以简化为 根据 计算出偏差,然后确定下一步的走向。 初始: 则 =0; (7,5) 第一步: A 第二步: (0,0)
偏差递推公式 偏差计算公式为: 1) 时,走X方向一步,即 2) 时,走Y方向一步,即
以上讨论的是起点为原点,X为最大步长方向的情况,对于起点是任意点,最大步长方向为其他情况下的绘制直线的偏差计算和偏差判别,可类似推导。以上讨论的是起点为原点,X为最大步长方向的情况,对于起点是任意点,最大步长方向为其他情况下的绘制直线的偏差计算和偏差判别,可类似推导。 • 判别终点的方法:设立计数器,计数取X或Y方向的最大增量值(计长方向),在计长方向每走一步,计数器减1,只到计数器值为零为止。
2、DDA算法(Digital Differential Analyzer) DDA算法是建立在微分方程的基础上。 由 到 的直线段满足的微分方程为:
因此有 则有 令 有
DDA绘制的直线 1/15;
DDA绘制直线的算法 • if |xb-xa|≤|yb-ya| then计算直线在y方向上的增量:length=|yb-ya| • else 计算直线在x方向上的增量:length=|xb-xa| • 计算x方向的单位增量:dx=(xb-xa)/length • 计算y方向的单位增量:dy=(yb-ya)/length • 置初值:x=xa,y=ya • for i=1 to length do begin • 输出点(trunc(x), trunc(y)) • 计算下一个点坐标 x=x+dx,y=y+dy end • end of algorithm
3、 Bresenham算法 算法的基本思想:每次迭代在增量最大方向上走一步, 另一方向上是否也走,取决于计算出来的点与直线上的点 的误差,根据误差决定是否走一步。即x方向的步长总是1(斜率小于1的情况), y方向是否有变化,取决于直线的理论值与假设点之间的误差值大小。例如取X方向为最大增量方向,则有: 其中 <1;
yi+1 yi 绘制的直线时点的选取
偏差计算 yi+1 yi 设偏差为 当 时,计算的点(实际直线上的点)在 中点的上方,取 当 < 0 时,计算的点(实际直线上的点)在 中点的下方,取 整理后,有
偏差的递推关系 误差 因为 有 偏差初值0=m-0.5
将乘以2x记为﹦2x,则同有相同的符号,根据的符号确定象素点的过程仍然正确。此时偏差的表示式做如下变动: 初始误差项: 0﹦2x0 ﹦ 2y-x; 积累误差 k+1﹦ k﹢m修改为: k+1﹦2xk+1 ﹦2x(k﹢y/x) ﹦2xk﹢2y ﹦k﹢2y; 如果选取上面的象素点,积累误差还要减去1,修改为: k+1﹦2x( k+1﹣1) ﹦ k ﹢2y﹣2x
Bresenham直线生成算法描述 • 计算x和y方向的增量:dx=|xb-xa|,dy=|yb-ya| • 计算递推公式的初值d1: d=2dy-dx • 计算两个单位增量:incr1=2dy , incr2=2(dy-dx) • if(xa>xb) then置起点为x=xb,y=yb,置终点为xe=xa, ye=ya • else 置起点为x=xa,y=ya,置终点为xe=xb,ye=yb • 输出起点(x,y) • while(x<xe) do • begin • x=x+1 • if(d<0) then d=d+incr1 • else y=y+1,d=d+incr2 • 输出点(x,y) • end • end of algorithm
总结 前面所介绍的逐点比较法、数值微分法以及 Bresenham算法,它们各有优缺点。因此在使用 不同的图形输出设备时要选用最适合于该设备 的方法,如在绘图仪中多采用逐点比较法,在点 迹技术的显示设备中多用DDA法和Bresenham算法。
4、直线的属性 任何影响图元显示方法的参数称为属性参数。 线段的基本属性有线型、宽度和颜色。 线型:实线、虚线、点线等。 通过设置沿直线路径显示的实线线段的长度和间 距来修改画线算法,产生各种类型的直线。
线宽: 线刷子:沿着生成直线时获得的象素点,移动一把具有一定宽度的“刷子”来实现。斜率k<=1,刷子设置为垂直方向,否则设置为水平方向
线的连接: 线头: 绘制具有宽度的线段,需要对线头进行处理,典型的线头有下述三种 一定宽度的折线段时,线段的接头处会出现缺口,典型的处理方式有:尖头,圆头和方头三种
第三章 二次曲线 圆也是图形系统中常用的元素。圆可以定义为 所有以距离中心位置 为给定值r的点集。 圆的方程为: 利用这个方程,我们可以沿x轴,从 到 以单位步长计算对应的y值,从而得到圆周上每点的位置。 可以利用圆的对称性:可以先绘制八分之一圆弧,再利用对称性绘制整个圆
1、中点画圆算法 考虑圆心在原点的圆。设函数: 故有 (x,y)位于圆边界内 (x,y)位于圆边界上 (x,y)位于圆边界外 对上述函数在每个取点步骤上,对接近圆周的两个象素 点的中点进行测试来决定取点。
考虑一个四分之一圆弧 从x=0到x=y的情况(第一象限的上八分之一圆弧),圆的曲率从0变化到-1,在该段弧上的正x方向取单位步长,并确定每一步更接近圆弧的y的位置。 设已经取的点为 ,决策参数为: 以此来判断下一步 的点如何取。 是 还是 。
故有 中点位于圆边界内 中点位于圆边界上 中点位于圆边界外
递推决策函数 其中 的取值,决定于 的符号。
圆弧上点的对称关系 只画1/8圆,其余点通过对称关系求得。
象限判别 在进行绘制圆弧曲线时,需要考虑轨迹点所在象限的情况, 因此需要进行象限的判别。对于在坐标轴上的点,需要根 据绘制圆的方向来决定。 B C A D
2、Bresenham算法 仍然考虑圆心在原点的一个第一象限的圆弧 。 对于圆弧上的点p(x, y),其下一个可选择的点如图。
圆弧上点与该二点之间的关系 • H、D全在圆外; • H在圆外, D在圆内; • H在圆外, D在圆上; • H、D全在圆内; 可以计算出这三点到圆心的距离与半径的差:
分析: 1)当 时,圆弧在D的上方,可以取的点是H或D, 只要看H和D两个点,哪个与圆弧的距离近。 设: 表示了H和D点到圆弧的距离之差。 时,H点距离圆弧近,H为可取的下一个点。 当 时,D点距离圆弧近,D为可取的下一个点。 时,H和D点均为可取的下一个点。
2)当 时,圆弧在D的下方,可以取的点是D或V,只要看D和V两个点,哪个与圆弧的距离近。设: 时,V点距离圆弧近, V为可取的下一个点。 当 时,D点距离圆弧近,D为可取的下一个点。 时,V和D点均为可取的下一个点。 3) 当 时,D点在圆上,取D点。
3、多边形逼近法 考虑绘制圆心在(xc, yc),半径为r的圆,一个第一象限的圆弧。对于内接正多边形顶点Pi(xi, yi),其幅角为i,则: 下一个顶点Pi+1坐标为: 只需要计算一次sin(),cos(),就可以递推计算其他顶点,计算一个顶点只需四次乘法。
3、二次曲线参数拟合法 研究二次曲线的参数方程以及通过已知的型值点构造 二次曲线的参数拟合方法。 二次曲线的参数方程为: 其中 是常数向量, 是常数,则r(t) 表示了二次曲线的轨迹。
构造二次曲线 已知二次曲线上的三个型值点 ,当t=0时,过 点,且与 相切,当t=1时,过 点,且与 相切。根据已知条件,可以建立方程:
分类 1)抛物线 2)双曲线 3)椭圆弧