Qu'est-ce qu'une formule pour obtenir un vecteur tridimensionnel b couché sur le plan perpendiculaire à un vecteur A? p>
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? P>
6 Réponses :
Calculez le Produit croisé Il existe de nombreuses directions possibles dans le plan perpendiculaires à Axc code> avec un autre vecteur
C code> qui n'est pas colinéaire avec
A code>.
A code>. Si vous ne vous souciez pas vraiment, lequel choisir, créez simplement un vecteur arbitraire
C code> non colinéaire avec
A code>: p>
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.
Si les deux vecteurs sont perpendiculaires, leur produit DOT est zéro.
donc: vous savez être Conscient si v1 (x1, y1, z1), v2 (x2, y2, z2) p>. p>. P>.
(x1, y1, z1) code>. Mettre arbitraire
x2 code> et
y2 code> et vous recevrez le
Z2 correspondant code>: p>
z1 code> est
0 code>. Ensuite, vous êtes dans l'avion. P> P>
Oui. Vous avez un vecteur donné v1 (x1, y1, z1) code>.
Comme vous le mentionnez, cela échoue si z1 code> est 0, mais la question reste parfaitement mathématiquement valable dans un tel cas. Trouvez un vecteur perpendiculaire à [1,0,0], par exemple.
z1 code> 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.
Une solution serait de trouver une transformation de rotation de l'axe z positif (ou de tout autre axe) à votre vecteur donné. Puis transformer Pour calculer la matrice de rotation, voir cet article : WP: Matrix de rotation de l'axe et de l'angle P> Une autre méthode serait d'utiliser rotation du quaternion a>. C'est un peu plus d'envelopper votre tête, mais c'est moins de chiffres à garder une trace de. P> p>
function (a,b,c) { return c<a ? (b,-a,0) : (0,-c,b) }
Juste pour référence, j'ai enfermé jusqu'à 10 000 vecteurs d'unité aléatoires et assurez-vous que point (VEC, ci-dessus) == 0 code> pour tous les vecteurs (j'étais trop paresseux pour essayer de valider la stabilité Analyticalement, c'était donc ma prochaine meilleure option). Cela a fonctionné parfaitement.
Si le vecteur est par exemple (A = 0, B = 0, C = -1), C
@Giovannifunchunchs en effet, la déclaration "Max (A, B, C) ne devrait pas être proche de zéro" peut être fausse même pour "bon" vecteurs, comme celui que vous mentionnez. L'explication doit être corrigée à l'aide de la norme L-Infinity au lieu de MAX, et C
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)));
}
Ajout de l'explication, espérons que cela aide.
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)
Deux choses: premièrement, sommes-nous en train de fonctionner en deux dimensions? Trois?
n code>? 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.