2017-06-28 72 views
0

我一直在關注這個tutorial碰撞檢測,其中它使用二維三重產品來構建垂直線。使用向量ÇÇ和矢量Ç轉到原點不用。聲稱是A,B,A的三重產品與原產地的方向垂直於A。我不明白爲什麼這會起作用,或者如何在2D中使用交叉產品。三維產品在二維構造垂直線

+0

該鏈接頁面相當長,並且存在多種向量的「三重產品」,因此請包括該三重產品的摘要。三個3D向量最常見的三重結果產生了一個標量,而不是一個向量。 –

+0

[這裏](https://github.com/FuzzyWuzzie/headbutt/blob/98062d9c371acd6b243fa5719fe11a33243a8cdb/src/headbutt/Headbutt2D.hx#L51-L60)是該「三重產品」的實施。 – MvG

回答

0

我看過the implementation,我絕對不會說那是triple product。通常的三重產品使用交叉產品,然後使用點積,而這裏是連續的兩個交叉產品,通過向2d向量附加零構造3d向量。那麼會發生什麼? (Ax,Ay,0)×(Bx,By,0)=(0,0,Ax∙By-Ay∙Bx)
...×A =(Ax∙By-Ay∙ Bx)∙(Ay,-Ax,0)

所以結果是(Ay,-Ax)的某個倍數。這確保了這確實與A垂直。並且如果A和B是平行的,那麼多個改變準確地標記。因此,對於A和B不平行,一個方向將給出一個方向,而另一個方向將給出另一個方向。如果你不想更深入地思考,用一個實驗來決定哪個是哪個。

作爲一個便箋,我不會這樣做。相反,我會依靠經典的方向謂詞。但是我沒有讀過那篇文章,所以也許有一個理由不這樣做。如果你希望瞭解更多,觀察到行列式

|Ax Bx Cx| 
|Ay By Cy| 
| 1 1 1| 

(其中的方式等於三重積(A×B)∙C如果爲1而不是0增大)等於兩次由A,B,C形成的三角形的面積爲。所以標誌告訴你所述三角形的方向。你可以用這個例如計算符號OAB,OBC,OCA。如果他們都同意原產地被包含。請注意,行列式| OAB | = Ax∙By-Ay∙Bx是非常容易計算的

var oab = Math.sign(a.x*b.y - a.y*b.x); 
var obc = Math.sign(b.x*c.y - b.y*c.x); 
var oca = Math.sign(c.x*a.y - c.y*a.x); 
if (Math.abs(oab + obc + oca) == 3) { 
    return "contains origin"; 
} 
if (oab * obc * oca == 0) { 
    return "origin is on the boundary"; 
} 
var abc = Math.sign(a.x*b.y + b.x*c.y + c.x*a.y - 
        a.x*c.y - b.x*a.y - c.x*b.y); 
if (oab != abc) { 
    return "outside line ab"; 
} else if (obc != abc) { 
    return "outside line bc"; 
} else { 
    return "outside line ac"; 
}