有几种方法可以做到这一点.这是一个算法:
得到你的COORDS
A = {xA,yA}
B = {xB,yB}
C = {xC,yC}
d = {xd,yd}
计算AB和BC线的中点
mid_AB = {(xA + xB)/ 2,(yA + yB)/ 2}
mid_BC = {(xB + xC)/ 2,(yB + yC)/ 2}
找到AB和BC线的斜率
slope_AB =(yB-yA)/(xB-xA)
slope_BC =(yC-yB)/(xC-xB)
构建贯穿中间点PERPENDICULAR到AB和BC的线路(感谢Yves捕获负面信息!)
Slope_perp_AB = - (slope_AB)^( - 1)
Slope_perp_BC = - (slope_BC)^( - 1)
***带有Slope_perp_AB的行贯穿mid_AB
***使用Slope_perp_BC的行贯穿mid_BC
将两个方程设置为彼此相等并求解以找到交点!这给你点d = {xd,yd} !!!
现在用中心点d计算半径和角度是微不足道的!
圆的中心与三个给定点等距:
(X-Xa)^2+(Y-Ya)^2 = (X-Xb)^2+(Y-Yb)^2 = (X-Xc)^2+(Y-Yc)^2
从第二个和第三个成员中减去第一个成员,我们在重新组合之后得到:
2(Xa-Xb) X + 2(Ya-Yb) Y + Xb^2+Yb^2-Xa^2-Ya^2 = 0
2(Xa-Xc) X + 2(Ya-Yc) Y + Xc^2+Yc^2-Xa^2-Ya^2 = 0
两个未知数的两个方程的线性系统很容易用Cramer的规则求解.
可以使用围绕中心的笛卡尔到极坐标变换找到半径和角度:
R= Sqrt((Xa-X)^2+(Ya-Y)^2)
Ta= atan2(Ya-Y, Xa-X)
Tc= atan2(Yc-Y, Xc-X)
但是你仍然会遗漏一件事:弧的相关部分是什么?小转弯还是大转弯?从Ta到Tb或者从Tb到2 Pi到Ta + 2 Pi,还是什么?尝试的答案远没有那么明显,尝试一下(因为三个角度Ta,Tb并且Tc不确定为多个,2 Pi你不能对它们进行排序)!
提示:考虑三角形ABC区域的符号,恰好是系统决定因素的一半.它会告诉你B是否位于AC的左侧或右侧.