畫圓算法
算法原理
畫圓算法並不需要求出所有插補點,只要畫出目標圓的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 運行示意圖