Расстояние до самолета - PullRequest
       28

Расстояние до самолета

4 голосов
/ 14 декабря 2010

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

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 ]

6 голосов
/ 14 декабря 2010

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

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

float value = dot - plane.D;

до

float value = dot + plane.D;

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

1 голос
/ 14 декабря 2010

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

float value = dot - plane.D;

должно быть

float value = dot / plane.D;

РЕДАКТИРОВАТЬ: Хорошо, как упоминалось в комментариях ниже, это не сработало.Тогда я лучше советую взглянуть на ссылку или в Google "расстояние между точкой и плоскостью" и попробовать реализовать формулу по-другому.

...