Рассчитайте угол между двумя треугольниками в CUDA
-
22-09-2019 - |
Вопрос
Я хотел рассчитать угол между двумя треугольниками в трехмерном пространстве. Два треугольника всегда будут делиться ровно двумя точками. например
Треугольник 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?
Решение
Для каждой плоскости необходимо построить его нормальный вектор (перпендикулярно всем линиям в этой плоскости). Простой способ сделать это состоит в том, чтобы взять поперечный продукт двух непараллельных линий в треугольнике. (Ex (P3-P1) Икс (P2-P1) и (P4-P1) Икс (P2-P1).
Нормализовать их.
Точечный продукт этих двух векторов направления дает вам косинус угла.
Хитрое - следить за дегенерированными треугольниками! Если все 3 точки, определяющие любой треугольник, являются колинеарными (этот треугольник-это просто линия), то то, о чем вы просите, не определено, а перекрестный продукт будет делиться на ноль. Вы должны решить, что вы собираетесь делать в этом случае.
Поскольку вы пытаетесь сделать это на графическом процессоре, вы в идеале захотите написать эту функцию без каких -либо ветвей, если вы обеспокоены эффективностью. Это означало бы вместо тестирования на вырожденные треугольники с if
пункт, вы должны попытаться сделать это с тройным A ? B : C
Другие советы
Угол между треугольниками такой же, как и угол между плоскостями, определенными тремя точками каждого треугольника.
Поскольку обе точки 1 или точка 2 лежат в обеих плоскостях, выясните направление косинусов из одной из этих точек до точки 3, а затем в точке 4. Затем косинус угла между этими двумя линиями - это только сумма продуктов соответствующего направления косинусов.