MATLAB实现利用三个不共线的点绘制圆(包括圆心和半径的求解)

通过三个不共线的平面点绘制圆形/MATLAB实现

1: 三个不共线的点求解圆心和半径

假设三个不共线的点的坐标分别为 P 1 ( x 1 , y 1 ) 、 P 2 ( x 2 , y 2 ) P1(x1,y1)、P2(x2,y2) P1(x1,y1)P2(x2,y2) P 3 ( x 3 , y 3 ) P3(x3,y3) P3(x3,y3),设过三个不共线点的圆的圆心和半径分别为 ( x , y ) 和 R (x,y)和R (x,y)R,根据圆的公式可以得到: { ( x − x 1 ) 2 + ( y − y 1 ) 2 = R 2 ( x − x 2 ) 2 + ( y − y 2 ) 2 = R 2 ( x − x 3 ) 2 + ( y − y 3 ) 2 = R 2 \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} (xx1)2+(yy1)2=R2(xx2)2+(yy2)2=R2(xx3)2+(yy3)2=R2将上述公式展开移项后得到: { x 2 + y 2 + x 1 2 + y 1 2 = 2 x 1 x + 2 y 1 y + R 2 x 2 + y 2 + x 2 2 + y 2 2 = 2 x 2 x + 2 y 2 y + R 2 x 2 + y 2 + x 3 2 + y 3 2 = 2 x 3 x + 2 y 3 y + R 2 \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} x2+y2+x12+y12=2x1x+2y1y+R2x2+y2+x22+y22=2x2x+2y2y+R2x2+y2+x32+y32=2x3x+2y3y+R2通过对上述公式合并整理可以得到:
{ ( x 2 − x 1 ) x + ( y 2 − y 1 ) y = 0.5 ( x 2 2 + y 2 2 − x 1 2 − y 1 2 ) ( x 3 − x 1 ) x + ( y 3 − y 1 ) y = 0.5 ( x 3 2 + y 3 2 − x 1 2 − y 1 2 ) ( x 3 − x 2 ) x + ( y 3 − y 2 ) y = 0.5 ( x 3 2 + y 3 2 − x 2 2 − y 2 2 ) \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} (x2x1)x+(y2y1)y=0.5(x22+y22x12y12)(x3x1)x+(y3y1)y=0.5(x32+y32x12y12)(x3x2)x+(y3y2)y=0.5(x32+y32x22y22)将上述方程构成矩阵形式,既有: A θ = B A \theta = B Aθ=B其中 A = [ x 2 − x 1 y 2 − y 1 x 3 − x 1 y 3 − y 1 x 3 − x 2 y 3 − y 2 ] , B = 0.5 [ x 2 2 + y 2 2 − x 1 2 − y 1 2 x 3 2 + y 3 2 − x 1 2 − y 1 2 x 3 2 + y 3 2 − x 2 2 − y 2 2 ] 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} A=x2x1x3x1x3x2y2y1y3y1y3y2,B=0.5x22+y22x12y12x32+y32x12y12x32+y32x22y22
由于上述方程为线性方程,也不存在误差,利用最小二乘求得圆心的坐标为: θ = ( A T A ) − 1 A T B \theta =(A^{T}A) ^{-1}A^{T}B θ=(ATA)1ATB
那么圆心的坐标有: x = θ ( 1 ) , y = θ ( 2 ) x=\theta(1),y=\theta(2) x=θ(1),y=θ(2)
利用得到的圆心可以直接求得圆的半径为: R = ( x − x 1 ) 2 + ( y − y 1 ) 2 R=\sqrt{(x-x1)^2+(y-y1)^2} R=(xx1)2+(yy1)2

2: 得到圆的边的坐标

当得到过三点圆的圆心和半径后,可以利用圆的参数方程得到圆的边的坐标,既有: { x = x 0 + R c o s α y = y 0 + R s i n α , 其 中 α ∈ [ 0 , 2 π ] \begin{cases} x=x0+Rcos{\alpha}\\ y=y0+Rsin{\alpha}\end{cases} ,其中 \alpha \in{[0,2\pi]} {x=x0+Rcosαy=y0+Rsinαα[0,2π]其中, x x x为圆边上某一点的横坐标, y y y为圆边上某一点的纵坐标, α \alpha α为圆边上某一点对应的角度, x 0 x0 x0 y 0 y0 y0为该圆的圆心, R R R为该圆的半径。

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)(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) (1.2,1.2)(8,0.5)(13.8,1.2)画圆

例子2
例子2

结束!
  • 21
    点赞
  • 119
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值