Calcul du produit croisé D'un vecteur 2D
Wikipédia:
Le produit croisé est une opération binaire sur deux vecteurs dans un espace euclidien tridimensionnel qui aboutit à un autre vecteur perpendiculaire au plan contenant les deux vecteurs d'entrée.
É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. On retourne un nouveau vecteur (mais n'accepte qu'un seul vecteur), l'autre retourne un scalaire (mais c'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? À quoi devrais-je utiliser l'implémentation scalaire? À quoi devrais-je utiliser l'implémentation vectorielle?
La raison pour laquelle je demande est parce que j'écris moi-même une classe Vector2D et que je ne sais pas quelle méthode utiliser.
6 réponses
L'implémentation 1 renvoie la grandeur 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 des composants 0 X & Y (ainsi le scalaire retourné est la valeur Z du vecteur de produit croisé 3D).
Notez que l'amplitude du vecteur résultant du produit croisé 3D est également égale à Zone du parallélogramme entre les deux vecteurs, ce qui donne à L'implémentation 1 un autre but. En outre, 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é dans le sens classique mais cohérent dans le sens" donnez-moi un vecteur perpendiculaire".
Notez que L'espace euclidien 3D est fermé sous l'opération cross product-c'est-à-dire qu'un cross product de deux vecteurs 3D renvoie un autre vecteur 3D. Les deux 2D implémentations sont incompatibles avec qui d'une manière ou d'une autre.
J'espère que cela aide...
En bref: C'est une notation abrégée pour une mathématique hack.
Longue explication:
Vous ne pouvez pas faire un produit croisé avec des vecteurs dans L'espace 2D. L'opération n'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 à 3D en mettant leur coordonnée z à zéro. C'est la même chose que de travailler avec des vecteurs 3D sur le plan xy.
Si vous étendez les vecteurs chemin et calculer le produit croisé d'une telle paire de vecteurs étendus, vous remarquerez que seul le composant z a une valeur significative: x et y seront toujours zéro.
C'est la raison pour laquelle la composante z du résultat est souvent simplement retourné comme un scalaire. Ce scalaire peut être utilisé par exemple pour trouver l'enroulement de trois points dans l'espace 2D.
D'un point de vue mathématique pur 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 grandeur est liée au sinus de l'angle entre les deux vecteurs:
/ a X b / = / a/. |b| . sine (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, alors le résultat de cette fonction est exactement cette valeur sine ().
L'implémentation 1 est le produit perp 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 du scratch 2D, il est vraiment important d'avoir ces livres. Le Volume IV a un article intitulé "Les Plaisirs des produits Perp Dot" qui passe en revue beaucoup d'utilisations pour cela.
Une plus grande utilisation de perp produit scalaire est d'obtenir à l'échelle sin
de l'angle entre les deux vecteurs, comme le produit scalaire retourne à l'échelle cos
de l'angle. Bien sûr, vous pouvez utiliser produit scalaire et perp produit scalaire, ensemble, pour déterminer l'angle entre deux vecteurs.
Ici est un post sur elle et ici est le Wolfram Mathématiques Monde article.
Une opération vectorielle 2D utile est un produit croisé qui renvoie un scalaire. Je l'utilise pour voir si deux bords successifs dans un polygone se plient à gauche ou à droite.
De la sourceChipmunk2D :
/// 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;
}