Я пытаюсь определить, лежит ли конкретная точка внутри многогранника. В моей текущей реализации метод, над которым я работаю, берет точку, в которой мы ищем массив граней многогранника (в данном случае это треугольники, но позже это могут быть и другие многоугольники). Я пытался работать с информацией, найденной здесь: http://softsurfer.com/Archive/algorithm_0111/algorithm_0111.htm
Ниже вы увидите мой «внутренний» метод. Я знаю, что nrml/normal выглядит довольно странно... это результат старого кода. Когда я запускал это, казалось, что он всегда возвращает true, независимо от того, какой ввод я ему даю. (Это решено, пожалуйста, смотрите мой ответ ниже - этот код работает сейчас).
bool Container::inside(Point* point, float* polyhedron[3], int faces) {
Vector* dS = Vector::fromPoints(point->X, point->Y, point->Z,
100, 100, 100);
int T_e = 0;
int T_l = 1;
for (int i = 0; i < faces; i++) {
float* polygon = polyhedron[i];
float* nrml = normal(&polygon[0], &polygon[1], &polygon[2]);
Vector* normal = new Vector(nrml[0], nrml[1], nrml[2]);
delete nrml;
float N = -((point->X-polygon[0][0])*normal->X +
(point->Y-polygon[0][1])*normal->Y +
(point->Z-polygon[0][2])*normal->Z);
float D = dS->dot(*normal);
if (D == 0) {
if (N < 0) {
return false;
}
continue;
}
float t = N/D;
if (D < 0) {
T_e = (t > T_e) ? t : T_e;
if (T_e > T_l) {
return false;
}
} else {
T_l = (t < T_l) ? t : T_l;
if (T_l < T_e) {
return false;
}
}
}
return true;
}
Это на С++, но, как упоминалось в комментариях, это действительно очень не зависит от языка.
polyhedron
только с 3 лицами. - person Pranav   schedule 03.06.2014