Python已知圆上三点求圆心和半径

2022-02-19  本文已影响0人  大龙10

一、原理:

  圆上的任意两点的连线称作弦,弦的中垂线必过圆心,取三点组成的两条弦的中垂线的交点,即为圆心,再通过圆心求半径.

  其中三点坐标为 (dx1,dy1) (dx2,dy2) (dx3,dy3)

  h1 h2 是弦的的中垂线的 斜率 x y 为圆心坐标 radius 为半径

二、C程序

//  https://blog.csdn.net/weixin_44957370/article/details/116455334
double midx1,midy1,midx2,midy2;
double h1,h2;
 
//求前两个点的中心点
midx1 = (dx1 + dx2) / 2;
midy1 = (dy1 + dy2) / 2;
 
//两条垂线斜率乘积为 -1
h1 = - (dx2 - dx1) / (dy2 - dy1);
 
//求后两个点的中心点
midx2 = (dx2 + dx3) / 2;
midy2 = (dy2 + dy3) / 2;
 
//两条垂线斜率乘积为 -1
h2 = - (dx3 - dx2) / (dy3 - dy2);
 
//对应的垂线表示为
 
// y = h1(x - midx1) + midy1;
// y = h2(x - midx2) + midy2;
 
//转化得
double x = (midy2 - midy1 + midx1*h1 - midx2*h2) / (h1 - h2);
double y = h1 * ( x - midx1) + midy1;
 
double radius = _hypot(fabs(x - dx1), fabs(y - dy1));

三、Python程序

  复数求解!神操作

def get_circle(p1,p2,p3):
    '''三点求圆,返回圆心和半径'''
    x, y, z = p1[0]+p1[1]*1j, p2[0]+p2[1]*1j, p3[0]+p3[1]*1j
    w = z-x
    w /= y-x
    c = (x-y)*(w-abs(w)**2)/2j/w.imag-x 
    return (-c.real,-c.imag),abs(c+x)
    
c,r = get_circle((1,1),(1,2),(3,4))
print('({:.2f},{:.2f}),r= {:.2f}'.format(c[0],c[1], r))
运行结果

四、参考资料

1、哟吼!的博客 https://www.cnblogs.com/kongbursi-2292702937/p/15160470.html
2、哈哈老师的日记 https://www.toutiao.com/a7051427670651077159
3、https://blog.csdn.net/u012138730/article/details/79894181
4、https://blog.csdn.net/liyuanbhu/article/details/52891868
5、https://blog.csdn.net/qq_45874328/article/details/114934147
上一篇 下一篇

猜你喜欢

热点阅读