2008-10-28 148 views
55

維基百科:計算二維矢量的交叉積

叉積是在導致另一種載體,其是垂直於包含平面的三維歐幾里得空間上的兩個向量的二進制運算兩個輸入向量。

鑑於定義僅在三維(or seven, one and zero)維中定義,如何計算兩個2d向量的叉積?

我見過兩種實現。一個返回一個新的向量(但只接受一個向量),另一個返回一個標量(但是是兩個向量之間的計算)。

實施1(返回標):

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

實施2(返回一個向量):

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

爲什麼變化實現?我會用什麼標量實現?我會如何使用矢量實現?

我問的原因是我自己寫了一個Vector2D類,不知道使用哪種方法。

+5

實現2是錯誤的。你需要兩個向量來構成一個交叉產品。 – bobobobo 2009-06-24 17:37:02

+6

實現2將給定矢量_v_旋轉-90度。 'x'中的取代基-90 =xcosθ-ysinθ`和`y'=xsinθ+ycosθ`。這個實現的另一個變體是`返回Vector2D(-v.Y,v.X);`它旋轉+90度。 – legends2k 2013-02-15 08:19:24

+0

@ legends2k:值得注意的是,實現2是[使用行列式來評估交叉產品]的擴展(https://en.wikipedia。org/wiki/Cross_product#Matrix_notation):只刪除最後一行和一列。這樣的擴展總是有`N`尺寸的`N-1`操作數。 – 2015-10-29 19:01:02

回答

84

實施方式1返回將從輸入向量的規則3D叉積導致的向量的量值,其Z值隱式地取爲0(即,將2D空間視爲3D空間中的平面)。 3D交叉產品將垂直於該平面,因此具有0個分量(因此標量返回是3D交叉積向量的Z值)。

注意,從3D叉積產生的向量的大小也等於兩個向量之間的平行四邊形,其給出實施1另一目的的區域。此外,該區域有符號並可用於確定從V1到V2的旋轉是以逆時針方向還是順時針方向移動。還應該注意的是,實現1是由這兩個向量構建的2x2矩陣的行列式。

實現2返回一個垂直於仍然在同一個2D平面上的輸入向量的向量。不是經典意義上的交叉產品,而是「給我垂直向量」意義上的一致。

請注意,3D交叉乘積運算下的歐幾里得空間是閉合的 - 也就是說,兩個3D矢量的叉積返回另一個3D矢量。上述的2D實現都與這種或那種方式不一致。

希望這有助於...

41

簡而言之:這是一個數學黑客速記符號。

龍解釋:

你不能做一個跨產品,在二維空間中的向量。該操作沒有在那裏定義。

然而,常常令人感興趣的是評估兩個向量假設2D矢量,通過設置它們的z座標,以零擴展到3D的叉積。這與使用xy平面上的3D矢量相同。

如果擴展這種方式,載體和計算這樣的擴展向量對的叉積你會發現,只有z分量具有有意義的值:x和y將始終爲零。

這就是爲什麼結果的z分量往往是簡單地返回一個標量的原因。這個標量例如可以用來找到二維空間中三個點的纏繞。

從圖2D空間中的叉積不存在的純數學的點,標量版本是黑客和一個返回2D矢量是沒有意義的,在所有2D橫產物。

9

橫產品的另一個有用的特性是它的大小與角度的兩個向量之間的正弦:

| a x b | = | a | 。 | B | 。正弦(THETA)

正弦(THETA)= | a x b | /(| A |。| B |)

因此,在實施上述1中,如果ab預先已知是單位矢量則該函數的結果正是正弦()值。

3

我用我的計算2D橫產品找到正在被任意相對於它的質量中心的點作用於由力矢量對象的新的正確的旋轉。 (標量Z 1)

3

實現1是兩個向量的perp dot產品。我所知道的2D圖形的最佳參考是優秀的Graphics Gems系列。如果你正在從事2D工作,那麼真的是這些書很重要。第四卷有一篇名爲「Perp Dot產品的樂趣」的文章,其中有很多用處。

一個主要用途PERP點積的是獲得縮放的兩個向量之間的角度sin,就像返回角度的換算cos。當然,您可以使用點積perp dot產品一起確定兩個向量之間的角度。

Here是一篇文章,here是Wolfram Math World的文章。