2010-01-26 21 views
0

Je voulais calculer l'angle entre deux triangles dans l'espace 3D. Les deux triangles partageront toujours exactement deux points. par exemple.Calculer l'angle entre deux triangles dans CUDA

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

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

Existe-t-il un moyen de calculer l'angle entre eux efficacement dans CUDA?

+0

Je crains que vous allez devoir définir * "degré entre eux" * pour moi - faire vous voulez dire l'angle entre leurs plans respectifs? –

+0

oui, entre les plans respectifs –

+0

Oh désolé j'ai raté que chaque triangle partage * deux * points, semble plutôt évident maintenant ... –

Répondre

3

Pour chaque plan, vous devez construire son vecteur normal (perpendiculaire à toutes les lignes dans ce plan). La façon simple de faire cela est de prendre le produit croisé de deux lignes non parallèles dans le triangle. (Ex (P3-P1) X (P2-P1) et (P4-P1) X (P2-P1).

Normaliser ceux-ci.

Le produit scalaire de ces deux vecteurs de direction donne Le point délicat est de faire attention aux triangles dégénérés: si les 3 points qui définissent l'un ou l'autre des triangles sont colinéaires (ce triangle n'est qu'une ligne), alors ce que vous demandez n'est pas défini, et le produit croisé va diviser par zéro.Vous devez décider ce que vous allez faire dans ce cas

Puisque vous essayez de faire cela sur un GPU, vous aurez idéalement envie d'écrire cette fonction sans branches, si vous êtes préoccupé par l'efficacité. Cela signifierait au lieu de tester des triangles dégénérés avec une clause if, vous devriez essayer et le faire avec un ternaire A ? B : C

1

L'angle entre les triangles est le même que l'angle entre les plans définis par les trois points de chaque triangle. Puisque le point 1 ou le point 2 se trouvent dans les deux plans, calculez les cosinus de direction d'un de ces points au point 3, puis au point 4. Ensuite, le cosinus de l'angle entre ces deux lignes est juste le somme des produits des cosinus de direction correspondants.

+0

merci, je sais que pas de problème pour l'implémenter en ansi-c. mais qu'en est-il de cuda kernel? –

+0

Que je ne sais pas. – John

+0

merci quand même! :) –