я построил небольшую функцию, чтобы проверить, если группа точек лежит в одной плоскости:Coplanar проверка отсутствует определенный случай
public static bool IsCoplanar(Point[] points)
{
// Ensure there are greater than three points (otherwise always coplanar)
if (points.Length < 4)
{
return true;
}
Point pointA = points[0];
Point pointB = points[1];
Point pointC = points[2];
// Calculate the scalar triple product using vectors formed from
// the first three points and each successive point to check that
// the point is on the same plane as the first three.
Vector vectorBA = pointB - pointA;
Vector vectorCA = pointC - pointA;
for (int i = 3; i < points.Length; i++)
{
Point pointD = points[i];
Vector vectorDA = pointD - pointA;
if (!(System.Math.Abs(vectorBA.Dot(vectorCA.Cross(vectorDA))) < Epsilon))
{
return false;
}
}
return true;
}
К сожалению, это, кажется, возвращает истину в случае, например, начиная с 3 копланарными баллы:
(-50, 50, -50)
(-50, -50, -50)
(-50, -50, 50)
Которые являются точными. Но если вы добавите:
(50, -50, 50)
(50, -50, -50)
К списку и снова запустить, он по-прежнему возвращает true.
Я смотрел на это целую вечность, но не смог определить проблему, есть ли у кого-нибудь идеи?
Спасибо.
Привет, я мог бы быть на касательной здесь, но если я помню, мой крест продукты правильно .. глядя на вашем код: CA поперечного DA будет производить вектор, перпендикулярный к обеим с большей вероятной длиной без единицы. Вектор BA (используемый в точечном продукте) также, скорее всего, не является единицей. Вектор поперечного продукта может быть в любом направлении, следовательно, точечный продукт будет либо отрицательным, либо положительным. То, что вы можете сделать, это нормализовать все векторы при игре, а затем проверить, является ли абсолютное значение точечного продукта близким к 1 (+ - delta). Это должно решить вашу проблему. –
Хм, хорошо. Я нормализовал векторы. Когда вы говорите, что абсолютное значение точечного продукта вы имеете в виду как рассчитанное в моем предыдущем решении? Потому что это все еще имеет тенденцию к 0, а не к 1 (хотя я думаю, что вы на что-то с направлением векторов, которые не принимаются во внимание). – djcmm476
Что такое Point, Vector и Epsilon? –