2010-12-14 3 views
4

Я написал простой метод вспомогательного помощника, который вычисляет расстояние от точки до плоскости. Однако, похоже, это приводит к бессмысленным результатам. Таким образом, код i для создания плоскости:Расстояние до плоскости

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

Используя тот же набор вершин, которые я использовал, чтобы построить самолет, я получаю это исключение брошено! Математически это невозможно, так как эти три точки должны лежать на плоскости.

метод My 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 
+0

Какова ценность 'Constants.TOLERANCE'? – DGH

+0

TOLERANCE = 1e-5f – Martin

+0

Однако терпимость не является проблемой. Как видно из нового примера, данные, которые я только что редактировал на расстоянии, относительно обширны. – Martin

ответ

6

Кажется, что ваш Plane реализован так, что D не является проекцией одной из ваших точек на плоскость нормальной, а скорее отрицательной. Вы можете думать об этом как проецирование вектора от самолет до происхождение на нормальный.

В любом случае, я считаю, что изменение

float value = dot - plane.D; 

в

float value = dot + plane.D; 

должен исправить положение. НТН.

+1

Боже мой, это так очевидно, как только вы это скажете! – Martin

1

Хорошо, я не совсем уверен, что я понимаю математику, но я подозреваю (на основе формул из http://mathworld.wolfram.com/Point-PlaneDistance.html среди других), что

float value = dot - plane.D; 

должен фактически являются

float value = dot/plane.D; 

EDIT: Хорошо, как упоминалось в комментариях ниже, это не сработало. Мое лучшее предложение тогда - посмотреть на ссылку или «расстояние между точкой и плоскостью» Google и попробовать реализовать формулу по-другому.

+0

Я работал от этого ответа здесь, который выражает это довольно просто: http://social.msdn.microsoft.com/Forums/en/xnaframework/thread/226600b4-0de4-4bac-bc55-a4d9b84dd92f – Martin

+0

@Martin: Ok , похоже, что вы правильно следуете этому предложению. Однако эта формула не соответствует ни одному из трех или четырех других сайтов, которые я видел, объясняя этот расчет. Не могли бы вы попробовать мою идею, просто чтобы меня юморить? – DGH

+0

Несомненно, почему бы и нет :) – Martin

Смежные вопросы