You are on page 1of 61

5.

2 圆的扫描转换算法
圆的扫描转换
 角度 DDA 法
 逐点插补法
 中点 Bresenham 画圆法
 Bresenham 画圆算法
 生成圆弧的正负法
 圆的内接正多边形逼近法

计算机图形学 1
5.2.1 八分法画圆
问题描述:圆的扫描转换
简化问题:只考虑圆心在原点的圆

计算机图形学 2
5.2.1 八分法画圆
问题描述: 圆的扫描转换
那么对于任意圆呢?

计算机图形学 3
5.2.1 八分法画圆
问题描述: 圆的扫描转换

8 1

7 2

6 3

5 4

计算机图形学 4
5.2.1 八分法画圆
选择这一
 八分法画圆的由来? 段圆弧

 简化问题:
• 只需要画出一个八分之一
段圆弧即可

计算机图形学 5
5.2.1 八分法画圆
八分法画圆的的问题描述 :
绘出圆心在原点,半径为整数 R 的圆 x2+y2=R2
基本思想:绘制出下图中八分之一段圆弧,利用对
称的方法绘制出另外七段。

计算机图形学 6
5.2.1 八分法画圆
方法一:利用简单方程
基本思想:利用函数方程,直接离散计算。

具体怎么离散化,要看最大位移方向!
计算机图形学 7
5.2.1 八分法画圆
方法一:利用简单方程
基本思想:利用函数方程,直接离散计算。
要离散化,必须知道最大位移方向!

计算机图形学 8
5.2.1 八分法画圆
方法一:利用简单方程
基本思想:利用函数方程,直接离散计算。

计算机图形学 9
5.2.1 八分法画圆
方法二:利用极坐标方程
基本思想:利用极坐标方程,直接离散计算。

计算机图形学 10
5.2.1 八分法画圆
方法二:利用极坐标方程
基本思想:利用极坐标方程,直接离散计算。

计算机图形学 11
5.2.1 八分法画圆
方法二:利用极坐标方程
基本思想:利用极坐标方程,直接离散计算。

计算机图形学 12
5.2.1 八分法画圆
方法二:利用极坐标方程
基本思想:利用极坐标方程,直接离散计算。

计算机图形学 13
5.2.1 八分法画圆
方法二:利用极坐标方程
基本思想:利用极坐标方程,直接离散计算。
步长选择对圆弧效果的影响:

计算机图形学 14
5.2.1 八分法画圆

计算机图形学 15
5.2.2 中点 Bresenham 画圆法
利用圆的对称性, P ( Xp , Yp )
只须讨论 1/8 圆。 P1
假如 P 为当前点亮 M
象素, x 为最大位
P2
移方向,那么,下
一个点亮的象素可
能是
P1 ( Xp+1 , Y
p )或 P2 ( Xp +1 ,
Yp -1) 。

计算机图形学 16
5.2.2 中点 Bresenham 画圆法
构造函数: F (X,Y) =X + Y - R ;
2 2 2

则:
F(X,Y) = 0 (X,Y) 在圆上;
P ( Xp ,Yp ) P1
F (X,Y) < 0 (X,Y) 在圆内;
F (X,Y) > 0 (X,Y) 在圆外。
M
设 M 为 P1 、 P2 间的中点, P2
M=(Xp+1,Yp-0.5)

计算机图形学 17
5.2.2 中点 Bresenham 画圆法
有如下结论:
F ( M ) < 0 则 M 在圆内 -> 取 P1
F ( M ) >= 0 则 M 在圆外 -> 取 P2
为此,可采用如下判别式: P1

M
P2

计算机图形学 18
5.2.2 中点 Bresenham 画圆法
d = F(M) = F(xp + 1, yp - 0.5)
=(xp + 1) + (yp - 0.5) - R
2 2 2

若 d<0, 则 P1 为下一个象素,那么再下一个象素的
判别式为:
d1 = F(xp + 2, yp - 0.5) P1

= (xp + 2)2 + (yp - 0.5) 2 - R2 M M1


P2
= d + 2xp +3
即 d 的增量为 2xp +3.
计算机图形学 19
5.2.2 中点 Bresenham 画圆法
d = F(M) = F(xp + 1, yp - 0.5)
=(xp + 1) + (yp - 0.5) - R
2 2 2

若 d>=0, 则 P2 为下一个象素,那么再下一个象素的
判别式为:
P1
d2 = F(xp + 2, yp - 1.5)
2 2 2 M
= (xp + 2) + (yp - 1.5) - R
P2
M2
= d + ( 2xp + 3 ) + ( -2 yp + 2 )
即 d 的增量为 2 (xp - yp) +5.
计算机图形学 20
5.2.2 中点 Bresenham 画圆法
d 的初值 :
d0 = F(1, R-0.5)
2 2
= 1 + (R-0.5) - R
= 1.25 – R
d<0, = 2xp +3
d>=0, = 2 (xp - yp) +5

计算机图形学 21
5.2.2 中点 Bresenham 画圆法
 为了进一步提高算法的效率,可以将上面的算
法中的浮点数改写成整数,即仅用整数实现中
点画圆法。
 使用 d=d-0.25 代替 d
 d0=1-R
d<-0.25, △d= 2xp +3
d>=-0.25, △d= 2 (xp - yp) +5
 d 的值不会出现浮点数!
计算机图形学 22
5.2.2 中点 Bresenham 画圆法
算法步骤:
( 1 )输入圆的半径 R
( 2 )计算初始值
d=1-R
x=0
y=R
( 3 )绘制点 (x,y) 及其
在八分圆中的另外七个对称点

计算机图形学 23
5.2.2 中点 Bresenham 画圆法
算法步骤:
( 4 )判断 d 的符号
若 d<0
先将 d 更新为 d+2x+3
再将 (x,y) 更新为 (x+1,y)
否则
先将 d 更新为 d+2(x-y)+5
再将 (x,y) 更新为 (x+1,y-1)
( 5 )当 x<y 时,重复步骤( 3 )和( 4 )
否则结束
计算机图形学 24
5.2.2 中点 Bresenham 画圆法
 MidpointCircle(int r, int color)
 {
 int x,y;
 int d;
 x=0; y=r; d=1-r;
 while(x<y){
 circle_point(x,y,color);
 if(d<0) { d+ = 2*x+3; x++ }
 else {d+ = 2*(x-y) + 5; x++;y--; }

 }
 }

计算机图形学 25
5.2.2 中点 Bresenham 画圆法
 circle_point ( x, y, c)
 {
 setpixel(x, y, c);
 setpixel(y, x, c);
 setpixel(-y,x, c);
 setpixel(-x, y, c);
 setpixel(-x, -y, c);
 setpixel(-y, -x, c);
 setpixel(y, -x, c);
 setpixel(x, -y, c);
 }

计算机图形学 26
中点画圆法举例 x y d d1=2x+3 d2=2(x-y)+5

0 12 -11 2*0+3=3
 圆心在原点,半径为
12 ,中点画圆过程:
1 12 -8 2*1+3=5

2 12 -3 2*2+3=7
d0=1-R
3 12 4 2*(3-12)+5=-13

4 11 -9 2*4+3=11

5 11 2 2*(5-11)+5=-7

6 10 -5 2*6+3=15

7 10 10 2*(7-10)+5=-1

8 9 9

计算机图形学 27
中点画圆法 - 习题
 圆心在原点,半径为 8 ,x y d d1=2x+3 d2=2(x-y)+5
中点画圆过程: 0 8 -7 2*0+3=3
d0=1-R 1 8 -4 2*1+3=5

2 8 1 2*(2-8)+5=-7

3 7 -6 2*3+3=9

4 7 3 2*(4-7)+5=-1

5 6 2 2*(5-6)+5=3

6 5 5

计算机图形学 28
5.3 椭圆的扫描转换

 椭圆中点画法思想分析

 椭圆中点 Bresenham 算法

计算机图形学 29
5.3 椭圆的扫描转换

 三个问题:

 1 、为什么以斜率 -1 为界分上半部分和下半部分

 2 、上半部分和下半部分的不同分析方法

 3 、下半部分的中点初始值的计算

计算机图形学 30
5.3.1 椭圆中点画法思想分析
 椭圆的几何特性

计算机图形学 31
5.3.1 椭圆中点画法思想分析
 椭圆的几何特性

计算机图形学 32
5.3.1 椭圆中点画法思想分析
 椭圆的方程

计算机图形学 33
5.3.1 椭圆中点画法思想分析
 椭圆的隐式方程: F(x,y)=b2x2+a2y2-a2b2=0

椭圆外的点 F(x,y)>0
椭圆上的点 F(x,y)=0

椭圆内的点 F(x,y)<0

计算机图形学 34
5.3.1 椭圆中点画法思想分析
 椭圆的对称性:关于 x 轴、 y 轴对称

只画出第一象
限的圆弧

计算机图形学 35
5.3.1 椭圆中点画法思想分析

椭圆的隐式方程 F(x,y)=b2x2+a2y2-a2b2=0

根据椭圆的对称性,只考虑第一象限椭圆弧生成,将其分
why
上下两部分,以切线斜率为 -1 的点作为分界点。

 简单分析

 法向量定量分析

计算机图形学 36
5.3.1 椭圆中点画法思想分析

计算机图形学 37
5.3.1 椭圆中点画法思想分析

计算机图形学 38
5.3.1 椭圆中点画法思想分析

计算机图形学 39
5.3.2 椭圆中点 Bresenham 算法

计算机图形学 40
5.3.2 椭圆中点 Bresenham 算法

计算机图形学 41
5.3.2 椭圆中点 Bresenham 算法

计算机图形学 42
5.3.2 椭圆中点 Bresenham 算法

计算机图形学 43
5.3.2 椭圆中点 Bresenham 算法

计算机图形学 44
5.3.2 椭圆中点 Bresenham 算法

计算机图形学 45
5.3.2 椭圆中点 Bresenham 算法

计算机图形学 46
5.3.2 椭圆中点 Bresenham 算法

计算机图形学 47
5.3.2 椭圆中点 Bresenham 算法

计算机图形学 48
5.3.2 椭圆中点 Bresenham 算法

计算机图形学 49
5.3.2 椭圆中点 Bresenham 算法

计算机图形学 50
5.3.2 椭圆中点 Bresenham 算法
 算法步骤:
( 1 )输入椭圆的长半
轴 a 和短半轴 b
( 2 )计算初始值
d=b2+a2(-b+0.25)
x=0
y=b
( 3 )绘制点 (x,y) 及其
另外三个对称点
计算机图形学 51
5.3.2 椭圆中点 Bresenham 算法
 算法步骤:
( 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)

计算机图形学 52
5.3.2 椭圆中点 Bresenham 算法
 算法步骤:
( 5 )当 2a2(y-0.5)> 2b2 (x+1) 时,重复步骤 (3) 和 (4)
否则,转到步骤 (6) 从上半部分转入下半部分

计算机图形学 53
5.3.2 椭圆中点 Bresenham 算法
 算法步骤:
( 6 )用上半部分计算的最后点 (x,y) 来计算下半部分
中 d 的初值
隐式方程:
F(x,y)=b2x2+a2y2-a2b2

计算机图形学 54
5.3.2 椭圆中点 Bresenham 算法
 算法步骤:
( 7 )绘制点 (x,y) 及其在四分象限上的另外三个对称点

计算机图形学 55
5.3.2 椭圆中点 Bresenham 算法
 算法步骤:
( 8 )判断 d 的符号
若 d<=0
先将 d 更新为 b2 (2x+2) +a2(-2y+3)
再将 (x,y) 更新为 (x+1,y-1)
否则
先将 d 更新为 d+ a2(-2y+3)
再将 (x,y) 更新为 (x,y-1)

计算机图形学 56
5.3.2 椭圆中点 Bresenham 算法
 算法步骤:
( 9 )当 y>0 时,重复步骤( 7 )和( 8 )
否则结束

计算机图形学 57
程序
 MidpointEllipe(a,b, color)
 {int a,b,color;
 int x,y; float d1,d2;
 x = 0; y = b;
 d1 = b*b +a*a*(-b+0.25);
 ellipespixel(x,y,color);
 while( b*b*(x+1) < a*a*(y-0.5)) 生成上半部分椭圆
 { { if (d1<=0)
 d1 +=b*b*(2*x+3); x++; }
 else { d1 +=(b*b*(2*x+3)+a*a*(-2*y+2))
 x++; y--; }
 ellipespixel(x,y,color);
 }// 上部分
 d2 = b*b*(x+0.5)*(x+0.5)+a*a*(y-1)*(y-1)-a*a*b*b;
 while(y >0) 生成下半部分椭圆
 { if (d2 <=0) { d2 +=b*b*(2*x+2)+a*a*(-2*y+3);
 x++; y-- ; }
 else {d2 += a*a*(-2*y+3); y--; }
 ellipespixel(x,y,color); }

计算机图形学 58
程序
Void ellipespixel(int x,int y,int color)
{
setpixel(x,y,color)
setpixel(-x,y,color)
setpixel(x,-y,color)
setpixel(-x,-y,color)
}

2024年3月22日 星期五 计算机图形学 59


中点画椭圆法举例
x y d 36*(2x+3)
36*(2x+3)+
64*(-2y+2)
36*(2x+2)+
64*(-2y+3)
64*(-2y+3)

长半轴 0 6 -332 108


a=8 , 1 6 -224 180
短半轴 2 6 -44 252
b=6 3 6 208 -316
4 5 -108 396
5 5 288 -44
6 4 -207 ( 转下半部分 ) 184
7 3 -23 384
8 2 361 -64
8 1 297 64
8 0 361
计算机图形学 60
中点画椭圆法 - 习题
长半轴 x y d
25*(2x+3 25*(2x+3)+ 25*(2x+2)+
36*(-2y+3)
) 36*(-2y+2) 36*(-2y+3)
a=6
0 5 -146 75
短半轴
1 5 -71 125
b=5
2 5 54 -113
3 4 -59 225
4 4 166 59
( 转下半部
5 3 0.25 分) -108
5 2 -107.75 264
6 1 156.25 36
6 0 192.25

计算机图形学 61

You might also like