三个点确定一个圆

首先假设圆心为(x0, y0),半径为r。则这个圆可以表示为:

  • (xx0)2+(yy0)2=r2

假设知道的三个点为(x1, y1),(x2,y2),(x3,y3)。那么:

  • (x1x0)2+(y1y0)2=r2
  • (x2x0)2+(y2y0)2=r2
  • (x3x0)2+(y3y0)2=r2

消去 r2 后变成

  • (x1x0)2+(y1y0)2=(x2x0)2+(y2y0)2
  • (x1x0)2+(y1y0)2=(x3x0)2+(y3y0)2

将未知量x0,y0移到左边就变为

  • (x1x2)x0+(y1y2)y0=(x12x22)+(y12y22)2
  • (x1x3)x0+(y1y3)y0=(x12x32)+(y12y32)2

首先我们要确定这个方程是不是有解,很简单,即判断行列式

  • (x1x2)(x1x3)(y1y2)(y1y3)0

设两个常量a1,a2

  • a1=(x12x22)+(y12y22)2
  • a2=(x12x32)+(y12y32)2

那么

  • x0=(y1y2)a2(y1y3)a1(y1y2)(x1x3)(x1x2)(y1y3)
  • y0=(x1x3)a1(x1x2)a2(y1y2)(x1x3)(x1x2)(y1y3)

最后代码如下

import numpy as np
import matplotlib.pyplot as plt
from matplotlib.patches import Circle
#www.coordinate.wang
def circle(x1, y1, x2, y2, x3, y3):
    a = x1 - x2
    b = y1 - y2
    c = x1 - x3
    d = y1 - y3
    a1 = ((x1 * x1 - x2 * x2) + (y1 * y1 - y2 * y2)) / 2.0
    a2 = ((x1 * x1 - x3 * x3) + (y1 * y1 - y3 * y3)) / 2.0
    theta = b * c - a * d;
    if abs(theta) < 1e-7:
        return -1
    x0 = (b * a2 - d * a1) / theta;
    y0 = (c * a1 - a * a2) / theta;
    r = np.sqrt(pow((x1 - x0), 2)+pow((y1 - y0), 2))
    fig = plt.figure()
    ax = fig.add_subplot(111)
    cir = Circle(xy = (x0, y0), radius = r, alpha=0.4)
    ax.add_patch(cir)
    plt.axis('scaled')
    plt.axis('equal')
    plt.plot(x1,y1,'r*',x2,y2,'r*',x3,y3,'r*')
    plt.show()

circle(0, 0, 0, 1, 1, 0)

结果为



评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值