Компиляция кода пересечения треугольника?

Мой гугл-фу выдал только один результат, который возвращает точку пересечения луча и треугольника: http://geomalgorithms.com/a06-_intersect-2.html

И мне совершенно не везет с его компиляцией. Я сделал это для точек/векторов:

typedef struct {
    float x, y, z;
} Vector;
typedef struct {
    float x, y, z;
} Point;
typedef struct {
    Vector P0, P1;
} Ray;
typedef struct {
    Point V0, V1, V2;
} Triangle;

И тогда он выдает ошибки об этом коде:

u = T.V1 - T.V0;
v = T.V2 - T.V0;
n = u * v;

«Не подходит для оператора - (типы операндов — точка и точка)»

Итак, я переписал весь код так:

u.x=T.V1.x-T.V0.x;
u.y=T.V1.y-T.V0.y;
u.z=T.V1.z-T.V0.z;
v.x=T.V2.x-T.V0.x;
v.y=T.V2.y-T.V0.y;
v.z=T.V2.z-T.V0.z;
n.x=u.x*v.x;
n.y=u.y*v.y;
n.z=u.z*v.z;

Но по-прежнему говорится, что луч {3, 1, -3} {3, -1, -3} не находится внутри треугольника {-10, 0, -10} {10, 0, 10} {10, 0, - 10 }. Однако я проверил это в Blender, и луч действительно пересекает треугольник.

Может ли кто-нибудь указать, что я делаю неправильно, или дать ссылку на другую страницу с функцией, которая вернет точную точку, где отрезок линии пересекает треугольник? Я бы предпочел сделать это на C, чем связать какую-то векторную библиотеку. Спасибо!


person s13576    schedule 02.06.2015    source источник
comment
возможный дубликат перегрузки оператора   -  person Cory Kramer    schedule 02.06.2015
comment
Вам нужно определить свои арифметические операторы, например, operator+, operator- и т. д.   -  person Cory Kramer    schedule 02.06.2015
comment
@SouravGhosh: T, очевидно, Triangle.   -  person TonyK    schedule 02.06.2015
comment
@TonyK Я не понимаю, как это очевидно для тебя. Я видел тысячи ошибок, вызванных этим очевидным убеждением. И да, эта часть моего комментария является опечаткой, она должна читаться как here.   -  person Sourav Ghosh    schedule 02.06.2015
comment
просто для любопытства: разве нет 2 точек пересечения?   -  person 463035818_is_not_a_number    schedule 02.06.2015
comment
@ tobi303: Это в трех измерениях.   -  person TonyK    schedule 02.06.2015
comment
@TonyK О, понятно. Тем не менее, может потребоваться позаботиться о частном случае, когда луч и треугольник лежат в одной плоскости.   -  person 463035818_is_not_a_number    schedule 02.06.2015


Ответы (2)


Вот проблема:

n = u * v;

Это следует интерпретировать как векторное произведение n = u x v, а не покомпонентное умножение.

person TonyK    schedule 02.06.2015

Я полагаю, что автор страницы не собирался публиковать там действительный готовый C++, на что намекают кавычки, которые он использовал для написания названия языка. Чтобы превратить этот псевдокод в компилируемый код, вам нужно будет самостоятельно реализовать несколько операторов, таких как перекрестное произведение двух трехмерных векторов (кстати, это тривиально).

Предположим, что для объектов уже заданы классы: ...

person dummydev    schedule 02.06.2015