Question

De wikipedia:

  

le produit croisé est une opération binaire sur deux vecteurs dans un espace tridimensionnel qui aboutit à un autre vecteur perpendiculaire au plan contenant les deux vecteurs en entrée.

Étant donné que la définition n'est définie que par trois ( ou sept, un, et zéro ) dimensions, 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 consiste en un calcul entre deux vecteurs).

Mise en oeuvre 1 (retourne un scalaire):

float CrossProduct(const Vector2D & v1, const Vector2D & v2) const
{
    return (v1.X*v2.Y) - (v1.Y*v2.X);
}

Mise en oeuvre 2 (retourne un vecteur):

Vector2D CrossProduct(const Vector2D & v) const
{
    return Vector2D(v.Y, -v.X);
}

Pourquoi les différentes implémentations? Pourquoi utiliser l'implémentation scalaire? Pour quoi devrais-je utiliser l'implémentation vectorielle?

Je pose la question parce que j'écris moi-même une classe Vector2D et que je ne sais pas quelle méthode utiliser.

Était-ce utile?

La solution

La mise en oeuvre 1 renvoie la magnitude du vecteur qui résulterait d'un produit 3D croisé régulier des vecteurs d'entrée, en prenant leurs valeurs Z implicitement à 0 (c'est-à-dire en traitant l'espace 2D comme un plan de l'espace 3D). Le produit 3D en croix sera perpendiculaire à ce plan et aura donc 0 X & amp; Composants Y (le scalaire renvoyé est donc la valeur Z du vecteur produit 3D croisé).

Notez que la magnitude du vecteur résultant du produit vectoriel 3D est également égale à la zone du parallélogramme entre les deux vecteurs, ce qui donne un autre objectif à la mise en oeuvre 1. De plus, cette zone est signée et peut être utilisée pour déterminer si la rotation de V1 à V2 se fait dans le sens contraire des aiguilles d’une montre ou dans le sens des aiguilles d’une montre. Il convient également de noter que la mise en œuvre 1 est le déterminant de la matrice 2x2 construite à partir de ces deux vecteurs.

La mise en oeuvre 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 dans le champ "me donner un vecteur perpendiculaire" sens.

Notez que l’espace euclidien 3D est fermé sous l’opération 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 vous aidera ...

Autres conseils

En bref: il s'agit d'une notation abrégée pour un hack mathématique.

Explication longue:

Vous ne pouvez pas créer un produit croisé avec des vecteurs dans un espace 2D. L'opération n'est pas définie ici.

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 manière et calculez le produit croisé d'une telle paire de vecteurs étendue, vous remarquerez que seule la composante z a une valeur explicite: x et y seront toujours égaux à zéro.

C'est la raison pour laquelle la composante z du résultat est souvent simplement retournée sous forme de scalaire. Ce scalaire peut par exemple être utilisé pour trouver l’enroulement de trois points dans un 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 ().

La mise en œuvre 1 est le produit scalaire des deux vecteurs. La meilleure référence que je connaisse pour les graphiques 2D est l’excellente série Gems Graphiques . Si vous effectuez un travail de scratch en 2D, il est essentiel de disposer de ces livres. Le volume IV contient un article intitulé "Les plaisirs de Perp Dot Products". cela passe par de nombreuses utilisations.

Une des principales utilisations du produit scalaire est d'obtenir la mise à l'échelle sin de l'angle entre les deux vecteurs, tout comme le produit scalaire . renvoie le cos mis à l'échelle de l'angle. Vous pouvez bien sûr utiliser produit scalaire et produit perforatif pour déterminer l'angle entre deux vecteurs.

Voici un article à ce sujet et < a href = "http://mathworld.wolfram.com/PerpDotProduct.html" rel = "nofollow"> voici l'article de Wolfram Math World.

J'utilise 2d cross product dans mon calcul pour trouver la nouvelle rotation correcte d'un objet sur lequel un vecteur de force agit sur un point arbitraire par rapport à son centre de masse. (Le Z scalaire.)

Une opération de vecteur 2D utile est un produit croisé qui renvoie un scalaire. Je l'utilise pour voir si deux arêtes successives d'un polygone se plient à gauche ou à droite.

De la source de 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;
}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top