如何在3d空间C#中找到给出三个圆的半径

时间:2015-11-24 07:59:50

标签: c# math 3d geometry

我沿着圆圈有三个点的位置。 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);
        }

1 个答案:

答案 0 :(得分:2)

如果您知道圆圈中pt1,pt2,pt3点的顺序,那么您可以使用图形方法:

  1. 从圆圈平面中每个线段的中间投射法线轴

    您的圆形平面由您的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),它只是从起点中点开始的轴位置...

  2. 交叉点是圆心

    所以找到intersection of 2 axises并将其称为pt0

  3. 计算中心与任意点之间的距离

    r=|pt1-pt0|
    
  4. curve radius

    很抱歉,该图片适用于任何曲线(对于圆圈来说太懒了,因为它几乎相同)。如果你不知道点的顺序,那么彼此距离最远的2个点是外点...如果它们是等距的,那么顺序无关紧要