畫圓算法


畫圓算法

算法原理

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