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?

Foi útil?

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top