Вычислить угол между двумя треугольниками в CUDA

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

Треугольник 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?


person kl.    schedule 26.01.2010    source источник
comment
Боюсь, вам придется определить для меня градус между ними — вы имеете в виду угол между их соответствующими плоскостями?   -  person BlueRaja - Danny Pflughoeft    schedule 27.01.2010
comment
да, между соответствующими самолетами   -  person kl.    schedule 27.01.2010
comment
О, извините, я пропустил, что каждый треугольник имеет общую две вершины, теперь это кажется довольно очевидным...   -  person BlueRaja - Danny Pflughoeft    schedule 27.01.2010
comment
Непонятно, какое это имеет отношение к Cuda. Вы можете кодировать ядра Cuda на C.   -  person Die in Sente    schedule 27.01.2010


Ответы (2)


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

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

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

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

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

person Die in Sente    schedule 27.01.2010

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

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

person John    schedule 26.01.2010
comment
спасибо, я знаю, что нет проблем с реализацией в ansi-c. но как насчет ядра cuda? - person kl.; 27.01.2010
comment
Cuda поддерживает C, не так ли? Если это так, просто используйте их компилятор, и, вероятно, он сделает достойную работу... - person BlueRaja - Danny Pflughoeft; 27.01.2010
comment
Я не думаю, что это правильно. В общем, P3-P1-P4 и P3-P2-P4 дадут вам два разных угла, и ни один из них не является углом между двумя плоскостями. Например, пусть P1 = (1, 1000000, 0) P2 = (1, -1000000, 0) P3 = (0, 0, 0) P4 = (0, 0, 1) - person Die in Sente; 27.01.2010