Berekening van het Cross-product van een 2D-vector

Vanaf Wikipedia:

Het kruisproduct is een binaire bediening op twee vectoren in een driedimensionaal Euclidische ruimte die resulteert in een andere vector die loodrecht staat op het vlak met de twee ingangsvectoren.

Aangezien de definitie alleen in drie wordt gedefinieerd (of zeven, één en nul ) Afmetingen, hoe berekent men het kruisproduct van twee 2D-vectoren?

Ik heb twee implementaties gezien. Men geeft een nieuwe vector terug (accepteert alleen een enkele vector), de andere retourneert een scalaire (maar is een berekening tussen twee vectoren).

Implementatie 1 (retourneert een scalair):

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

Implementatie 2 (retourneert een vector):

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

Waarom de verschillende implementaties? Waarmee gebruik ik de scalaire implementatie voor? Waarmee gebruik ik de vectorimplementatie voor?

De reden waarom ik het vraag is, is omdat ik zelf een vector2d-klasse schrijf en weet niet welke methode om te gebruiken.


Antwoord 1, Autoriteit 100%

Implementatie 1 retourneert de omvang van de vector die zou resulteren uit een normaal 3D-kruisproduct van de ingangsvectoren, waarbij ze hun Z-waarden impliciet zijn als 0 (d.w.z. behandelen van de 2D-ruimte als een vlak in de 3D-ruimte). Het 3D-kruisproduct zal loodrecht op dat vlak staan ​​en hebben dus 0 x & amp; Y-componenten (dus de geretourneerde Scalar is de Z-waarde van de 3D Cross-productvector).

Merk op dat de grootte van de vector die resulteert uit het 3D-kruisproduct ook gelijk is aan het gebiedvan het parallellogram tussen de twee vectoren, wat Implementatie 1 een ander doel geeft. Bovendien is dit gebied ondertekend en kan worden gebruikt om te bepalen of het roteren van V1 naar V2 tegen de klok in of tegen de klok in beweegt. Er moet ook worden opgemerkt dat implementatie 1 de determinant is van de 2×2-matrix die is opgebouwd uit deze twee vectoren.

Implementatie 2 retourneert een vector loodrecht op de invoervector die zich nog steeds in hetzelfde 2D-vlak bevindt. Geen kruisproduct in de klassieke zin, maar consistent in de zin van “geef me een loodrechte vector”.

Merk op dat de 3D-euclidische ruimte gesloten is onder de kruisproductbewerking – dat wil zeggen, een kruisproduct van twee 3D-vectoren retourneert een andere 3D-vector. Beide bovenstaande 2D-implementaties zijn daar op de een of andere manier niet mee in overeenstemming.

Hopelijk helpt dit…


Antwoord 2, autoriteit 66%

Kortom:het is een verkorte notatie voor een wiskundige hack.

Lange uitleg:

Je kunt geen kruisproduct maken met vectoren in de 2D-ruimte. De bewerking is daar niet gedefinieerd.

Het is echter vaak interessant om het uitwendige product van twee vectoren te evalueren, ervan uitgaande dat de 2D-vectoren worden uitgebreid tot 3D door hun z-coördinaat op nul te zetten. Dit is hetzelfde als werken met 3D-vectoren op het xy-vlak.

Als je de vectoren op die manier uitbreidt en het uitwendige product van zo’n uitgebreid vectorpaar berekent, zul je merken dat alleen de z-component een betekenisvolle waarde heeft: x en y zullen altijd nul zijn.

Dat is de reden waarom de z-component van het resultaat vaak simpelweg wordt geretourneerd als een scalaire waarde. Deze scalaire waarde kan bijvoorbeeld worden gebruikt om de winding van drie punten in de 2D-ruimte te vinden.

Vanuit een puur wiskundig oogpunt bestaat het kruisproduct in de 2D-ruimte niet, de scalaire versie is de hack en een 2D-kruisproduct dat een 2D-vector retourneert, heeft geen enkele zin.


Antwoord 3, autoriteit 11%

Een andere nuttige eigenschap van het uitwendig product is dat de grootte ervan gerelateerd is aan de sinus van de hoek tussen de twee vectoren:

| a x b | = |a| . |b| . sinus(theta)

of

sinus(theta) = | a x b | / (|a| . |b|)

Dus, in implementatie 1 hierboven, als van tevoren bekend is dat aen beenheidsvectoren zijn, dan is het resultaat van die functie precies die sinus()-waarde.


Antwoord 4, autoriteit 4%

Implementatie 1 is het perp dot productvan de twee vectoren. De beste referentie die ik ken voor 2D-graphics is de uitstekende serie Graphics Gems. Als je scratch 2D-werk doet, is het echtbelangrijk om deze boeken te hebben. Volume IV heeft een artikel genaamd “The Pleasures of Perp Dot Products” dat er veel gebruik van maakt.

Een belangrijk gebruik van perp dot productis om de geschaalde sinvan de hoek tussen de twee vectoren te krijgen, net als het dot productgeeft de geschaalde cosvan de hoek terug. Natuurlijk kun je dot producten perp dot productsamen gebruiken om de hoek tussen twee vectoren te bepalen.

Hieris er een bericht over en hieris het artikel over Wolfram Math World.


Antwoord 5, autoriteit 4%

Een bruikbare 2D-vectorbewerking is een uitwendig product dat een scalair retourneert. Ik gebruik het om te zien of twee opeenvolgende randen in een polygoon naar links of rechts buigen.

Van de Chipmunk2Dbron:

/// 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;
}

Antwoord 6, autoriteit 3%

Ik gebruik in mijn berekening 2D-uitwendig product om de nieuwe juiste rotatie te vinden voor een object waarop een krachtvector op een willekeurig punt ten opzichte van zijn massamiddelpunt inwerkt. (De scalaire Z één.)

Other episodes