2015-09-30 86 views
2

我迷路了。我一直試圖在以下位置實現此代碼:http://www.blackpawn.com/texts/pointinpoly/default.html該代碼如何從兩個2D矢量的叉積中檢索2D矢量?

但是,我不知道在兩個2D矢量之間呈現的叉積也可能導致2D矢量,這怎麼可能。這對我沒有意義。這也出現在一些精美的書籍「實時碰撞檢測」中 - 在多邊形和線條相交的一些例子中 - 甚至是2D矢量之間的標量三元組出現在代碼中(例如參見第189頁)。

問題是,據我所能想到的,兩個2D矢量的僞交叉乘積只能產生一個標量(v1.x v2.y-v1.y v2.x)或者如果增加了兩個零,則至多在3D矢量中,因爲該標量表示Z維度。但是它怎麼會導致2D矢量呢?

我不是第一個問這個問題的人,恰巧,當試圖使用相同的代碼示例時:Cross product of 2 2D vectors但是,正如可以很容易地看到的那樣,答案,更新時的原始問題以及該線程中的註釋已結束如果我敢這麼說的話,那會非常糟糕。

有誰知道我該如何從兩個2D矢量的交叉乘積中獲得這些2D矢量?如果要提供代碼,我可以處理C#,JavaScript和一些C++。

編輯 - 這裏是書中一段代碼正如我上面提到:

int IntersectLineQuad(Point p, Point q, Point a, Point b, Point c, Point d,  Point &r) 
{ 
Vector pq = q - p; 
Vector pa = a - p; 
Vector pb = b - p; 
Vector pc = c - p; 
// Determine which triangle to test against by testing against diagonal  first 
Vector m = Cross(pc, pq); 
float v = Dot(pa, m); // ScalarTriple(pq, pa, pc); 
if (v >= 0.0f) { 
    // Test intersection against triangle abc 
    float u = -Dot(pb, m); // ScalarTriple(pq, pc, pb); 
    if (u < 0.0f) return 0; 
    float w = ScalarTriple(pq, pb, pa); 
.... 
+0

你在說「同方技術」,對吧? XY平面中的2個3d矢量的叉積是平行於Z軸的矢量。 2個2d向量的交叉點是3d交叉點的Z分量,因此這裏提到的點積可以通過簡單地乘以兩個2d交叉點的值來得到(即,點對齊與Z軸平行的3d交叉點,因此彼此)。 – dbc

+0

感謝您的評論。所以,是的,這是我想到的技巧。你所說的是,Dot產品只是兩個2D矢量交叉乘積給出的兩個標量的乘積? 但是看看我剛剛包含在原始問題中的書中的例子。在那個例子中,我應該將整個2D向量pa乘以由pc和pq的交叉乘積產生的標量? – MAnd

+0

@dbc請注意,在所提供的示例中,作者將2D向量pc和pq的叉積存儲在名爲「m」的向量中。如果我直接回答你的建議,並簡單地對兩個2D矢量之間的叉積進行通常的計算,則將其保存爲「m」(將其聲明爲浮點數),然後直接乘以「m」和矢量「pa」那麼「v」不能是浮點數,如示例 – MAnd

回答

1

對於the page you linked,似乎他們在三維空間談論一個三角形

因爲三角形可以在三維空間中的任何方式取向,...

因此,所有的他們談論的向量是矢量,所有的文本和代碼都非常有意義。請注意,即使對於2d向量,如果考慮將交叉產品指向屏幕外,則所有內容都是有意義的。他們也在頁面上提到它:

如果您將[B-A]和[p-A]的交叉乘積,您將得到一個指向屏幕外的矢量。

他們的代碼是正確的也是如此,既爲2D和3D的情況:

function SameSide(p1,p2, a,b) 
    cp1 = CrossProduct(b-a, p1-a) 
    cp2 = CrossProduct(b-a, p2-a) 
    if DotProduct(cp1, cp2) >= 0 then return true 
    else return false 

對於2D,既cp1cp2都指出了屏幕的載體,和(3D)點積到底是什麼你需要檢查;僅檢查相應Z分量的乘積是相同的。如果一切都是3D,這也是正確的。 (雖然我只會寫return DotProduct(cp1, cp2) >= 0

對於int IntersectLineQuad(),我可以猜測的情況是一樣的:Quad,不管它是什麼,是一個三維物體,以及Vector和代碼Point。然而,如果你添加更多關於這個函數應該做什麼的細節,這將會有所幫助。

事實上,很明顯,2d中所述的任何問題都可以擴展到3d,所以任何在3d中有效的方法對於2d也是有效的,您只需要想象第三個軸指出的屏幕。所以我認爲這是一個有效的(雖然令人困惑)的技術,用3d術語來完全描述二維問題。你可能自己做了一些額外的工作,因爲在這種方法中,一些值總是爲零,但是(幾乎)相同的代碼也會在一般的3d情況下工作。

+1

感謝您的詳細澄清!所以,這正是讓我困惑的部分:「如果你拿出[B-A]和[p-A]的交叉產品,你會得到一個指向屏幕的向量。」它只適用於2D環境,而不適用於3D。但無論如何,我認爲你已經提出了一個很好的觀點,這很明顯,但我之前並沒有完全意識到。無論示例代碼是關於3D線段/四邊形交集,我都可以使用相同的代碼作爲開始,但將零置於Z軸,然後稍後調用一些優化(即我放棄2D中不必要的東西案件) – MAnd