画圆算法
算法原理
画圆算法并不需要求出所有插补点,只要画出目标圆的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 运行示意图