圆弧算法介绍
合集下载
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
第 一个象素是(0,R),判别式d的初始值为
d0 F(1, R 0.5) 1.25 R
P=(xp,yp) P1
M
P2
• 为了进一步提高算法的效率,可以将上 面的算法中的浮点数改写成整数,将乘 法运算改成加法运算,即仅用整数实现 中点画圆法。
• 使用e=d-0.25代替d
• e0=1-R
算法描述:
end;
举例:半径为R ,圆心为(0,0),A起点(0,6)
d1=3-2*6=-9 xy d
0 0 6 F0=0 1 1 6 F1=1 2 1 5 F2=-10 3 2 5 F3=-7 4 3 5 F4=-2 5 4 5 F5=5 6 4 4 F6=-4 7 5 4 F7=5 8 5 3 F8=-2 9 6 3 F9=9 10 6 2 F10=4 11 6 1 F11=1 12 6 0
procedure pnarc(radius,xc,yc:integer)
算法描述: var x,y,f:interger;
begin x:=xc; y:=yc+radius; f:=0; while y>yc do begin plot(x,y); if f>0 then begin f:=f-2*(y-yc)+1; y:=y-1; end; else begin f:=f+2*(x-xc)+1; x:=x+1; end; end; if y=yc then plot(x,y);
1
4 4 4 d5=3
0
01 23
45 6
•3.5 绘圆弧正负法
考虑圆心在 (xc , yc ) 半径为R
令:F(x, y) (x xc )2 ( y yc )2 R2
取A点 (x0 , y0 ) x0 xc , y0 yc R 已知 Pi (xi , yi ) 求 Pi1(xi1, yi1) 原则为:
22
对于圆弧上的点p(x, y),其下一个可选择的点如图。 H(x+1,y) D(x+1,y-1)
p
H
令:D(P) (x2 y2 ) R2
di D(Hi ) D(Li ) (xh2i yh2i R2 ) (xl2i yl2i R2 )
L
当 di 0 ,应取H点,H离圆弧近
当 di 0 ,应取L点,L离圆弧近
圆弧生成算法
•中点画圆法
圆的特征:八对称性。只要扫描转换八分之一圆弧,
就可以求出整个圆弧的象素集 只画1/8圆,其余点通过对称关系求得。
(xi , yi )
(xi , yi ) (xi , yi ) (xi , yi )
( yi , xi )
( yi ,xi )
( yi ,xi ) ( yi , xi )
d:=d=4*(x-y)+10; y:=y-1; end; x:=x+1; end; if x=y then plot(x,y); end;
举例:半径为R ,圆心为(0,0),A(0,6)
d1=3-2*6=-9
6
xy d
5
0 0 6 d1=-9
4
1 1 6 d2=-3
3
2 2 6 d3=7
2
3 3 5 d4=1
考虑中心在原点,半径为R 的第二个8分圆,
– 构造判别式(圆方程)
P=(xp,yp) P1
d F (M ) F (xp 1, yp 0.5)
M
(xp 1)2 ( y p 0.5)2 R2
P2
根据d的正负来判断是取P1还是P2。
即判断中点M在圆内还是在圆外?
两种情况:
1)若 d<0, 则取P1( xp 1, yp)为下一象素,而且再下一象素
x++;
circlepoints (x,y,color);
}
}
中点画圆举例:
象限判别
通过分析,发现在进行绘制圆弧曲线时,需要考虑轨迹 点所在象限的情况,因此需要进行象限的判别。 对于在坐标轴上的点,需要根据绘制圆的方向来决定。
B
C
A
D
•3.4 Bresenham算法
仍然考虑圆心在原点的一个第一象限的圆弧 (0, R) ~ ( R , R ) 。
算法描述:
procedure arc(radius :integer) var x,y,d:interger; begin
x:=0; y:=radius; d:=3-2*radius; while x<y do begin
plot(x,y); if d<0 then d:=d+4*x+6 else begin
MidPointCircle(int r int color)
{ int x,y;
float d;
x=0; y=r; d=1.25-r;
circlepoints (x,y,color); //显示圆弧上的八个对称点
while(x<=y)
{
if(d<0)
பைடு நூலகம்
d+=2*x+3;
else { d+=2*(x-y)+5; y--;}
2xi2 4xi 2 yi2 2 yi 2R2 3
当 di 0 ,应取H点,此时 yi yi1
di1 di 4xi 2 di 4xi1 6
当 di 0 ,应取L点,此时 yi yi1 1
di1 di 4xi 4yi1 6 di 4(xi1 yi1) 10
的判别式为
d' F(xp 2, yp 0.5) (xp 2)2 ( yp 0.5)2 R2 d 2xp 3
2)若d>=0, 则应取P2( xp 1, yp 1)为下一象素,而且下一象
素的判别式为
d' F(xp 2, yp 1.5) (xp 2)2 (yp 1.5)2 R2 d 2(xp yp ) 5
起始点A (x0, y0 )其中 x0 0, y0 R
第2点有 x1 x0 1
d1 D(H1) D(L1) 3 2R
di
D(Hi ) D(Li )
( xi2
y2 i 1
R2 ) (xi2
( yi1
1)2
R2)
2xi2
2
y2 i 1
2
yi1
2R2
1
di1 (xi 1)2 yi2 R2 (xi 1)2 ( yi 1)2 R2 )
当 F (xi , yi ) 0 取 xi1 xi 1, yi1 yi 当 F (xi , yi ) 0 取 xi1 xi , yi1 yi 1
A B
当 F(xi , yi ) 0 有 F(xi1, yi1) F(xi , yi ) 2(xi xc ) 1 当 F(xi , yi ) 0 取 F(xi1, yi1) F(xi , yi ) 2( yi yc ) 1