2010-12-14 76 views
4

我已经写了一个简单的小帮手方法来计算从一个点到一个平面的距离。但是,它似乎正在返回无意义的结果。我创建飞机的代码是这样的:与飞机的距离

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; 
} 

ASI的理解,这是正确的。那么我会做错什么呢?或者我可能会遇到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 
+0

“Constants.TOLERANCE”的值是多少? – DGH 2010-12-14 05:30:20

+0

TOLERANCE = 1e-5f – Martin 2010-12-14 05:31:16

+0

然而,宽容不是问题。正如你从新的例子中看到的,我刚刚在远处编辑的数据相对较大。 – Martin 2010-12-14 05:31:52

回答

6

看起来你的Plane被实现,因此D不是你的一个点到平面法线的投影,而是这个的负面。你可以把这个想象成投影飞机的原点到正常。

在任何情况下,我认为,改变

float value = dot - plane.D; 

float value = dot + plane.D; 

应该解决的事情。 HTH。

+1

我的天啊,一旦你说出来就很明显!谢谢你太多了。 – Martin 2010-12-14 06:52:36

1

好吧,我不完全相信,我了解这里的数学,但我怀疑(基于http://mathworld.wolfram.com/Point-PlaneDistance.html等等公式)是

float value = dot - plane.D; 

应实际上是

float value = dot/plane.D; 

编辑:好吧,正如在下面的评论中提到的,这没有奏效。那么我最好的建议是看看链接或谷歌“点和飞机之间的距离”,然后尝试以不同的方式实施公式。

+0

我正在从这个答案这里工作,它表达了它非常简单的条款:http://social.msdn.microsoft.com/Forums/en/xnaframework/thread/226600b4-0de4-4bac-bc55-a4d9b84dd92f – Martin 2010-12-14 05:56:55

+0

@Martin:好的,它看起来像是你正确地遵循了这个建议。但是,该公式与我见过的其他三个或四个网站中的任何一个都不匹配,无法解释此计算。你能试试我的想法,只是想幽默我吗? – DGH 2010-12-14 06:03:33

+0

当然,为什么不:) :) – Martin 2010-12-14 06:05:03