一条线和一个球体的交点?

Pat*_*ick 3 c# math 3d

我有一个简单的对象,允许您分配三个属性(x,y,z)(让我们称这个对象为"点",因为它就是这样).然后我有一个第二个对象,其中一个方法接受第一个对象的两个实例,并返回三维空间中两个"点"之间的距离.我还需要一个接受两个"点"和一个double的方法,表示行进的距离(从使用的第一个"点"参数)返回带有x,y,z坐标的"点"对象.

除了计算所提供的两个点之间的原始线上的点坐标,即距离第一个点一定距离之外,我对所有事情都很满意.

"点"对象:

public class POR
{
    private double PORX;
    private double PORY;
    private double PORZ;

    public double X
    {
        get { return PORX; }
        set { PORX = value; }
    }
    public double Y
    {
        get { return PORY; }
        set { PORY = value; }
    }
    public double Z
    {
        get { return PORZ; }
        set { PORZ = value; }
    }
    public POR(double X, double Y, double Z)
    {
        PORX = X;
        PORY = Y;
        PORZ = Z;
    }
Run Code Online (Sandbox Code Playgroud)

我正在使用:

    public double PorDistance(POR por1, POR por2)
    {
        return Math.Round(Math.Sqrt( Math.Pow((por1.X - por2.X),2) + Math.Pow((por1.Y - por2.Y),2) + Math.Pow((por1.Z - por2.Z),2)),2);
    }
Run Code Online (Sandbox Code Playgroud)

返回我需要的那两点之间的距离

public POR IntersectPOR (POR por1, POR por2, double distance)
{

}
Run Code Online (Sandbox Code Playgroud)

其中距离是从por1到por2的距离.

syk*_*ora 5

这可以通过矢量的一些帮助来完成.

假设您的起点叫做P,另一个点是Q,距离是d.你想在距离P到Q的距离d处找到PQ线上的点.

  1. 首先,您需要找到旅行方向.这是通过寻找Q - P来完成的

    v = Point(Q.x - P.x, Q.y - P.y, Q.z - P.z)
    
    Run Code Online (Sandbox Code Playgroud)
  2. 现在你需要在那个方向找到单位向量,所以

    scale = sqrt(v.x*v.x + v.y*v.y + v.z*v.z)
    unit = Point(v.x/scale, v.y/scale, v.z/scale)
    
    Run Code Online (Sandbox Code Playgroud)
  3. 现在你需要找到代表行进距离的向量:

    t = Point(unit.x*d, unit.y*d, unit.z*d)
    
    Run Code Online (Sandbox Code Playgroud)
  4. 要找到最终位置,请将您的行进向量添加到起点:

    final = Point(P.x + t.x, P.y + t.y, P.z + t.z)
    
    Run Code Online (Sandbox Code Playgroud)