到飞机的距离

时间:2010-12-14 05:25:39

标签: c# debugging math geometry xna

我写了一个简单的小辅助方法,用来计算从一个点到一个平面的距离。然而,它似乎正在回归荒谬的结果。因此,我创建一个平面的代码是:

Plane = new Plane(vertices.First().Position, vertices.Skip(1).First().Position, vertices.Skip(2).First().Position);

相当简单,我希望你会同意。它使用三个点创建XNA平面结构。

现在,在此之后我立即:

foreach (var v in vertices)
{
    float d = Math.Abs(v.ComputeDistance(Plane));
    if (d > Constants.TOLERANCE)
        throw new ArgumentException("all points in a polygon must share a common plane");
}

使用我用于构造平面的同一组顶点,我抛出了异常!数学上这是不可能的,因为这三点必须在飞机上。

我的ComputeDistance方法是:

public static float ComputeDistance(this Vector3 point, Plane plane)
{
    float dot = Vector3.Dot(plane.Normal, point);
    float value = dot - plane.D;
    return value;
}

我理解,这是正确的。那么我可能做错了什么?或者我可能遇到XNA实现中的错误?

一些示例数据:

Points:
{X:0 Y:-0.5000001 Z:0.8660254}
{X:0.75 Y:-0.5000001 Z:-0.4330128}
{X:-0.75 Y:-0.5000001 Z:-0.4330126}

Plane created:
{Normal:{X:0 Y:0.9999999 Z:0} D:0.5} //I believe D should equal -0.5?

Distance from point 1 to plane:
1.0

2 个答案:

答案 0 :(得分:6)

似乎您的Plane已经实施,因此D不是您的某个点投影到平面法线上的投影,而是负面投影。您可以将此视为将平面投影到原点到法线上。

无论如何,我相信改变

float value = dot - plane.D;

float value = dot + plane.D;

应该解决问题。 HTH。

答案 1 :(得分:1)

好的,我不完全确定我在这里理解数学,但我怀疑(基于http://mathworld.wolfram.com/Point-PlaneDistance.html等公式)

float value = dot - plane.D;

实际应该是

float value = dot / plane.D;

编辑:好的,正如下面的评论所述,这不起作用。我最好的建议是去查看链接或google“点和平面之间的距离”,然后尝试以不同的方式实现公式。