一、原理:
圆上的任意两点的连线称作弦,弦的中垂线必过圆心,取三点组成的两条弦的中垂线的交点,即为圆心,再通过圆心求半径.
其中三点坐标为 (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
网友评论