460 likes | 649 Views
本章内容. 3.1 直线的扫描转换 3.2 圆的扫描转换 3.3 椭圆的扫描转换 3.6 本章小结 3.7 习题. 3.1 直线的扫描转换. 3.1.1 算法原理 3.1.2 构造中点偏差判别式 3.1.3 递推公式. 3.1.1 算法原理. 直线的中点 Bresenham 算法的原理:每次在主位移方向上走一步,另一个方向上走不走步取决于中点偏差判别式的值。 给定理想直线的起点坐标为 P 0 ( x0 , y0 ),终点坐标为 P 1 ( x1 , y1 ),则直线的隐函数方程为:. ( 3-1 ). 其中,直线的斜率.
E N D
本章内容 • 3.1 直线的扫描转换 • 3.2 圆的扫描转换 • 3.3 椭圆的扫描转换 • 3.6 本章小结 • 3.7 习题
3.1 直线的扫描转换 • 3.1.1 算法原理 • 3.1.2 构造中点偏差判别式 • 3.1.3 递推公式
3.1.1 算法原理 直线的中点Bresenham算法的原理:每次在主位移方向上走一步,另一个方向上走不走步取决于中点偏差判别式的值。 给定理想直线的起点坐标为P0(x0,y0),终点坐标为P1(x1,y1),则直线的隐函数方程为: (3-1) 其中,直线的斜率 直线水平方向位移 直线垂直方向位移
理想直线将平面划分成三个区域:对于直线上的点,F(x,y)=0;对于直线上方的点,F(x,y)>0;对于直线下方的点,F(x,y)<0。假设直线的斜率为0≤k≤1,则,所以确定x方向为主位移方向。按照Bresenham原理,x方向上每次加1,y方向上加不加1取决于中点偏差判别式的值。理想直线将平面划分成三个区域:对于直线上的点,F(x,y)=0;对于直线上方的点,F(x,y)>0;对于直线下方的点,F(x,y)<0。假设直线的斜率为0≤k≤1,则,所以确定x方向为主位移方向。按照Bresenham原理,x方向上每次加1,y方向上加不加1取决于中点偏差判别式的值。 假定直线的当前点是P(xi,yi),沿主位移x方向走一步,下一点只能在Pu(x i+1,y i+1)和Pd(x i+1,yi)两点中选取。Pu和Pd的中点为M(xi+1,yi+0.5),如图3-2所示。显然,若中点M在理想直线的下方,则Pu点距离直线近,点亮Pu;否则点亮Pd。
F(x,y)>0 F(x,y)=0 Pu(x i+1,y i+1) M(x i+1,y i+0.5) P(xi,yi) Pd(x i+1,yi) 图3-2 直线中点Bresenham算法原理 F(x,y)<0
3.1.2 构造中点偏差判别式 从P(xi,yi)点走第一步后,为了进行下一像素点的选取,需将Pu和Pd的中点M(x i+1,y i+0.5)代入隐函数方程,构造中点偏差判别式d。 (3-2) 当d<0时,中点M在直线的下方,Pu点离直线距离近,下一像素点应点亮Pu,即y方向上走一步;当d>0时,中点M在直线的上方,Pd点离直线距离近,下一像素点应点亮Pd,即y方向上不走步;当d=0时,中点M在直线上, Pu、Pd与直线的距离相等,点亮Pu或Pd均可,约定取Pd,如图3-2所示。
3.1.3 递推公式 1.中点偏差判别式的递推公式 在主位移x方向上已走一步的情况下,现在考虑沿主位移方向再走一步,应该选择哪个中点代入中点偏差判别式以决定下一步该点亮的像素,如图3-3所示,分两种情况讨论。 M(xi+2,yi+1.5) M(xi+1,y i+0.5) M(xi+1,yi+0.5) M(xi+2,yi+0.5) P(xi,yi) P(xi,yi) d≥0 d<0 图3-3 中点偏差判别式的递推
(1)当d<0时 (3-4) ⑵当d≥0时 (3-5)
2.中点偏差判别式的初始值 直线的起点坐标为P0(x0,y0),x为主位移方向。因此,第一个中点是(x 0+1,y 0+0.5),相应的d的初始值为: 其中,因为(x 0,y 0)在直线上,所以 则: (3-6)
3.2 圆的扫描转换 • 3.2.1 算法原理 • 3.2.2 构造中点偏差判别式 • 3.2.3 递推公式
本节主要讲解仅包含加减操作的顺时针绘制1/8圆的中点Bresenham算法原理。本节主要讲解仅包含加减操作的顺时针绘制1/8圆的中点Bresenham算法原理。 F(x,y)>0 理想圆 F(x,y)=0 F(x,y)<0 图3-4 圆的扫描转换
3.2.1 算法原理 圆心在原点、半径为R的圆方程的隐函数表达式为: (3-7) 圆将平面划分成三个区域:对于圆上的点,F(x,y)=0;对于圆外的点,F(x,y)>0;对于圆内的点,F(x,y)<0,如图3-4所示。
事实上,考虑到圆在第一象限内的对称性,本算法可以进一步简化。因为AC段圆弧和CB段圆弧以对称轴x=y完全对称,如图3-6所示,所以可以用四条对称轴x=0,y=0, x=y, x=-y把圆分成8等份。只要绘制出第一象限内的1/8圆弧Ⅰ,根据对称性就可绘制出整圆,这称为八分法画圆算法。假定第一象限内的任意点为P(x,y),可以顺时针确定另外7个点: P(y,x)P(y,-x),P(x,- y ) ,P(-x,-y),P(-y,-x),P(-y,x),P(-x,y)。
x=0 x=y x=-y P(-x,y) P(x,y) P(-y,x) P(y,x) y=0 P(-y,-x) P(y,-x) P(x,-y) P(-x,-y) 图3-6 圆的对称性
本算法只考虑图3-6所示阴影部分的45°圆弧,即第一象限内本算法只考虑图3-6所示阴影部分的45°圆弧,即第一象限内 的1/8圆弧。 此时中点Bresenham算法要从 (0,R)到( )顺时针确定最佳逼近于该段圆弧的像素点集。 从前述讨论知道,x方向为主位移方 向,因此中点Bresenham算法的原理简化为:x方向上每次加1,y方向上减不减1取决于中点偏差判别式的值。 假定圆当前点是P(xi,yi),下一点只能在Pu(x i+1,y i)和Pd(x i+1,yi-1)中选取,如图3-7所示。Pu和Pd的中点为M(x i+1,y i-0.5)显然,若M点在理想圆弧的下方,则Pu点离圆弧近,点亮Pu;否则应点亮Pd。
y P(xi,yi) Pu(x i+1,y i) M(x i+1,y i-0.5) Pd(x i+1,yi-1) x 图3-7 圆中点Bresenham算法原理
3.2.2 构造中点偏差判别式 从P(xi,yi)开始,为了进行下一像素点的选取,需将Pu和Pd的中点M(x i+1,y i-0.5)代入隐函数,构造中点偏差判别式: (3-9) 当d<0时,中点M在圆内,下一像素点应点亮Pu,即y方向不退步;当d>0时,中点M在圆外,下一像素点应点亮Pd,即y方向退一步;当d=0时,中点M在圆上, Pu、Pd和圆的距离相等,点亮Pu或Pd均可,约定取Pd。 因此, (3-10)
3.2.3 递推公式 1.中点偏差判别式的递推公式 现在如果考虑主位移方向再走一步,应该选择哪个中点代入中点偏差判别式以决定下一步应该点亮的像素,如图3-8所示,分两种情况讨论。 ⑴当d<0时,下一步的中点坐标为:M(x i+2,y i-0.5)。 所以下一步中点偏差判别式为: (3-11) ⑵当d≥0时,下一步的中点坐标为:M(x i+2,y i-1.5)。 所以下一步中点偏差判别式为:
(3-12) P(xi,yi) P(xi,yi) M(x i+1,y i-0.5) M(x i+2,y i-0.5) M(x i+1,y i-0.5) M(x i+2,y i-1.5) d≥0 d<0 图3-8 中点偏差判别式的递推 2.中点偏差判别式的初始值 圆的起点为P0(0,R),x为主位移方向。因此,第一个中点是(1,R-0.5),对应的d的初始值为: (3-13)
3.3 椭圆的扫描转换 • 3.3.1 原理 • 3.3.2 构造上半部分Ⅰ中点偏差判别式 • 3.3.3 上半部分Ⅰ的递推公式 • 3.3.4 构造Ⅱ中点偏差判别式 • 3.3.5 下半部分Ⅱ的递推公式
本节主要讲解顺时针绘制1/4椭圆的中点Bresenham算法原理。本节主要讲解顺时针绘制1/4椭圆的中点Bresenham算法原理。 F(x,y)>0 理想椭圆 F(x,y)=0 F(x,y)<0 图3-9 椭圆的扫描转换
圆心在原点、长半轴为a、短半轴为b的椭圆方程的隐函数表达式为:圆心在原点、长半轴为a、短半轴为b的椭圆方程的隐函数表达式为: 3.3.1 原理 (3-14) 椭圆将平面划分成三个区域:对于椭圆上的点,F(x,y)=0;对于椭圆外的点,F(x,y)>0;对于椭圆内的点,F(x,y)<0,如图3-9所示。 考虑到椭圆对称性,可以用对称轴x=0,y=0,把椭圆分成4等份。只要绘制出第一象限内1/4椭圆弧,如图3-10的阴影部分Ⅰ和Ⅱ所示,根据对称性就可绘制出整个椭圆,这称为四分法绘制椭圆算法。已知第一象限内的点P(x,y),可以顺时针得到另外3个对称点:P(x,-y),P(-x,-y),P(-x,y)。
P(-x,y) y P(x,y) x P(-x,-y) P(x,-y) 图3-10 椭圆的对称性 在处理第一象限的1/4椭圆弧时,进一步以法矢量两个分量相等的点把它分为两部分,上半部分Ⅰ和下半部分Ⅱ。该椭圆上一点P(x,y)处的法矢量为: (3-15) 式中,i和j是沿x轴向和沿y轴向的单位矢量。
在图3-11所示的部分Ⅰ的AC椭圆弧段,法矢量的x向分量小于y向分量,斜率k处处满足|k|<1,|△x|>|△y|,所以x方向为主位移方向;在C点,法矢量的x向分量等于y向分量,斜率k满足k=-1,|△x|=|△y|;在部分Ⅱ的CB椭圆弧段,法矢量x向分量大于y向分量,斜率k处处满足|k|>1,|△y|>|△x|,所以y方向为主位移方向。在图3-11所示的部分Ⅰ的AC椭圆弧段,法矢量的x向分量小于y向分量,斜率k处处满足|k|<1,|△x|>|△y|,所以x方向为主位移方向;在C点,法矢量的x向分量等于y向分量,斜率k满足k=-1,|△x|=|△y|;在部分Ⅱ的CB椭圆弧段,法矢量x向分量大于y向分量,斜率k处处满足|k|>1,|△y|>|△x|,所以y方向为主位移方向。 y向分量 法矢量 A(0,b) C( , ) x向分量 B(a,0) 图3-11 椭圆的法矢量
椭圆的中点Bresenham算法的原理:在部分Ⅰ:每次在主位移x方向上走一步,y方向上退不退步取决于中点偏差判别式的值;在部分Ⅱ:每次在主位移方向y上退一步,x方向上走不走步取决于中点偏差判别式的值。椭圆的中点Bresenham算法的原理:在部分Ⅰ:每次在主位移x方向上走一步,y方向上退不退步取决于中点偏差判别式的值;在部分Ⅱ:每次在主位移方向y上退一步,x方向上走不走步取决于中点偏差判别式的值。 A(0,b) P Pu Pd P Ⅰ Pl Pr Ⅱ B(a,0) 图3-12椭圆中点Bresenham算法原理
先考虑图3-12所示部分Ⅰ的AC段椭圆弧。此时中Bresenham画椭圆算法要从A(0,b)到( , )顺时针确定顺时针确定最佳逼近于该段椭圆弧的像素点集。由于x方向为主位移方向,假定当前点是P(xi,yi),下一步只能在正右方的像素Pu(x i+1,y i)和右下方的像素Pd(x i+1,yi-1)中选取。 , , 再考虑图3-12所示部分CB段椭圆弧。此时中Bresenham画椭圆算法要从C( , )到B(a,0)顺时针确定最佳逼近于该段椭圆弧像素点集。由于y方向为主位移方向,假定当前点是P(xi,yi),下一步只能在正下方像素Pl(x i,y i-1)和右下方的像素Pr(x i+1,yi-1)中选取。
3.3.2 构造上半部分Ⅰ中点偏差判别式 在上半部分Ⅰ,x方向每次加1,y方向上减不减1取决于中点偏差判别式的值。从P(xi,yi)走第一步,为了选取下一像素点的,需将Pu(x i+1,yi)和Pd(x i+1,yi-1)的中点M(x i+1,y i-0.5)代入隐函数,构造中点偏差判别式: (3-16) 当d1<0时,中点M在椭圆内,下一像素点应点亮Pu,即y方向不退步;当d>0时,中点M在椭圆外,下一像素点应点亮Pd,即y方向退一步;当d=0时,中点M在椭圆上,Pu、Pd和椭圆的距离相等,点亮Pu或Pd均可,约定取Pd,如图3-13所示。
(3-17) 因此, y Pu(x i+1,y i) P(xi,yi) M(x i+1,y i-0.5) Pd(x i+1,yi-1) x 图3-13 上半部分像素点的选取
3.3.3 上半部分Ⅰ的递推公式 图3-13中,为了能够继续判断椭圆上的每个点,需要给出中点偏差判别式d1的递推公式和初始值。 P(xi,yi ) P(xi,yi) M(x i+1,y i-0.5) M(x i+2,y i-0.5) M(x i+1,y i-0.5) M(x i+2,y i-1.5) d1<0 d1≥0 图3-14 上半部分中点偏差判别式的递推 1.中点偏差判别式的递推公式 现在如果考虑主位移方向再走一步,应该选取哪个中点代入
中点偏差判别式以决定应该点亮的像素,如图3-14所示,分两种情况讨论。中点偏差判别式以决定应该点亮的像素,如图3-14所示,分两种情况讨论。 ⑴当d1<0时,下一步的中点坐标为:M(x i+2,y i-0.5)。所以下一步中点偏差判别式为: (3-18) ⑵当d1≥0时,下一步的中点坐标为:M(x i+2,y i-1.5)。所以下一步中点偏差判别式为: (3-19)
2.中点偏差判别式d1的初值 上半部分椭圆的起点为A(0,b),因此,第一个中点是(1,b-0.5),对应的d1的初值为: (3-20)
3.3.4 构造Ⅱ中点偏差判别式 构造中点偏差判别式: (3-21) y P(xi,yi) Pr(x i+1,yi-1) Pl(x i,y i-1) x 图3-15 下半部分像素点的选取
当d2<0时,中点M在椭圆内,下一像素点应点亮Pr,即x方向上走一步;当d2>0时,中点M在椭圆外,下一像素点应点亮Pl,即x方向上不走步;当d2=0时,中点M在椭圆上,Pl、Pr和椭圆的距离相等,点亮Pl或Pr均可,约定取Pl,如图3-15所示。当d2<0时,中点M在椭圆内,下一像素点应点亮Pr,即x方向上走一步;当d2>0时,中点M在椭圆外,下一像素点应点亮Pl,即x方向上不走步;当d2=0时,中点M在椭圆上,Pl、Pr和椭圆的距离相等,点亮Pl或Pr均可,约定取Pl,如图3-15所示。 因此, (3-22)
3.3.5 下半部分Ⅱ的递推公式 1.中点偏差判别式的递推公式 现在如果考虑主位移方向上再走一步,应该选择哪个中点代入中点偏差判别式以决定应该点亮的像素,如图3-16所示,分两种情况讨论。 P(xi,yi) P(xi,yi) M(x i+0.5,y i-1) M(x i+0.5,y i-1) M(x i+1.5,y i-2) M(x i+0.5,y i-2) d2<0 d2≥0 图3-16 下半部分中点偏差判别式的递推
⑴当d2<0时,下一步的中点坐标为:M(x i+1.5,y i-2)。所以下一步中点偏差判别式为: (3-23) ⑵当d2≥0时,下一步的中点坐标为:M(x i+0.5,y i-2)。所以下一步中点偏差判别式为: (3-24)
2.中点偏差判别式d2的初值 由图3-11知道,在上半部分Ⅰ,法矢量的x向分量小于y向分量;在C点,法矢量的x向分量等于y向分量;在下半部分Ⅱ,法矢量的x向分量大于y向分量。由公式3-15知道:x向分量为: y向分量为: 。则对于上半部分椭圆上一点任意P(xi,yi), 如果在其当前中点M(xi+1,yi-0.5)处,满足x向分量小于y 向分量: (3-25) 假定图3-17中P(xi,yi)点是椭圆上半部分Ⅰ的最后一个像素,MⅠ(xi+1,yi-0.5)是用于判断点亮Pu和Pd像素的中点。由于下一像素转入了下半部分Ⅱ,所以其中点改为判断Pl和Pr的中点MⅡ(xi+0.5,yi-1),所以下半部分的初值d20为: (3-26)
P(xi,yi) Pu(xi+1,yi) MⅠ(xi+1,yi-0.5) MⅡ(xi+0.5,yi-1) Pl(xi,yi-1) Pd(xi+1,yi-1)= Pr(xi+1,yi-1) 图3-17 下半部分的初值
3.6 本小结 本章主要讲解了直线、圆和椭圆的中点Bresenham算法原理以及直线的反走样技术。直线、圆和椭圆作为图形基本图元,其生成算法的优劣对整个图形系统的效率至关重要。在像素级生成算法中,中点Bresenham 算法避免了复杂运算,使用了最小的计算量,使单点基本图形生成算法已无优化的余地,已经成为使用最广泛的扫描转换算法。走样是直线光栅化扫描转换的必然结果,只能减轻,不可避免,如何设计直线的反走样算法是计算机图形学的前沿研究课题。
3.7 习题 1.将中点Bresenham画直线算法推广到能绘制任意斜率直线,并编程实现之 。 2.逐个访问像素点绘制直线的算法是今后真实感图形绘制的基础算法。要求将中点Bresenham直线算法修改为起点闭区间,终点开区间的可绘制任意斜率直线的算法,即要达到VC++的MoveTo和LineTo语句绘制直线的效果。 3.圆的方程为 ,试针对该方程编程实现直角坐标画 圆算法。 4.圆的极坐标方程为 ,试按照该方程编程实现 极坐标画圆算法。
5.计算起点坐标为(0,0),终点坐标为(12,7)直线的Bresenham算法每一步坐标值及中点偏差判别式的值并填入下表。 6.给定直线的起点坐标为P0(x0,y0)、终点坐标为P1(x1,y1),容易计算出直线斜率k。假设0≤k≤1,则x方
向为主位移方向,绘制直线的递推公式为: ,这称 为数值微分法(Digital Differential Analyzer,DDA),请编程实现之。提示:DDA算法实质上是对直线斜率进行了四舍五入计算。 7.使用中点Bresenham画圆算法原理,推导第一象限内从 y=0到y=x的逆时针八分法扫描转换算法。要求写出算法原理、中点偏差判别式、递推公式以及偏差判别式的初始值,并编程实现。
8.旋转的直线能有效表达反走样效果,试编程在屏幕的左侧绘制基于中点Bresenham算法的普通旋转直线,在屏幕右侧绘制基于距离加权反走样算法的反走样旋转直线。图形结果如下图所示。
9.请使用GetCurrentTime()函数读取系统时间,对时钟指针进行反走样,下图的左侧为走样时钟,右侧为反走样时钟。 9.请使用GetCurrentTime()函数读取系统时间,对时钟指针进行反走样,下图的左侧为走样时钟,右侧为反走样时钟。
10.给定直线的起点颜色(如红色)和终点颜色(如黑色)不同,请使用中点Bresenham算法绘制任意斜率的颜色渐变直线,效果如图3-31所示。 黑色 红色