Рассчитать угол между двумя треугольниками в CUDA - PullRequest
0 голосов
/ 26 января 2010

Я хотел вычислить угол между двумя треугольниками в трехмерном пространстве. Два треугольника всегда будут делиться ровно двумя точками. например,

Треугольник 1:

Point1 (x1, y1, z1),  
Point2 (x2, y2, z2),   
Point3 (x3, y3, z3).  

Треугольник 2:

Point1 (x1, y1, z1),  
Point2 (x2, y2, z2),  
Point4 (x4, y4, z4).

Есть ли способ эффективно рассчитать угол между ними в CUDA?

Ответы [ 2 ]

3 голосов
/ 27 января 2010

Для каждой плоскости вам нужно построить ее нормальный вектор (перпендикулярный всем линиям в этой плоскости). Простой способ сделать это - взять перекрестное произведение двух непараллельных линий в треугольнике. (напр. (P3-P1) X (P2-P1) и (P4-P1) X (P2-P1).

Нормализуй тех.

Точечное произведение этих двух векторов направления дает вам косинус угла.

Хитрость в том, чтобы следить за вырожденными треугольниками! Если все 3 точки, определяющие любой треугольник, являются коллинеарными (этот треугольник - просто линия), то то, что вы запрашиваете, не определено, и перекрестный продукт разделится на ноль. Вам нужно решить, что вы будете делать в этом случае.

Поскольку вы пытаетесь сделать это на графическом процессоре, в идеале вы захотите написать эту функцию без каких-либо веток, если вы обеспокоены эффективностью. Это означало бы, что вместо проверки на вырожденные треугольники с предложением if вы должны попытаться сделать это с троичным A ? B : C

1 голос
/ 27 января 2010

Угол между треугольниками такой же, как угол между плоскостями, определяемыми тремя точками каждого треугольника.

Поскольку обе точки 1 или точка 2 лежат в обеих плоскостях, вычислите направляющие косинусы изодна из этих точек в точку 3, а затем в точку 4. Тогда косинус угла между этими двумя линиями является просто суммой произведений соответствующих направляющих косинусов.

...