590 likes | 725 Views
第三章. 基本图形的扫描转换. ◆ 扫描转换的基本概念 ◆ 绘制像素点函数 SetPixel 的用法 ◆ 直线圆和椭圆的中点 Bresenham 原理 ◆ 直线反走样原理. 本章学习目标. 3.1 直线的扫描转换 3.2 圆的扫描转换 3.3 椭圆的扫描转换 3.4 反走样算法 3.6 本章小结 3.7 习题. 本章内容. 3.1.1 算法原理 3.1.2 构造中点偏差判别式 3.1.3 递推公式. 3.1 直线的扫描转换.
E N D
第三章 基本图形的扫描转换
◆扫描转换的基本概念 ◆绘制像素点函数SetPixel的用法 ◆直线圆和椭圆的中点Bresenham原理 ◆直线反走样原理 本章学习目标
3.1 直线的扫描转换 3.2 圆的扫描转换 3.3 椭圆的扫描转换 3.4 反走样算法 3.6 本章小结 3.7 习题 本章内容
3.1.1 算法原理 3.1.2 构造中点偏差判别式 3.1.3 递推公式 3.1 直线的扫描转换
直线的中点Bresenham算法的原理:每次在主位移方向上走一步,另一个方向上走不走步取决于中点偏差判别式的值。 给定理想直线的起点坐标为P0(x0,y0),终点坐标为P1(x1,y1),则直线的隐函数方程为: 3.1.1 算法原理 (3-1) 其中,直线的斜率: 直线水平方向位移 : 直线垂直方向位移 :
理想直线将平面划分成三个区域: 对于直线上的点,F(x,y)=0; 对于直线上方的点,F(x,y)>0; 对于直线下方的点,F(x,y)<0。 假设直线的斜率为0≤k≤1,则 ,所以确定x方向为主位移方向。 按照Bresenham原理,x方向上每次加1,y方向上加不加1取决于中点偏差判别式的值。
假定直线的当前点是 ,沿主位移x方向走一步,下一点只能在 和 两点中选取。和的中点为 ,如图3-2所示。显然,若中点M在理想直线的下方,则 点距离直线近,点亮 ;否则点亮。
F(x,y)>0 Pu(xi+1,yi+1) F(x,y)=0 P(xi,yi) Pd(xi+1,yi) F(x,y)<0 直线中点Bresenham算法原理
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在直线的下方,Pu点离直线距离近,下一像素点应点亮Pu,即y方向上走一步; 当d>0时,中点M在直线的上方,Pd点离直线距离近,下一像素点应点亮Pd,即y方向上不走步; 当d=0时,中点M在直线上, Pu、Pd与直线的距离相等,点亮Pu或Pd均可,约定取Pd。 (3-3)
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 中点偏差判别式的递推
(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.2.1 算法原理 圆心在原点、半径为R的圆方程的隐函数表达式为: (3-7) 圆将平面划分成三个区域:对于圆上的点,F(x,y)=0;对于圆外的点,F(x,y)>0;对于圆内的点,F(x,y)<0。
y x=y x=-y P(-x,y) P(x,y) P(-y,x) P(y,x) x P(-y,-x) P(y,-x) P(x,-y) P(-x,-y) 圆的对称性
本算法只考虑图3-6所示阴影部分的45°圆弧,即第一象限内 的1/8圆弧。 此时中点Bresenham算法要从 (0.R)到( )顺时针确定最佳逼近于该段圆弧的像素点集。 中点Bresenham算法的原理简化为:x方向上每次加1,y方向上减不减1取决于中点偏差判别式的值。 假定圆当前点是P(xi,yi),下一点只能在Pu(xi+1,yi)和Pd(xi+1,yi-1)中选取,如图3-7所示。Pu和Pd的中点为M(xi+1,yi-0.5)显然,若M点在理想圆弧的下方,则Pu点离圆弧近,点亮Pu;否则应点亮Pd。
y Pu(xi+1,yi) P(xi,yi) M(xi+1,yi-0.5) Pd(xi+1,yi-1) 圆中点Bresenham算法原理
3.2.2 构造中点偏差判别式 从P(xi,yi)开始,为了进行下一像素点的选取,需将Pu和Pd的中点M(xi+1,yi-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.中点偏差判别式的递推公式 现在如果考虑主位移方向再走一步,应该选择哪个中点代入中点偏差判别式以决定下一步应该点亮的像素,分两种情况讨论。
⑴当d<0时,下一步的中点坐标为: M(xi+2,yi-0.5)。 所以下一步中点偏差判别式为: (3-11) ⑵当d≥0时,下一步的中点坐标为: M(xi+2,yi-1.5)。 所以下一步中点偏差判别式为: (3-12)
P(xi,yi) M(x i+1,y i-0.5) M(x i+2,y i-1.5) M(x i+2,y i-0.5) M(x i+1,y i-0.5) d≥0 d<0 中点偏差判别式的递推
2.中点偏差判别式的初始值 圆的起点为P0(0,R),x为主位移方向。因此,第一个中点是(1,R-0.5),对应的d的初始值为: (3-13)
3.3.1 原理 3.3.2 构造上半部分Ⅰ中点偏差判别式 3.3.3 上半部分Ⅰ的递推公式 3.3.4 构造Ⅱ中点偏差判别式 3.3.5 下半部分Ⅱ的递推公式 3.3 椭圆的扫描转换
本节主要讲解顺时针绘制1/4椭圆的中点Bresenham算法原理。 F(x,y)>0 理想椭圆 F(x,y)=0 F(x,y)<0 图3-9 椭圆的扫描转换
3.3.1 原理 圆心在原点、长半轴为a、短半轴为b的椭圆方程的隐函数表达式为: (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的阴影部分Ⅰ和Ⅱ所示,根据对称性就可绘制出整个椭圆,这称为四分法绘制椭圆算法。已知第一象限内的点考虑到椭圆对称性,可以用对称轴x=0,y=0,把椭圆分成4等份。只要绘制出第一象限内1/4椭圆弧,如图3-10的阴影部分Ⅰ和Ⅱ所示,根据对称性就可绘制出整个椭圆,这称为四分法绘制椭圆算法。已知第一象限内的点 P(x,y),可以顺时针得到另外3个对称点:P(x,-y),P(-x,-y),P(-x,y)。 y P(-x,y) P(x,y) P(-x,-y) P(x,-y) 图3-10 椭圆的对称性
在处理第一象限的1/4椭圆弧时,进一步以法矢量两个分量相等的点把它分为两部分,上半部分Ⅰ和下半部分Ⅱ。该椭圆上一点P(x,y)处的法矢量为:在处理第一象限的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) Pu Pd Ⅰ Pr Pl Ⅱ B(a,0) 图3-12椭圆中点Bresenham算法原理
先考虑图3-12所示部分Ⅰ的AC段椭圆弧。此时中Bresenham画椭圆算法要从A(0,b)到( , )顺时针确定最佳逼近于该段椭圆弧的像素点集。 由于x方向为主位移方向,假定当前点是P(xi,yi),下一步只能在正右方的像素Pu(xi+1,yi)和右下方的像素Pd(xi+1,yi-1)中选取。
再考虑图3-12所示部分CB段椭圆弧。此时中Bresenham画椭圆算法要从C( , )到B(a,0)顺时针确定最佳逼近于该段椭圆弧像素点集。 由于y方向为主位移方向,假定当前点是P(xi,yi),下一步只能在正下方像素Pl(xi,yi-1)和右下方的像素Pr(xi+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) 因此, Pu(xi+1,yi) P(xi,yi) M(xi+1,yi-0.5) Pd(xi+1,yi-1) 图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所示,分两种情况讨论。 ⑴当d1<0时,下一步的中点坐标为: M(xi+2,yi-0.5)。所以下一步中点偏差判别式为: (3-18)
⑵当d1≥0时,下一步的中点坐标为:M(xi+2,yi-1.5)。所以下一步中点偏差判别式为:⑵当d1≥0时,下一步的中点坐标为:M(xi+2,yi-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) Pl(xi,yi-1) Pr(xi+1, yi-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) Pl(xi,yi-1) Pd(xi+1,yi-1)= Pr(xi+1,yi-1) 图3-17 下半部分的初值
3.4反走样算法 考虑将偏差e作为加权参数,同时用上下(或左右)两个像素点的颜色来表示交点f的颜色。像素a的颜色为c1=RGB(e×255,e×255,e×255),像素b的颜色为c2 =RGB((1-e)×255,(1-e)×255,(1-e)×255),两个像素点颜色的各个相应分量级别之和等于255。 当偏差e越小时,c1的分量e×255值越小,颜色越暗,同时c2的分量(1-e)×255值越大,颜色越亮;反之亦然。用两个像素来表示理想线条上的一个点,并依据两个像素与理想直线的距离而调节其灰度级别,所绘制的线条可以达到视觉上消除阶梯的效果。
距离理想直线0.8个像素远的像素灰度为80% 距离理想直线0.45个像素远的像素灰度为45% 距离理想直线0.1个像素远的像素灰度为10% P1 P2 P3 B 3 2 1 A P6 P5 P4 距离理想直线0.2个像素远的像素灰度为20% 距离理想直线0.9个像素远的像素灰度为90% 距离理想直线0.55个像素远的像素灰度为55%