De wikipedia:
le produit croisé est une opération binaire sur deux vecteurs dans un espace euclidien tridimensionnel qui se traduit par un autre vecteur perpendiculaire au plan contenant les deux entrées vecteurs.
Étant donné que la définition n'est définie qu'en trois dimensions ( ou sept, une et zéro ), comment calcule-t-on le produit croisé de deux vecteurs 2D?
J'ai vu deux implémentations. L'un renvoie un nouveau vecteur (mais n'accepte qu'un seul vecteur), l'autre renvoie un scalaire (mais est un calcul entre deux vecteurs).
Implémentation 1 (retourne un scalaire):
float CrossProduct(const Vector2D & v1, const Vector2D & v2) const
{
return (v1.X*v2.Y) - (v1.Y*v2.X);
}
Implémentation 2 (retourne un vecteur):
Vector2D CrossProduct(const Vector2D & v) const
{
return Vector2D(v.Y, -v.X);
}
Pourquoi les différentes implémentations? Pour quoi utiliser l'implémentation scalaire? Pour quoi utiliser l'implémentation vectorielle?
La raison pour laquelle je demande, c'est parce que j'écris moi-même une classe Vector2D et que je ne sais pas quelle méthode utiliser.
L'implémentation 1 renvoie la magnitude du vecteur qui résulterait d'un produit croisé 3D régulier des vecteurs d'entrée, en prenant implicitement leurs valeurs Z comme 0 (c'est-à-dire en traitant l'espace 2D comme un plan dans l'espace 3D). Le produit croisé 3D sera perpendiculaire à ce plan, et aura donc 0 composantes X & Y (donc le scalaire renvoyé est la valeur Z du vecteur de produit croisé 3D).
Notez que la magnitude du vecteur résultant du produit croisé 3D est également égale à la zone du parallélogramme entre les deux vecteurs, ce qui donne à l'implémentation 1 un autre objectif. De plus, cette zone est signée et peut être utilisée pour déterminer si la rotation de V1 à V2 se déplace dans le sens antihoraire ou dans le sens horaire. Il convient également de noter que l'implémentation 1 est le déterminant de la matrice 2x2 construite à partir de ces deux vecteurs.
L'implémentation 2 renvoie un vecteur perpendiculaire au vecteur d'entrée toujours dans le même plan 2D. Pas un produit croisé au sens classique mais cohérent au sens "donne-moi un vecteur perpendiculaire".
Notez que l'espace euclidien 3D est fermé sous l'opération de produit croisé - c'est-à-dire qu'un produit croisé de deux vecteurs 3D renvoie un autre vecteur 3D. Les deux implémentations 2D ci-dessus sont incompatibles avec cela d'une manière ou d'une autre.
J'espère que cela t'aides...
En bref: C'est une notation abrégée pour un hack mathématique.
Longue explication:
Vous ne pouvez pas faire un produit croisé avec des vecteurs dans l'espace 2D. L'opération n'y est pas définie.
Cependant, il est souvent intéressant d'évaluer le produit croisé de deux vecteurs en supposant que les vecteurs 2D sont étendus en 3D en définissant leur coordonnée z à zéro. Cela revient à travailler avec des vecteurs 3D sur le plan xy.
Si vous étendez les vecteurs de cette façon et calculez le produit croisé d'une telle paire de vecteurs étendue, vous remarquerez que seule la composante z a une valeur significative: x et y seront toujours nuls.
C'est la raison pour laquelle la composante z du résultat est souvent simplement renvoyée sous forme scalaire. Ce scalaire peut par exemple être utilisé pour trouver l'enroulement de trois points dans l'espace 2D.
D'un point de vue purement mathématique, le produit croisé dans l'espace 2D n'existe pas, la version scalaire est le hack et un produit croisé 2D qui renvoie un vecteur 2D n'a aucun sens.
Une autre propriété utile du produit croisé est que sa magnitude est liée au sinus de l'angle entre les deux vecteurs:
| a x b | = | a | . | b | . sinus (thêta)
ou
sinus (thêta) = | a x b |/(| a |. | b |)
Ainsi, dans l'implémentation 1 ci-dessus, si a
et b
sont connus à l'avance pour être des vecteurs unitaires, le résultat de cette fonction est exactement cette valeur sine ().
L'implémentation 1 est le produit dot dot des deux vecteurs. La meilleure référence que je connaisse pour les graphiques 2D est l'excellente série Graphics Gems . Si vous faites un travail 2D à gratter, il est vraiment important d'avoir ces livres. Le volume IV contient un article intitulé "Les plaisirs des produits Perp Dot" qui en recense de nombreuses utilisations.
Une utilisation majeure du produit perp dot est d'obtenir l'échelle sin
de l'angle entre les deux vecteurs, tout comme le produit scalaire retourne l'échelle cos
de l'angle. Bien sûr, vous pouvez utiliser produit scalaire et produit scalaire perp ensemble pour déterminer l'angle entre deux vecteurs.
Ici est un article à ce sujet et ici est l'article de Wolfram Math World.
J'utilise le produit croisé 2D dans mon calcul pour trouver la nouvelle rotation correcte pour un objet qui est soumis à l'action d'un vecteur de force à un point arbitraire par rapport à son centre de masse. (Le scalaire Z.)
Une opération vectorielle 2D utile est un produit croisé qui renvoie un scalaire. Je l'utilise pour voir si deux arêtes successives dans un polygone se plient à gauche ou à droite.
De la source Chipmunk2D :
/// 2D vector cross product analog.
/// The cross product of 2D vectors results in a 3D vector with only a z component.
/// This function returns the magnitude of the z value.
static inline cpFloat cpvcross(const cpVect v1, const cpVect v2)
{
return v1.x*v2.y - v1.y*v2.x;
}