画圆算法


画圆算法

算法原理

画圆算法并不需要求出所有插补点,只要画出目标圆的1/8如图1AB段,其余7/8可以利用直角坐标系四象限x,y的正负关系和每个象限内x,y的反函数关系求出.

图1 圆的对称性

如图2设目标圆的圆心(0,0),半径为r,单位长度为a,以点A(0,r)为画圆起点,当前点为\(P(X_i,Y_i)\),则下一个取值点只能是\(P_1(X_i+a,Y_i)\)\(P_2(X_i+a,Y_i-a)\)

图2 算法示意图

为判别\(P_1\)\(P_2\),取两者的中点\(M(X_i+a,Y_i-0.5a)\)并构造函数

\[F(X,Y)=X^2+Y^2-R^2 \]

对于圆上的点有\(F(X,Y)=0\),圆内的点有\(F(X,Y)<0\),圆外的点有\(F(X,Y)>0\)

将M点带入函数,当\(F(M)<0\)时,说明点M在圆内即\(P_1\)点距圆弧更近,则应选择\(P_1\)点。同理当\(F(M)>0\)时选择\(P_2\)点,当\(F(M)=0\)\(P_1与P_2\)均可,这里固定选择\(P_2\)点。

\[F(M)\begin{cases}\lt0, &应取P_1\\\ge0, &应取P_2\end{cases} \]

\[D_1=F(M)=F(X_i+a,Y_i-0.5a)=(X_i+a)^2+(Y_i-0.5a)^2-R^2 \]

\(F(M)\lt0\)时,\(P_1\)为当前像素点,则下一个取值点为\(A'或B'\)如上图,\(A'与B'\)的判别式为

\[D_2=F(M_1)=F(X_i+2a,Y_i-0.5a)=D_1+2aX_i+3a^2 \]

\(F(M)\ge0\)时,\(P_2\)为当前像素点,则下一个取值点为\(B'或C'\)如上图,\(B'与C'\)的判别式为

\[D_2=F(M_2)=F(X_i+2a,Y_i-1.5a)=D_1+2a(X_i-Y_i)+5a^2 \]

带入点A,得到D的初始值\(D_0=F(M_0)=F(1,r-0.5a)=-ra+1.25a^2\)

程序代码

clc;clear;
xc=7;yc=5;r=3.15;%圆心坐标 r为半径
a=0.1;%单位长度
x=0;y=r;%A点

b=floor(r/(sqrt(2)*a))+1;%插入点数
xi=zeros(1,8*b);%数组定义
yi=zeros(1,8*b);%数组定义
c=2*b;%2b
d=2*c;%4b
e=2*d;%8b

T=1.25*a*a-r*a;%中间参数
i=0;
while(x<=y)
    i=i+1;
    xi(i)=x;
    yi(i)=y;
    xi(c+1-i)=yi(i);%第一象限内对称
    yi(c+1-i)=xi(i);%第一象限内对称
    if(T<0)
        T=T+2*a*x+3*a*a;
    else
        T=T+2*a*(x-y)+5*a*a;
        y=y-a;
    end
    x=x+a;
end
for j=1:c    
     xi(d+1-j)=xi(j);%一,二象限间对称
     yi(d+1-j)=-yi(j);%一,二象限间对称
end
for k=1:d
    xi(e+1-k)=-xi(k);%一,二象限与三,四象限对称
    yi(e+1-k)=yi(k);%一,二象限与三,四象限对称
end
for m=1:e
    xi(m)=xi(m)+xc;%圆心平移
    yi(m)=yi(m)+yc;%圆心平移
end
plot(xi,yi,xc,yc,'r*',0,0,'r.');

图3 运行示意图

参考文献:

汪金友,王淑礼,廖兆曙.3种画圆算法的优劣分析

张玲,邬丽娜,李经章.四点画圆算法的研究与实现


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM