проверьте, если четыре точки лежат на одной плоскости, только с помощью расстояния (проверить colinearity)
существует метод под названием Кэли-Менгера чтобы найти, если 3 точки коллинеарны, 4 точки являются копланарными и т. д. при условии, что заданы все попарные расстояния.
однако в 2-D есть очень простой способ определить, являются ли 3 точки, {A,B, C} коллинеарными: неравенство треугольника!
!(|AB| + |AC| = |BC|)
и !(|AB| + |BC| = |AC|)
и !(|AC| + |BC| = |AB|)
IFF A
, B
, C
не коллинеар
есть ли аналогичный подход в 3-D?
1 ответов
Да, существует аналогичная формула для трех измерений.
Решение 1
четыре точки находятся в одной плоскости, если и только если одна из областей четырех треугольников, которые вы можете сделать, имеет площадь, равную сумме (или сумме / разности, например, P1=P2+P3-P4) другие три области.
Heron формула гласит, что площадь A треугольника с вершинами a, b, c и
здесь s = 0.5 (a + b + c). Таким образом, вы можете вычислить каждую область с ваших расстояний и проверить, выполняется ли условие.
решение 2
четыре точки находятся в одной плоскости тогда и только тогда, когда объем тетраэдра, состоящего из этих четырех точек, равен 0.
формула цапли дает объем тетраэдра в терминах его ребер, таким образом, вы можете проверить это, основываясь только на расстояниях. Вот краткий вывод формулы.
треугольное равенство можно увидеть только в частном случае Герона формула для вычисления содержания n - мерного симплекса из это n + 1 вершин. Содержание a n-мерный симплекс 1 / n! умножает "высоты" вершин (взятых в любой линейной последовательности) над подпространством, содержащим предыдущие вершины. Представьте себе, как вы умножаете базис треугольника на его высоту ( и с 1/2), чтобы получить область треугольника, затем умножьте эту область на высоту (и 1/3) тетраэдра, чтобы получить его объем, и так далее.
заметим, что любая вершина симплекса в k-мерном пространстве можно рассматривать как вершину "пирамиды" на (к-1)-размерная база, определяемая другими вершинами. Пусть ВК-1 обозначим содержание базы, и h перпендикулярное расстояние вершины от подпространства, содержащего основание, содержание Vk пирамиды дают
поэтому, применяя эту формулу к вершинам (в любом порядке) рекурсивно, начиная с k = n, мы
здесь h1 - это просто расстояние между двумя вершинами, h2 - высота третьей вершины над линией, содержащей эти две вершины,h3 - высота четвертой вершины над плоскостью, содержащей первые три вершины и так далее. Таким образом, содержание n-мерный симплекс 1 / n! умножает "высоты" вершин (взятых в любой линейной последовательности) над подпространством, содержащим предыдущие вершины.
вообще мы можем приложить n-размерное вращение, которое помещает n-1 вершин в подпространство, ортогональное одной из осей.
это приводит нас к Кэли-Менгера, для площади треугольника в терминах длин ребер
дает Герона формула для площади треугольника в терминах длин ребер
формула цапли для Тома тетраэдра
если U, V, W, u, v, w - длины ребер тетраэдра (первые три образуют треугольник; u напротив U и так далее), то
где:
если одна из точек расположена на плоскости, определяемой тремя другими точками, объем равен 0, поэтому одна из факторов в числителе 0 и это условие можно проверить.
Формула цапли и обобщение Брахмагупты
Я написал функцию heron_3d
на C++. Эта функция возвращает boolean
значение, указывающее, принадлежат ли 4 точки одной плоскости или нет, Используя подход, описанный в Решение 1: сравнение каждой грани тетраэдра с суммой из 3 других лиц, использующих Герона формула для расчета каждой области.
#include <cmath>
/**
* @return area of triangle based on Heron formula
*/
double areaOfTriangle( double edge1, double edge2, double edge3) {
double s = 0.5 * ( edge1 + edge2 + edge3);
return std::sqrt( s * ( s - edge1) * ( s - edge2) * ( s - edge3));
}
/**
* U, V, W, u, v, w are lengths of edges of the tetrahedron, as in
* http://en.wikipedia.org/wiki/Tetrahedron
* @param U basis edge 1
* @param V basis edge 2
* @param W basis edge 3
* @param u opposite to U
* @param v opposite to V
* @param w opposite to W
* @return
*/
bool heron_3d( double U, double V, double W,
double u, double v, double w) {
double areas[] = { areaOfTriangle( U, V, W),
areaOfTriangle( U, v, w),
areaOfTriangle( V, u, w),
areaOfTriangle( W, u, v)};
for ( int i = 0; i < 4; ++i) {
double area = areas[ i];
double sum = 0;
for ( int j = 1; j < 4; ++j) {
sum += areas[ (i + j) % 4];
}
if ( area == sum) return true;
}
return false;
}
использование:
int main(int argc, char** argv) {
bool b0 = heron_3d( 3, 3, 0, 5, 5, 4); // true
bool b1 = heron_3d( 3, 3.1, 0.1, 5.1, 5, 4); // false
bool b2 = heron_3d( 3, 5, 2, std::sqrt( 16 + 25), 5, 4); // true
return 0;
}