我沿着圆圈有三个点的位置。 pt1(x1, y1,z1)
,pt2(x2, y2, z2)
,pt3(x3, y3,z3)
。并且想要找到圆的半径。我已经有了在2d空间中计算半径的函数,我在这里复制它
public static double ComputeRadius(Location a, Location b, Location c)
{
double x1 = a.x;
double y1 = a.y;
double x2 = b.x;
double y2 = b.y;
double x3 = c.x;
double y3 = c.y;
double mr = (double)((y2 - y1) / (x2 - x1));
double mt = (double)((y3 - y2) / (x3 - x2));
double xc = (double)((mr * mt * (y3 - y1) + mr * (x2 + x3) - mt * (x1 + x2)) / (2 * (mr - mt)));
double yc = (double)((-1 / mr) * (xc - (x1 + x2) / 2) + (y1 + y2) / 2);
double d = (xc - x1) * (xc - x1) + (yc - y1) * (yc - y1);
return Math.Sqrt(d);
}
答案 0 :(得分:2)
如果您知道圆圈中pt1,pt2,pt3
点的顺序,那么您可以使用图形方法:
从圆圈平面中每个线段的中间投射法线轴
您的圆形平面由您的3个点定义。所以法线向量是
n = (pt2-pt1) x (pt3-pt2)
x
是交叉产品,因此您有2行(pt1,pt2)
和(pt2,pt3)
为黑色。中点很容易
p0=0.5*(pt1+pt2)
p1=0.5*(pt2+pt3)
轴方向也可以通过叉积获得
dp0=(pt2-pt1) x n
dp1=(pt3-pt2) x n
所以你有两个轴:
pnt0(t)=p0+dp0*t
pnt1(u)=p1+dp1*u
t,u
是标量参数t,u=(-inf,+inf)
,它只是从起点中点开始的轴位置...
交叉点是圆心
所以找到intersection of 2 axises并将其称为pt0
计算中心与任意点之间的距离
r=|pt1-pt0|
很抱歉,该图片适用于任何曲线(对于圆圈来说太懒了,因为它几乎相同)。如果你不知道点的顺序,那么彼此距离最远的2个点是外点...如果它们是等距的,那么顺序无关紧要