我有一个简单的对象,允许你分配三个属性(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;
}
我正在使用:
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);
}
返回我需要的那两点之间的距离
public POR IntersectPOR (POR por1, POR por2, double distance)
{
}
其中距离是从por1到por2的距离。
答案 0 :(得分:5)
这可以通过矢量的一些帮助来完成。
假设您的起点叫做P,另一个点是Q,距离是d。你想在距离P到Q的距离d处找到PQ线上的点。
首先,您需要找到旅行方向。这是通过找到Q - P
来完成的v = Point(Q.x - P.x, Q.y - P.y, Q.z - P.z)
现在你需要在那个方向找到单位向量,所以
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)
现在你需要找到代表行进距离的向量:
t = Point(unit.x*d, unit.y*d, unit.z*d)
要找到最终位置,请将您的旅行矢量添加到起点:
final = Point(P.x + t.x, P.y + t.y, P.z + t.z)
答案 1 :(得分:1)
看起来你想要类似的东西:
public class Point
{
public double x, y, z;
// ctors, Add(), Subtract() omitted
public Point Normalize()
{
double m = Magnitude;
if (m != 0.0) return ScaleTo(1.0/m);
return new Point();
}
public double Magnitude
{
get { return Math.Sqrt(x * x + y * y + z * z); }
}
public Point ScaleTo(double s)
{
return new Point(x * s, y * s, z * s);
}
}
public Point PointOnLine(Point from, Point to, double dist)
{
return from.Add(to.Subtract(from).Normalize().ScaleTo(dist));
}
答案 2 :(得分:1)
没有实际代码,因为我认为这更像是一个概念性问题。 这可能不是最有效的,但是当我这样做时,我只是将总距离和线段之间的比率应用于坐标增量。 例如,如果我在0,0,0和1,2,3处有点,则总3D距离为3.74,如果我想从第一点放置1个单位,则比率为1 / 3.74,因此新坐标将是.2673从第一个点到第二个点的总距离或.267,.534,.802