我一直在關注這個tutorial碰撞檢測,其中它使用二維三重產品來構建垂直線。使用向量甲從Ç到Ç和矢量乙從Ç轉到原點不用。聲稱是A,B,A的三重產品與原產地的方向垂直於A。我不明白爲什麼這會起作用,或者如何在2D中使用交叉產品。三維產品在二維構造垂直線
0
A
回答
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";
}
相關問題
- 1. 三維矢量構造C++
- 2. Python二維數組構造
- 3. Numpy Dot產品的兩個二維陣列在numpy獲得三維陣列
- 4. Matplotlib二維繪圖垂直x軸
- 5. 垂直輸出二維陣列
- 6. 垂直/水平翻轉二維陣列
- 7. 第三維向量的Matlab產品
- 8. 旋轉二維三角形產品的奇數結果
- 9. 如何在二維圖上顯示三維數據結構?
- 10. 三維物體的三維二維邊界框
- 11. 三維數組的第二維和第三維
- 12. 三維二維輪廓到三維陣列
- 13. 二維線
- 14. 使用二維數組構造C++
- 15. 二維數組方法構造
- 16. 三維視口到二維圖像
- 17. 三維投影到二維XY平面
- 18. 充氣二維或三維凸包
- 19. matplotlib中三維函數的二維圖
- 20. 三維線框在WPF
- 21. Android + iPhone的維護產品
- 22. 二維三角測量
- 23. 如何檢查垂直和對角線贏在Java二維數組井字趾
- 24. 垂直反轉圖像(存儲在二維數組中)
- 25. Colorbar二維直方圖Python
- 26. 在三維陣列三維原點X
- 27. 從Python中的數組得到二維和三維散點圖直方圖
- 28. 在Gnuplot中繪製垂直線來表示一維數據
- 29. 三維線圖操作
- 30. 三維填充線圖
該鏈接頁面相當長,並且存在多種向量的「三重產品」,因此請包括該三重產品的摘要。三個3D向量最常見的三重結果產生了一個標量,而不是一個向量。 –
[這裏](https://github.com/FuzzyWuzzie/headbutt/blob/98062d9c371acd6b243fa5719fe11a33243a8cdb/src/headbutt/Headbutt2D.hx#L51-L60)是該「三重產品」的實施。 – MvG