第四章 基本图形生成算法 ( 一 )

59
2004 Dept. of Computer Science and Engineer 2022.06.08 第第第 第第第第第第第第 ( )

description

第四章 基本图形生成算法 ( 一 ). 基本图形生成算法. 图形的扫描转换 :确定象素几何与颜色,用于显示图形的过程; 本章讨论 基本图形的扫描转换 问题: 点、直线、圆、椭圆的扫描转换; 二维图形(多边形)的填充; 字符的表示及输入、输出; 图形的裁剪和反走样; 图形扫描转换步骤: 1 )确定有关象素; 2 )用图形的颜色或其它属性,对象素进行某种写操作; 图元的生成 : 完成图元的参数表示形式(由图形软件包的使用者指定)到点阵表示形式(光栅显示系统刷新时所需的表示形式)的转换。也称扫描转换图元。. 点的扫描转换. - PowerPoint PPT Presentation

Transcript of 第四章 基本图形生成算法 ( 一 )

Page 1: 第四章 基本图形生成算法  ( 一 )

© 2004 Dept. of Computer Science and Engineer 2023.04.20

第四章基本图形生成算法 (一 )

Page 2: 第四章 基本图形生成算法  ( 一 )

© 2004 Dept. of Computer Science and Engineer 2023.04.20 2 / 59

基本图形生成算法图形的扫描转换:确定象素几何与颜色,用于显示图形的过程;本章讨论基本图形的扫描转换问题:

- 点、直线、圆、椭圆的扫描转换;- 二维图形(多边形)的填充;- 字符的表示及输入、输出;- 图形的裁剪和反走样;

图形扫描转换步骤:- 1 )确定有关象素;- 2 )用图形的颜色或其它属性,对象素进行某种写操作;

图元的生成 :完成图元的参数表示形式(由图形软件包的使用者指定)到点阵表示形式(光栅显示系统刷新时所需的表示形式)的转换。也称扫描转换图元。

Page 3: 第四章 基本图形生成算法  ( 一 )

© 2004 Dept. of Computer Science and Engineer 2023.04.20 3 / 59

点的扫描转换定义:将图形区域上的数学点 (x,y)->(x’,y’) 的象素点;扫描转换方法:

- 方法一: X’=Floor(x), y’=Floor(y)

取 x,y的整数部分作为 x’,y’

例: P1(1.7,0.8)->(1,0); P2(2.2,1.3),P3(2.8,1.9)->(2,1)

- 方法二: X’=Floor(X+0.5),Y’=Floor(Y+0.5)

即 (x,y)所在的坐标系统的原点放在象素( 0 , 0 )的中心; 所有满足 X’-0.5≤X<X’+0.5和 Y’-0.5 ≤Y<Y’+0.5的点都映射在象素点 (X’,Y’) 处;

例: P1,p2->(2,1),p3->(3,2)

Page 4: 第四章 基本图形生成算法  ( 一 )

© 2004 Dept. of Computer Science and Engineer 2023.04.20 4 / 59

主要内容:

直线的扫描转换圆与椭圆的扫描算法区域填充线宽与线型的处理字符裁剪反走样

Page 5: 第四章 基本图形生成算法  ( 一 )

© 2004 Dept. of Computer Science and Engineer 2023.04.20 5 / 59

直线的扫描转换

计算机图形学中的一条直线通常指一条线段。直线的扫描转换:确定一组有限象素,显示出来的过程;线段表示方程: y = kx + b (斜截式方程)

- 斜截式方程不适合垂直线;- 水平线、垂直线、对角线(∣ k =1∣ )作为特殊直线考虑;

直线扫描算法:- 直接使用直线方程- 数值微分算法- 中点画线法- Bresenham画线算法

Page 6: 第四章 基本图形生成算法  ( 一 )

© 2004 Dept. of Computer Science and Engineer 2023.04.20 6 / 59

直线的扫描转换-直接使用直线方程

最简单的方法;步骤:

- 1 、将 P1,P2分别转换为象素坐标( x1’,y1’) ,( x2’,y2’) ;

- 2 、设置 k=(y2’-y1’)/(x2’-x1’) 和 b=y1’-kx1’;- 3 、如果∣ k∣≤1,对 (x1’,x2’) 开区间的整数 x 代入方程得到 y -》得到 (x,y);

- 3 、如果∣ k∣>1,对 (y1’,y2’) 开区间的整数 y 代入方程得到 x -》得到 (x,y);

优点:简单缺点:浮点运算(乘法和加法)-》计算复杂;

Page 7: 第四章 基本图形生成算法  ( 一 )

© 2004 Dept. of Computer Science and Engineer 2023.04.20 7 / 59

直线的扫描转换-数值微分算法 (DDA,Digital Differential Analyzer)

Page 8: 第四章 基本图形生成算法  ( 一 )

© 2004 Dept. of Computer Science and Engineer 2023.04.20 8 / 59

复杂度:乘法 + 加法 + 取整

直线的扫描转换-数值微分算法 (DDA,Digital Differential Analyzer)

Page 9: 第四章 基本图形生成算法  ( 一 )

© 2004 Dept. of Computer Science and Engineer 2023.04.20 9 / 59

•优点:比直接用直线方程的方法快:没有浮点乘法;•缺点:求每个连续点时,需要浮点加法;加 0.5舍尾取整,不利于硬件实现;表示长直线时,由于精度限制-》累计误差;

直线的扫描转换-数值微分算法 (DDA,Digital Differential Analyzer)

Page 10: 第四章 基本图形生成算法  ( 一 )

© 2004 Dept. of Computer Science and Engineer 2023.04.20 10 / 59

直线的扫描转换-中点画线法目标:消除 DDA算法中的浮点运算(浮点数取整运算,不利于硬件实现; DDA算法效率低);

原理:- 1 、确定与直线距离最近的点 P ;- 2 、利用点 P 确定下一个点;

条件:同 DDA算法假设斜率:直线段的隐式方程

]1,0[k

的两个端点)y,(x),y,(x 1100

01100110 yx-yxc,x-xb,y-ya:式中0cbyaxy)F(x,

Page 11: 第四章 基本图形生成算法  ( 一 )

© 2004 Dept. of Computer Science and Engineer 2023.04.20 11 / 59

直线的正负划分性

直线上方点: F( x, y)> 0直线下方点 : F( x, y)< 0

直线的扫描转换-中点画线法

Page 12: 第四章 基本图形生成算法  ( 一 )

© 2004 Dept. of Computer Science and Engineer 2023.04.20 12 / 59

问题:判断距直线最近的下一个象素点 构造判别式: d=F(M)=F(Xp+1,Yp+0.5)

由 d > 0 ,< 0 可判定下一个象素 .

如果: d = 0? 任选一个 ,(约定取正右方 P1) ;

P

P2

P1

直线的扫描转换-中点画线法

Page 13: 第四章 基本图形生成算法  ( 一 )

© 2004 Dept. of Computer Science and Engineer 2023.04.20 13 / 59

判定再下一个象素,分两种情形考虑:- 1 )若 d≥0,取正右方象素 P1,再判定下一个象素,由:d1=F(Xp+2,Yp+0.5)=a(Xp+2)+b(Yp+0.5)+c = d + a, d 的增量是 a;

- 2 )若 d < 0 ,取右上方象素 P2,再下一个象素由: d2=F(Xp+2,Yp+1.5)=d + a + b, d的增量为 a + b

P2

PP1

直线的扫描转换-中点画线法

Page 14: 第四章 基本图形生成算法  ( 一 )

© 2004 Dept. of Computer Science and Engineer 2023.04.20 14 / 59

d 的初始值:第一个象素应取左端点( x0,y0)d0 = F(X0+1,Y0+0.5)=F(X0,Y0)+a+0.5b因 (X0,Y0) 在 直 线 上 , F(X0 , Y0)=0, 所以, d0=a+0.5b

d 的增量都是整数,只有初始值包含小数,可以用 2d代替d,以摆脱浮点数 , 2a改写成 a + a。

算法中只有整数变量,不含乘除法,可用硬件实现。程序:见 PP168自习书中 pp168的例子;

直线的扫描转换-中点画线法

Page 15: 第四章 基本图形生成算法  ( 一 )

© 2004 Dept. of Computer Science and Engineer 2023.04.20 15 / 59

直线的扫描转换-Bresenham 画线算法算法基本思想:每次迭代在增量最大方向上均走一步,其方向由增量的正负而定,另一方向上是否也走,取决于计算出来的点与直线上的点的误差,根据误差决定是否走一步。例如取 X 方向为最大增量方向,则有:

绘制直线时点的选取 :

10,,1

1

1

mx

ym

myy

xx

ii

ii 其中:

Page 16: 第四章 基本图形生成算法  ( 一 )

© 2004 Dept. of Computer Science and Engineer 2023.04.20 16 / 59

直线的扫描转换 - Bresenham 画线算法偏差计算:

设偏差为 5.0)( ,11 riii yyx

当 时,计算的点(实际直线上的点)在 中点的上方,取当 < 0 时,计算的点(实际直线上的点)在 中点的下方,取

0)( 1 ix

)( 1ix

1,,1 riri yy

riri yy ,,1

整理后,有

0)(

0)(11

1,

1,,1

1

iri

iriri

ii

xy

xyy

xx

Page 17: 第四章 基本图形生成算法  ( 一 )

© 2004 Dept. of Computer Science and Engineer 2023.04.20 17 / 59

直线的扫描转换 - Bresenham 画线算法偏差的递推关系:

5.0)( ,11 riii yyx误差

因为 myy ii 1

0)()(

0)(1)(

0)(5.0

0)(5.0)1(

5.0

5.0)(

,1

,1

,

,11

ii

ii

irii

irii

rii

riii

xmx

xmx

xmyy

xmyy

ymy

yyx

Page 18: 第四章 基本图形生成算法  ( 一 )

© 2004 Dept. of Computer Science and Engineer 2023.04.20 18 / 59

直线的扫描转换 - Bresenham 画线算法算法优点:

- 快速增量算法;- 要获得准确的数学结果,只需通过整数的加、减法和乘 2 运算;

计算机中乘 2 可以容易的通过算术移位实现;

直线的扫描转换-小结- 前面介绍的数值微分法、中点画线法以及 Bresenham算法,它们各有优缺点。因此在使用不同的图形输设备时要选用最适合于该设备的方法。

Page 19: 第四章 基本图形生成算法  ( 一 )

© 2004 Dept. of Computer Science and Engineer 2023.04.20 19 / 59

直线的扫描转换 - Bresenham 画线算法习题:

- 给出使用中点画线算法画斜率介于 0 到 45度之间的直线所需的步骤。- 解答:

1 、计算初始值: dx=x2-x1; dy = y2 – y1; lnc1=2dy; lnc2 = 2(dy – dx); d = lnc1-dx

2 、设置左下方的端点坐标为( x,y) , 同时将 Xend设为 x 的最大值。如果 dx<0,则 x=x2,y=y2,Xend=x1. 如果 dx>0,则x=x1,y=y1,Xend=x2;

3 、在当前( x , y )坐标画一个点; 4 、判断整条线段是否已经画完,如果 x=Xend,则停止; 5 、计算下一个象素的位置,如果 d<0,那么 d=d+lnc1,如果d>=0,则 d=d+lnc2,且 y=y+1;

6 、增加 x:x=x+1; 7 、在当前的 (x,y)坐标画一个点; 8 、转到步骤 4 ;

Page 20: 第四章 基本图形生成算法  ( 一 )

© 2004 Dept. of Computer Science and Engineer 2023.04.20 20 / 59

主要内容:

直线的扫描转换圆与椭圆的扫描算法多边形的扫描转换区域填充线宽与线型的处理字符裁剪反走样

Page 21: 第四章 基本图形生成算法  ( 一 )

© 2004 Dept. of Computer Science and Engineer 2023.04.20 21 / 59

圆的扫描转换

处理对象:圆心在原点的圆弧圆的八路对称性:每隔 45度对称计算圆上的点;

Page 22: 第四章 基本图形生成算法  ( 一 )

© 2004 Dept. of Computer Science and Engineer 2023.04.20 22 / 59

圆的扫描转换

两种直接离散方法: 离散点 :

离散角度 :

开根,三角函数运算,计算量大,不可取。

)),( ,

22

222

riiiii yxxRyx

Ryx

,(

利用隐函数方程取整

))sin(),cos((

sin

cos

ii RroundRround

Ry

Rx

利用参数方程

Page 23: 第四章 基本图形生成算法  ( 一 )

© 2004 Dept. of Computer Science and Engineer 2023.04.20 23 / 59

圆的扫描转换高效画圆方法:避免三角计算和乘方计算,计算只涉及整数的加减法和乘 2 运算:中点法和 Bresenham 算法;

圆弧的正负划分性0),( 222 RyxyxF

圆弧外的点: F(X, Y)> 0圆弧内的点: F(X, Y)< 0

Page 24: 第四章 基本图形生成算法  ( 一 )

© 2004 Dept. of Computer Science and Engineer 2023.04.20 24 / 59

圆的扫描转换 ( 中点算法 )

生成圆弧的中点算法 : 利用圆的对称性,只须讨论 1/8圆- 考虑对象:第二个八分圆,- 第一象限的八分之一圆弧

P P1

P2

Page 25: 第四章 基本图形生成算法  ( 一 )

© 2004 Dept. of Computer Science and Engineer 2023.04.20 25 / 59

圆的扫描转换 ( 中点算法 )

问题:与直线情形类似 ;圆弧的隐函数: F(X,Y)=X2+Y2-R2=0

切线斜率 k 为 [-1,0]中 点 M=(Xp+1,Yp - 0.5),

当 F(M) < 0 时, M在圆内,说明 P1 距离圆弧更近,取 P1; 当 F(M) > 0 时, P取 P2

P2

P1P

Page 26: 第四章 基本图形生成算法  ( 一 )

© 2004 Dept. of Computer Science and Engineer 2023.04.20 26 / 59

圆的扫描转换 ( 中点算法 )

构造判别式 d=F(M)=F(Xp+1,Yp-0.5)=(Xp+1)2+(Yp-0.5)2-R2

1 )若 d < 0 ,取 P1 ,再下一个象素的判别式为: d1=F(Xp+2,Yp-0.5)=d+2Xp+3,

沿正右方向, d 的增量为 2Xp+3; 2 )若 d≥0,取 P2,再下一个象素的判别式为: d2=F(Xp+2,Yp-1.5)=d+(2Xp+3)+(-2Yp+2) 沿右下方向, d 的增量为 2(Xp-Yp)+5

d 的初始值 ( 在第一个象素 (0,R)处 ) : d0=F(1,R-0.5)=(0+1)×(0+1)+(R-0.5)×(R-0.5)-R×R=1.25-R

算法中有浮点数:用 e=d-0.25代替 d0:少 0.25不改变 d 的符号,也不影响以后的扫描转换过程: d 只在后面计算中整数递增;

Page 27: 第四章 基本图形生成算法  ( 一 )

© 2004 Dept. of Computer Science and Engineer 2023.04.20 27 / 59

圆的扫描转换 ( 中点算法 )

初始化运算 d0 = 1.25 – R 对应于 e0= 1- R 判别式 d < 0 对应于 e < -0.25 又因为: e 的初值 e0为整数,运算过程中的分量也为整数,

故 e 始终为整数所以: e < -0.25 等价于 e < 0

程序见 pp170(完全用整数实现)

Page 28: 第四章 基本图形生成算法  ( 一 )

© 2004 Dept. of Computer Science and Engineer 2023.04.20 28 / 59

圆的扫描转换 (Bresenham 算法 )

为讨论方便,仅考虑圆心在原点,半径为 R的第一象限上的一段圆弧。且取( 0, R)为起点,按顺时针方向 (+x, -y方向 ) 绘制该 1/4圆弧(如图 1 )。

算法原理 :如图 2所示,从当前点亮象素( x,y)出发,按顺时针方向生成圆时,最佳逼近该圆的下一个象素只可能为 H、D、 V 三象素之一。 H、 D、 V中距圆周边界距离最小者,即为所求的象素点; ( x , y)H ( x+1 , y)

D ( x+1 , y-1)V ( x , y-1)•图 2

(0,R)

图 1

Page 29: 第四章 基本图形生成算法  ( 一 )

© 2004 Dept. of Computer Science and Engineer 2023.04.20 29 / 59

圆的扫描转换 (Bresenham 算法 )具体算法:H 、 D 、 V 三点到圆心的距离平方与圆的半径平方差,即为 H 、 D 、 V 到圆弧距离的一种度量: H = (x+1)

2 + y

2 - R

2;

D = (x+1) 2 + (y-1)

2 - R

2; (式 1)

V = x2 + (y-1)

2 - R

2;

为根据这些度量值可确定最佳象素点,首先,将 H 、 D 、 V 与理想圆弧的关系进行分类。如下图所示,存在以下五种情况:

H

DV

(x,y) 1

2

345 •图 3

Page 30: 第四章 基本图形生成算法  ( 一 )

© 2004 Dept. of Computer Science and Engineer 2023.04.20 30 / 59

圆的扫描转换 (Bresenham 算法 )(见上图)1 ) H 、 D 、 V 全在圆内;2 ) H 在圆外, D 、 V 在圆内;3 ) D 在圆上, H 在圆外, V 在圆内;4 ) H 、 D 在圆外, V 在圆内;5 ) H 、 D 、 V 全在圆外。 同 Bresenham画线算法,按照不同类型,找出误差度量的递推公式,判别它的正、负性即可确定最佳逼近的象素点。

当 D < 0,只能为 1 或 2 种情况。为确定是 H 还是 D ,用如下判别:

δHD = |H| - |D| δHD ≤ 0 则应选 H ,否则选 D 。

Page 31: 第四章 基本图形生成算法  ( 一 )

© 2004 Dept. of Computer Science and Engineer 2023.04.20 31 / 59

圆的扫描转换 (Bresenham 算法 ) 对于第 2 种情况: δHD = H + D

= (x+1)2 + y

2 - R

2 + (x+1)

2 + (y-1)

2 - R

2

=2 D + 2y - 1

对于第 1 种情况: ∵ y 是 x 的单调递减函数  ∴  H 为下一点亮象素。(见图 3 ) 另,此时 H < 0 和 D < 0

H + D = 2D + 2y - 1 < 0

综上两种情况可得如下结论: 在 D< 0 时,若 2( D + y) - 1≤0,则取 H ,否则取 D

Page 32: 第四章 基本图形生成算法  ( 一 )

© 2004 Dept. of Computer Science and Engineer 2023.04.20 32 / 59

圆的扫描转换 (Bresenham 算法 )当 D> 0,有 4 、 5 两种情况,且最佳象素点为 D 或 V ,用如下判别:

- δDV = | D |- | V |

- δDV ≤ 0 则应选 D ,否则选 V 。(见图3)- 对于第 4 种情况:

δDV = D + V ( D > 0 , V < 0 ) = (x+1)2

+ (y-1)2 - R

2 + (x)

2 + (y-1)

2 -

R2

= 2(D - x) - 1

- 对于第 5 种情况:- D,V都在圆外,显然V 为所选象素。- 注意:∵ D > 0 , V> 0- ∴ D + V = 2(D - x) - 1 > 0

Page 33: 第四章 基本图形生成算法  ( 一 )

© 2004 Dept. of Computer Science and Engineer 2023.04.20 33 / 59

圆的扫描转换 (Bresenham 算法 )综上两种情况可得如下结论: 在 D> 0 时,若 2( D -x) - 1 ≤0,则取 D ,否则取 V

当 D = 0 此时 D 是最佳象素。

总结上述分析结果:(见图3) 当 D > 0 , 若 2(D - x) - 1 > 0 ,取 D ,否则取 V 当 D < 0 ,若 2 ( D +y) - 1 ≤0,取 H ,否则取 D 当 D = 0, 取 D 。

关键的问题就是计算 D (见 D的计算公式:式 1 )采用增量法,获得 D的计算公式:

Page 34: 第四章 基本图形生成算法  ( 一 )

© 2004 Dept. of Computer Science and Engineer 2023.04.20 34 / 59

圆的扫描转换 (Bresenham 算法 )分三种情况:(见图3)下一象素为 H 时 H=(x’, y’)=(x+1,y)

D=((x+1)+1)2 +(y-1)

2 - R

2

=(x+1)2 + (y-1)

2 -R

2 + 2(x+1) + 1

= D +2(x+1) + 1下一象素为 D 时 D=(x’, y’)=(x+1,y-1)

D=((x+1)+1)2 +((y-1)-1)

2 - R

2

=(x+1)2 + (y-1)

2-R

2 + 2(x+1) - 2(y-1) + 1

= D +2(x+1) - 2(y-1) + 2

Page 35: 第四章 基本图形生成算法  ( 一 )

© 2004 Dept. of Computer Science and Engineer 2023.04.20 35 / 59

圆的扫描转换 (Bresenham 算法 )

下一象素为 V 时 (见图3) V=(x’,y’)=(x,y-1)

D=(x+1)2 +((y-1)-1)

2 - R

2

=(x+1)2 + (y-1)

2 -R

2 - 2(y-1) + 1

= D - 2(y-1) + 1

有了上述 D的递推计算公式,还需计算出 D的初值。 ∵ 圆弧的起点为( 0 , R ) ∴ D的初值为: D = (0+1)

2 +(R-1)2-R2

= 2 (1-R)

程序见 pp175

Page 36: 第四章 基本图形生成算法  ( 一 )

© 2004 Dept. of Computer Science and Engineer 2023.04.20 36 / 59

圆的扫描转换 ( 任意圆心位置的圆 )

上述算法假设圆的圆心在坐标系的原点;若圆的圆心在( Xc,Yc)点,则扫描转换算法将SetPixel(x,y)改为SetPixel(x+Xc,y+Yc);

这样,就能够实现任意圆心位置圆的扫描转换算法;

Page 37: 第四章 基本图形生成算法  ( 一 )

© 2004 Dept. of Computer Science and Engineer 2023.04.20 37 / 59

圆的扫描转换习题:使用 Bresenham算法扫描转换圆的步骤是什么?解答:

- 1 、设置初始变量 (h,k)=圆心坐标; x=0;y=圆的半径 r ;d=3-2r;

- 2 、测试整个圆是否已经扫描转换完。如果 x>y则停止;- 3 、以中心( h,k)为对称点,对当前的 (x,y)坐标画 8 个圆上的点:Plot(x+h,y+k); plot(-x+h,-y+k);plot(y+h,x+k);plot(-y+h,-x+k)

Plot(-y+h,x+k);plot(y+h,-x+k);plot(-x+h,y+k);plot(x+h,-y+k);

- 4 、计算下一个象素的位置,如果 d<0,则 d=d+4x+6,和x=x+1.如果 d>=0,则 d=d+4(x-y)+10、 x=x+1、 y=y-1.

- 5 、转到步骤 2 ;

Page 38: 第四章 基本图形生成算法  ( 一 )

© 2004 Dept. of Computer Science and Engineer 2023.04.20 38 / 59

圆的扫描转换

习题:当使用 8 路对称方法从 0 度到 45度或 90度到 45度的 8分圆中生成整个圆时,有些象素被设置或画了两次,这种现象称为重击。请说明如何判断重击发生?

解答:- 在初始坐标为( r,0)或 (0,r)时的位置。因为( 0,r) = ( -0,r) , ( 0,-r) = ( -0,-r) , ( r,0) = ( r,-0) , ( -r,0) = ( -r,-0) ;

- 如果最后生成的象素在对角线上,坐标为( ar,ar),其中 a 约为0.7071,则在 (ar,ar)、 (-ar,ar)、 (ar,-ar)、 (-ar,-ar)处会发生重击;

习题:重击除了浪费时间外还有其它坏处吗?解答:

- 通常不会有问题;- 但是如果直接操纵输出设备,可能有问题;

Page 39: 第四章 基本图形生成算法  ( 一 )

© 2004 Dept. of Computer Science and Engineer 2023.04.20 39 / 59

椭圆的扫描转换四路对称;数学上定义椭圆的两种方法:

- 多项式定义:

其中( h,k)为椭圆中心点; a 为长轴长; b 为短轴长;- 极坐标定义:

旋转椭圆轴- 90度旋转:

- 其它角度旋转:

1)()(

2

2

2

2

bky

ahx

kby

hax

)sin(

)cos(

1)()(

2

2

2

2

a

ky

b

hxkay

hbx

)sin(

)cos(

kaby

hbax

)cos()sin(

)sin()cos(

Page 40: 第四章 基本图形生成算法  ( 一 )

© 2004 Dept. of Computer Science and Engineer 2023.04.20 40 / 59

椭圆的扫描转换 ( 中点法 )

中点法:增量算法椭圆的特征: a, b均为整数由于对称性-》讨论第一象限

Page 41: 第四章 基本图形生成算法  ( 一 )

© 2004 Dept. of Computer Science and Engineer 2023.04.20 41 / 59

椭圆的扫描转换 ( 中点法 )

椭圆方程:

对于椭圆上的点,有 F(x,y)=0;对于椭圆外的点, F(x,y)>0;对于椭圆内的点, F(x,y)<0;

0),( 222222 bayaxbyxF

Page 42: 第四章 基本图形生成算法  ( 一 )

© 2004 Dept. of Computer Science and Engineer 2023.04.20 42 / 59

椭圆的扫描转换 ( 中点法 )

椭圆的特征:以弧上斜率为- 1 的点作为分界将第一象限椭圆弧分为上下两部分。如图所示:

上部分: y 分量大 下部分: x 分量

Page 43: 第四章 基本图形生成算法  ( 一 )

© 2004 Dept. of Computer Science and Engineer 2023.04.20 43 / 59

椭圆的扫描转换 ( 中点法 )

椭圆的特征:

若在当前中点,法向量的 y 分量比 x 分量大,即

)5.0()1( 22 pp yaxb

在下一个中点,不等号改变方向,说明椭圆弧从上部分转入下部分。

yjaxibjy

Fi

x

FyxN 22 22),(

法向量:

Page 44: 第四章 基本图形生成算法  ( 一 )

© 2004 Dept. of Computer Science and Engineer 2023.04.20 44 / 59

椭圆的扫描转换 ( 中点法 )

椭圆的中点算法- 算法原理

- 1 、上半部分:

M ( Xi+1, Yi-0.5)

- 2 、下半部分:

M ( Xi+0.5, Yi-1)

Page 45: 第四章 基本图形生成算法  ( 一 )

© 2004 Dept. of Computer Science and Engineer 2023.04.20 45 / 59

椭圆的扫描转换 ( 中点法 )

先推导上半部分的椭圆绘制公式

Page 46: 第四章 基本图形生成算法  ( 一 )

© 2004 Dept. of Computer Science and Engineer 2023.04.20 46 / 59

椭圆的扫描转换 ( 中点法 )

判别式222222

1 )5.0()1()5.0,1( bayaxbyxFd iiii

• 若 d1≤0,取 Pu(xi+1,yi)

• 若 d1>0,取 Pd(xi+1,yi-1)

Pxi,yi Puxi+1,yi

M(xi+1,yi-0.5)

Pd(xi+1,yi-1)

上半部分椭圆弧的绘制原理

Page 47: 第四章 基本图形生成算法  ( 一 )

© 2004 Dept. of Computer Science and Engineer 2023.04.20 47 / 59

椭圆的扫描转换 ( 中点法 )

误差项的递推 d1≤0:

)x(bd

)x(bba).(ya)(xb

ba).(ya)(xb).,yF(xd

i

iii

iiii

32

32501

502502

21

2222222

2222221

Page 48: 第四章 基本图形生成算法  ( 一 )

© 2004 Dept. of Computer Science and Engineer 2023.04.20 48 / 59

椭圆的扫描转换 ( 中点法 )

误差项的递推 d1> 0:

)22()32(

)22()32()5.0()1(

)5.1()2()5.1,2(

221

22222222

2222221

ii

iiii

iiii

yaxbd

yaxbbayaxb

bayaxbyxFd

Page 49: 第四章 基本图形生成算法  ( 一 )

© 2004 Dept. of Computer Science and Engineer 2023.04.20 49 / 59

椭圆的扫描转换 ( 中点法 )

判别式的初始值 P0(0,b)

M0(1, b-0.5)

)25.0(

)5.0()5.0,1(22

2222210

bab

bababbFd

Page 50: 第四章 基本图形生成算法  ( 一 )

© 2004 Dept. of Computer Science and Engineer 2023.04.20 50 / 59

椭圆的扫描转换 ( 中点法 )

再推导椭圆弧下半部分的绘制公式 :原理 :

Page 51: 第四章 基本图形生成算法  ( 一 )

© 2004 Dept. of Computer Science and Engineer 2023.04.20 51 / 59

椭圆的扫描转换 ( 中点法 )

判别式 :222222

2 )1()5.0()1,5.0( bayaxbyxFd iiii

•若 d2>0,取 Pl(xi,yi-1)

•若 d2≤0 ,取 Pr(xi+1,yi-

1)

Page 52: 第四章 基本图形生成算法  ( 一 )

© 2004 Dept. of Computer Science and Engineer 2023.04.20 52 / 59

椭圆的扫描转换 ( 中点法 )

误差项的递推 :

d2>0 :

)y(ad

)y(aba)(ya)(xb

ba)(ya)(xb),yF(xd

i

iii

iiii

32

3215.0

25.025.0

22

2222222

2222222

Page 53: 第四章 基本图形生成算法  ( 一 )

© 2004 Dept. of Computer Science and Engineer 2023.04.20 53 / 59

椭圆的扫描转换 ( 中点法 )

误差项的递推 :

D2 ≤ 0 :

)32()22(

)32()22()1()5.0(

)2()5.1()2,5.1(

222

22222222

2222222

ii

iiii

iiii

yaxbd

yaxbbayaxb

bayaxbyxFd

Page 54: 第四章 基本图形生成算法  ( 一 )

© 2004 Dept. of Computer Science and Engineer 2023.04.20 54 / 59

椭圆的扫描转换 ( 中点法 )

注意:- 上半部分的终止判别 ;

- 下半部分误差项的初值 ;

算法步骤 (1/3):- 1.输入椭圆的长半轴 a 和短半轴 b;

- 2.计算初始值 d=b2+a2(-b+0.25)、 x=0、 y=b;

- 3.绘制点 (x,y)及其在四分象限上的另外三个对称点 ;

Page 55: 第四章 基本图形生成算法  ( 一 )

© 2004 Dept. of Computer Science and Engineer 2023.04.20 55 / 59

椭圆的扫描转换 ( 中点法 )

算法步骤 (2/3):- 4.判断 d 的符号。若 d≤0,先将 d 更新为 d+b2(2x+3),再 将 (x, y) 更新 为 (x+1,y) ;否则将 d 更新 为d+b2(2x+3)+a2(-2y+2),再将 (x,y)更新为 (x+1,y-

1);

- 5.当 b2(x+1)<a2(y-0.5)时,重复步骤 3 和 4 。否则转到步骤 6;

- 6.用上半部分计算的最后点 (x,y)来计算下半部分中 d的初值:

222222 )1()5.0( bayaxbd

Page 56: 第四章 基本图形生成算法  ( 一 )

© 2004 Dept. of Computer Science and Engineer 2023.04.20 56 / 59

椭圆的扫描转换 ( 中点法 )

算法步骤 (3/3):- 7. 绘制点 (x,y) 及其在四分象限上的另外三个对称点 ;- 8.判断 d的符号 :

若 d≤0 ,则先将 d更新为 b2(2xi+2)+a2(-2yi+3) ,再将 (x,y)更新为 (x+1,y-1) ;

否则先将 d更新为 d+a2(-2yi+3) ,再将 (x,y)更新为 (x,y-1);

- 9. 当 y>0 时,重复步骤 7和 8。否则结束 ;

程序:见 pp178

Page 57: 第四章 基本图形生成算法  ( 一 )

© 2004 Dept. of Computer Science and Engineer 2023.04.20 57 / 59

弧、扇形弧的扫描转换弧

- 可以用多项式或极坐标表示;- 用极坐标,始角和终角分别设为- 其余步骤与圆的扫描转换类似,只是不能使用对称性;- 多项式表示: x 的值在 (X1,X2)间变化, y 的值可以利用- 从编程角度:弧仅是圆的一部分,但是 Bresenham画圆算法画弧有问题:

算法中,弧端点必须用 X,Y坐标表示; 若要确定端点,必须在每个 45度弧的增量上判断其是否为端点; 由对称产生的 8 个端点也要进行判断,确定这些点是否在指定弧的两端点间;

所以,必须化时间计算和判断圆周上的每个点; 还可能引发端点丢失-》程序进入死循环; 原公式的执行效率降低。

21 ,

22 xr

Page 58: 第四章 基本图形生成算法  ( 一 )

© 2004 Dept. of Computer Science and Engineer 2023.04.20 58 / 59

弧、扇形弧的扫描转换

扇形- 可以通过生成的弧加上两条连接弧心和端点的直线生成;

Page 59: 第四章 基本图形生成算法  ( 一 )

© 2004 Dept. of Computer Science and Engineer 2023.04.20

谢谢 !