Calcule o ângulo entre dois triângulos em Cuda
-
22-09-2019 - |
Pergunta
Eu queria calcular o ângulo entre dois triângulos no espaço 3D. Os dois triângulos sempre compartilharão exatamente dois pontos. por exemplo
Triângulo 1:
Point1 (x1, y1, z1),
Point2 (x2, y2, z2),
Point3 (x3, y3, z3).
Triângulo 2:
Point1 (x1, y1, z1),
Point2 (x2, y2, z2),
Point4 (x4, y4, z4).
Existe uma maneira de calcular o ângulo entre eles com eficiência no CUDA?
Solução
Para cada plano, você precisa construir seu vetor normal (perpendicular a todas as linhas nesse plano). A maneira simples de fazer isso é pegar o produto cruzado de duas linhas não paralelas no triângulo. (Ex (P3-P1) X (P2-P1) e (P4-P1) X (P2-P1).
Normalize esses.
O produto DOT desses dois vetores de direção fornece o cosseno do ângulo.
A parte complicada é observar os triângulos degenerados! Se todos os 3 pontos que definem o triângulo são colineares (esse triângulo é apenas uma linha), o que você está pedindo é indefinido, e o produto cruzado se dividirá por zero. Você precisa decidir o que vai fazer nesse caso.
Como você está tentando fazer isso em uma GPU, idealmente, você desejará escrever essa função sem ramificações, se estiver preocupado com a eficiência. Isso significaria em vez de testar triângulos degenerados com um if
Cláusula, você deve tentar fazer isso com um ternário A ? B : C
Outras dicas
O ângulo entre os triângulos é o mesmo que o ângulo entre os planos definido pelos três pontos de cada triângulo.
Como o ponto 1 ou o ponto 2 está em ambos os planos, descubra a direção dos cossenos de um desses pontos para o ponto 3 e depois para o ponto 4. Então, o cosseno do ângulo entre essas duas linhas é apenas a soma dos produtos dos cossenos de direção correspondentes.