MATLAB實現利用三個不共線的點繪製圓(包括圓心和半徑的求解)

通過三個不共線的平面點繪製圓形/MATLAB實現

1: 三個不共線的點求解圓心和半徑

假設三個不共線的點的座標分別爲P1(x1,y1)P2(x2,y2)P1(x1,y1)、P2(x2,y2)P3(x3,y3)P3(x3,y3),設過三個不共線點的圓的圓心和半徑分別爲(x,y)R(x,y)和R,根據圓的公式可以得到:{(xx1)2+(yy1)2=R2(xx2)2+(yy2)2=R2(xx3)2+(yy3)2=R2\begin{cases}(x-x1)^2+(y-y1)^2=R^2\\(x-x2)^2+(y-y2)^2=R^2\\(x-x3)^2+(y-y3)^2=R^2\end{cases} 將上述公式展開移項後得到:{x2+y2+x12+y12=2x1x+2y1y+R2x2+y2+x22+y22=2x2x+2y2y+R2x2+y2+x32+y32=2x3x+2y3y+R2\begin{cases}x^2+y^2+x1^2+y1^2=2x1x+2y1y+R^2\\x^2+y^2+x2^2+y2^2=2x2x+2y2y+R^2\\x^2+y^2+x3^2+y3^2=2x3x+2y3y+R^2\end{cases} 通過對上述公式合併整理可以得到:
{(x2x1)x+(y2y1)y=0.5(x22+y22x12y12)(x3x1)x+(y3y1)y=0.5(x32+y32x12y12)(x3x2)x+(y3y2)y=0.5(x32+y32x22y22)\begin{cases}(x2-x1)x+(y2-y1)y=0.5(x2^2+y2^2-x1^2-y1^2)\\(x3-x1)x+(y3-y1)y=0.5(x3^2+y3^2-x1^2-y1^2)\\(x3-x2)x+(y3-y2)y=0.5(x3^2+y3^2-x2^2-y2^2)\\\end{cases} 將上述方程構成矩陣形式,既有:Aθ=BA \theta = B其中A=[x2x1y2y1x3x1y3y1x3x2y3y2],B=0.5[x22+y22x12y12x32+y32x12y12x32+y32x22y22]A=\begin{bmatrix} x2-x1 & y2-y1 \\ x3-x1 & y3-y1 \\ x3-x2 & y3-y2 \end{bmatrix},B=0.5\begin{bmatrix} x2^2+y2^2-x1^2-y1^2 \\ x3^2+y3^2-x1^2-y1^2 \\ x3^2+y3^2-x2^2-y2^2 \end{bmatrix}
由於上述方程爲線性方程,也不存在誤差,利用最小二乘求得圓心的座標爲:θ=(ATA)1ATB \theta =(A^{T}A) ^{-1}A^{T}B
那麼圓心的座標有:x=θ(1),y=θ(2)x=\theta(1),y=\theta(2)
利用得到的圓心可以直接求得圓的半徑爲:R=(xx1)2+(yy1)2 R=\sqrt{(x-x1)^2+(y-y1)^2}

2: 得到圓的邊的座標

當得到過三點圓的圓心和半徑後,可以利用圓的參數方程得到圓的邊的座標,既有:{x=x0+Rcosαy=y0+Rsinαα[0,2π]\begin{cases} x=x0+Rcos{\alpha}\\ y=y0+Rsin{\alpha}\end{cases} ,其中 \alpha \in{[0,2\pi]}其中,xx爲圓邊上某一點的橫座標,yy爲圓邊上某一點的縱座標,α\alpha爲圓邊上某一點對應的角度,x0x0y0y0爲該圓的圓心,RR爲該圓的半徑。

3: 代碼實現-MATLAB

function Result = ThreePoint2Circle(P1, P2, P3)
%% 求圓心和半徑
x1 = P1(1);    x2 = P2(1);    x3 = P3(1);
y1 = P1(2);    y2 = P2(2);    y3 = P3(2);
z1 = x2^2 + y2^2 - x1^2 - y1^2;
z2 = x3^2 + y3^2 - x1^2 - y1^2;
z3 = x3^2 + y3^2 - x2^2 - y2^2;
A = [(x2-x1), (y2-y1); (x3-x1), (y3-y1); (x3-x2), (y3-y2)];
B = 0.5*[z1;  z2;  z3];
P0 = (A'*A)\A'*B;
R1 = sqrt( (P0(1) - P1(1))^2 + (P0(2) - P1(2))^2 );
R2 = sqrt( (P0(1) - P2(1))^2 + (P0(2) - P2(2))^2 );
R3 = sqrt( (P0(1) - P3(1))^2 + (P0(2) - P3(2))^2 );
R = (R1 + R2 + R3)/3;
%% 繪製圓
theta = (0:pi/360:2*pi)';
Result = zeros(size(theta,1),4);
for i = 1: size(theta,1)
    Result(i,1) = i;
    Result(i,2) = theta(i);
    Result(i,3) = P0(1) + R*cos(theta(i));
    Result(i,4) = P0(2) + R*sin(theta(i));
end
figure();plot(Result(:,3),Result(:,4),'b-');hold on;
grid on; xlabel('x');ylabel('y'); axis equal;
end

輸出的結果爲0.5°間隔,其中第1列爲點號,第2列爲角度,第3列爲橫座標,第4列爲縱座標。

4: 代碼測試

(1)過(1,1)(3,2)(5,1)(1,1)、(3,2)、(5,1)畫圓

例子1
例子1

(2)過(1.2,1.2)(8,0.5)(13.8,1.2)(1.2,1.2)、(8,0.5)、(13.8,1.2)畫圓

例子2
例子2

結束!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章