11
votes

Qu'est-ce qu'une formule pour obtenir un vecteur perpendiculaire à un autre vecteur?

Qu'est-ce qu'une formule pour obtenir un vecteur tridimensionnel b couché sur le plan perpendiculaire à un vecteur A?

C'est-à-dire, étant donné un vecteur A, quelle est une formule F (angle, module) qui donne un vecteur perpendiculaire à A, avec ledit module et tourné à travers un angle?


2 commentaires

Deux choses: premièrement, sommes-nous en train de fonctionner en deux dimensions? Trois? n ? Deuxièmement, votre titre indique "perpendiculaire" mais le corps de la question dit "pivoté par un angle" - cet angle sera-t-il jamais âgé d'autre que quatre-vingt-dix degrés?


En 3 dimensions, il y a infiniment de nombreux vecteurs différents (un espace vectoriel 2 dimensionnel) perpendiculaire à un vecteur donné. Il n'y a pas de vecteur unique qu'une formule générerait.


6 Réponses :


8
votes

Calculez le Produit croisé Axc avec un autre vecteur C qui n'est pas colinéaire avec A .

Il existe de nombreuses directions possibles dans le plan perpendiculaires à A . Si vous ne vous souciez pas vraiment, lequel choisir, créez simplement un vecteur arbitraire C non colinéaire avec A : xxx


2 commentaires

Il n'y a qu'un seul vecteur, je veux une formule qui donne un vecteur qui est perpendiculaire à celui-ci en fonction de son angle et de la longueur.


Dokkat, la raison pour laquelle vous continuez à saisir deux vecteurs dans la description est parce que, étant donné le premier vecteur V1, il existe de nombreux vecteurs v2 perpendiculaires à V1. Dans l'espace 2D, il y a au moins deux vecteurs de ce type avec la longueur 1. Dans l'espace 3D, il y a infiniment de nombreux vecteurs perpendiculaires à V1! Ce que vous voulez trouver, c'est un seul v2 arbitraire (perp to v1) ou que vous souhaitez détecter si (v1, v2) sont perpendiculaires.



15
votes

Si les deux vecteurs sont perpendiculaires, leur produit DOT est zéro.

donc: v1 (x1, y1, z1), v2 (x2, y2, z2) . . . xxx

vous savez (x1, y1, z1) . Mettre arbitraire x2 et y2 et vous recevrez le Z2 correspondant : xxx

être Conscient si z1 est 0 . Ensuite, vous êtes dans l'avion.


2 commentaires

Oui. Vous avez un vecteur donné v1 (x1, y1, z1) .


Comme vous le mentionnez, cela échoue si z1 est 0, mais la question reste parfaitement mathématiquement valable dans un tel cas. Trouvez un vecteur perpendiculaire à [1,0,0], par exemple. z1 est 0, mais [0,1,0] est très définitivement un vecteur qui est néanmoins perpendiculaire à [1,0,0]. Voir ma réponse pour une méthode alternative.



2
votes

Une solution serait de trouver une transformation de rotation de l'axe z positif (ou de tout autre axe) à votre vecteur donné. Puis transformer à l'aide de cette transformation. xxx

Pour calculer la matrice de rotation, voir cet article : WP: Matrix de rotation de l'axe et de l'angle

Une autre méthode serait d'utiliser rotation du quaternion . C'est un peu plus d'envelopper votre tête, mais c'est moins de chiffres à garder une trace de.


0 commentaires


4
votes

Je crois que cela devrait produire un vecteur arbitraire qui est perpendiculaire au vecteur donné VEC code> tout en restant numériquement stable indépendamment de l'angle de VEC code> (supposant que la magnitude de VEC code> n'est pas proche de zéro). Supposons que VEC3D est un vecteur tridimensionnel de type numérique arbitraire.

Vec3D arbitrary_orthogonal(Vec3D vec)
{
  bool b0 = (vec[0] <  vec[1]) && (vec[0] <  vec[2]);
  bool b1 = (vec[1] <= vec[0]) && (vec[1] <  vec[2]);
  bool b2 = (vec[2] <= vec[0]) && (vec[2] <= vec[1]);

  return cross(vec, Vec3D(int(b0), int(b1), int(b2)));
}


1 commentaires

Ajout de l'explication, espérons que cela aide.



2
votes

Q4W56 est presque là pour une solution robuste. Problèmes: 1) ne prend pas en compte la mise à l'échelle du compte. 2) Ne comparez pas la magnitude entre deux variables quand elle devrait.

scale = |x| + |y| + |z|

if scale == 0:
  return (0,0,0)

x = x/scale
y = y/scale
z = z/scale

if |x| > |y|:
  return (z, 0,-x)
else:
  return (0, z,-y)


0 commentaires