2011-10-13 2 views
1

Je suis à la recherche d'un moyen simple et efficace pour résoudre le problème suivant:Construct une base orthonormé donné un seul vecteur en 3D

J'ai un vecteur en 3D et je veux obtenir une base orthonormé (x, y, z) où l'un des vecteurs de base (disons x) est le vecteur donné. Je cherche donc deux vecteurs, perpendiculaires l'un à l'autre, qui sont aussi perpendiculaires à mon vecteur donné.

Je sais que cela a infinie de nombreuses solutions, mais je me fous de ce que j'obtiens, tant qu'il satisfait aux exigences ci-dessus et qu'il est simple et efficace.

+0

Pourquoi testez-vous pour dot (x, u) ~ = 0? –

Répondre

0

Appelons x votre vecteur unitaire. Appelez u = (1,0,0). Si dot(u,x) ~= 0, prenez u = (0,1,0). Ensuite, y = x^u et z = x^y.

+0

Merci, cela fonctionne. J'ai utilisé votre solution avec une petite modification: j'ai mis 'u = (-x1, x0, x2)' pour éviter le if. Cela devrait fonctionner tant que les vecteurs '(x0, x1, x2)' et '(-x1, x0, x2)' sont linéairement indépendants, ce qui, intuitivement, semble être le cas (et un test sur d'énormes supports de données aléatoires il). – adam

+1

Je ne suis pas d'accord sur votre choix de vecteur «u»: 'point ((x0, x1, x2), (-x1, x0, x2)) = -x0.x1 + x0.x1 + x2.x2 = x2.x2'. Donc cela ne fonctionne que si 'x2! = 0'. Je ne pense pas qu'il soit sûr d'utiliser ce vecteur. – tibur

+0

Non, j'utilise le vecteur ** u ** uniquement pour m'aider à calculer ** y ** et ** z ** comme ceci: 'u = (-x1, x0, x2); y = x^u; z = y^u' donc je n'ai pas besoin qu'il soit perpendiculaire à ** x **, seulement linéairement indépendant. – adam

0

Pour se débarrasser de ce Tibur si, vous pouvez obtenir une légère amélioration en utilisant un pas cher (er) mul + flotteur moulé

y = x^u 
y.z += float(y==0); // this changes a zero-vector into (0,0,1) 
z = x^y 

Faire un vecteur comparer après celui du produit vous donne une solution plus stable que de vérifier si u == x, la distribution float dépend de votre architecture, mais fonctionne dans la plupart des compilateurs/plates-formes. Fondamentalement, ce type de fonction de base aura toujours une singularité lorsque x est co-linéaire avec u, alors essayez de vous débrouiller dans le contexte, rappelez-vous que vous n'avez pas besoin d'être une constante. Dans la plupart des cas, vous pouvez choisir u pour coïncider avec un cas trivial afin de lisser la singularité et garder votre transformation globale stable.

Questions connexes