碰撞檢測 判斷線段相交

2021-09-11 08:37:43 字數 2059 閱讀 3984

3d 叉乘:

3d 叉乘的結果是乙個 3d 向量,這個向量垂直於參與運算的2個向量的法向量。

3d 叉乘計算公式:( a.y * b.z - b.y * a.z , a.z * b.x - b.z * a.x , a.x * b.y - b.x * a.y )

2d叉乘:

2d 叉乘的結果是乙個標量。

2d 叉乘就是把 2d 點看作 3d 的點( z 軸的值為 0 ),套進 3d 叉乘公式進行計算。

例如:有2個2d向量 a , b ,計算叉乘就是:

( a.y * b.z - b.y * 0 , 0 * b.x - b.z * a.x , a.x * b.y - b.x * a.y )= ( 0 , 0 , a.x * b.y - b.x * a.y )

套進3d叉乘公式計算的2d叉乘的結果的 x , y 分量均為 0 ,只有 z 有意義。

所以,標量 z 是 2d 叉乘的結果。

2d 叉乘公式:

設兩個 2d 向量 a , b,叉乘公式:a.x * b.y - b.x * a.y

向量 a 叉乘 向量 b 結果的意義:

如上圖所示:

向量 a 把空間分為2部分:

a 叉乘 b 的結果是 > 0 的正數,b 在 a 的左邊。

a 叉乘 c , d 的結果是 < 0 的負數,c , d 在 a 的右邊。

a 叉乘 a 的結果是0。因為 a 和它自己是平行的。

2d向量叉乘demo演示:

基本思想:

乙個線段會把空間分為2部分,以這個線段為分界線,判斷是否另乙個線段2個端點分別在這個線段分割的2個空間中。

如果2個線段的2個端點都分別在另乙個線段分割的2個空間中,那麼就認為是相交。

如下圖,有線段 a 和 b

線段 a 把空間分為2部分,淺藍和淺綠2部分。

b 的2個端點 bp1、bp2 分別在 a 劃分出來的2個空間中。

同樣的,線段 b 把空間分為2部分,淺藍和淺綠2部分。

a 的 2個端點 ap1 , ap2 分別在 b 劃分出來的2個空間中。

如上圖所示,

2個線段的2個端點都在另乙個線段分割出來的2個空間中,這2個線段相交。

演算法描述:

設有2個線段 a , b 。線段 a 的2個端點為:ap1 , ap2 , 線段 b 的 2個端點為:bp1 , bp2 。

條件1:是否 向量 ap1->bp1 、ap1->bp2 分別位於向量 ap1->ap2 的左右2端。

條件2:是否 向量 bp1->ap1 、bp1->ap2 分別位於向量 bp1->bp2 的左右2端。

當條件1和條件2同時滿足時,線段 a , b 相交。

判斷乙個向量之於另乙個向量的方位,可以用2d叉乘。

條件2的計算示意圖如下,計算過程如法炮製條件1。

demo 工程是 cocos creator 2.0.8 寫的。

可執行檔案是乙個網頁,直接執行 index.htm 即可。

判斷線段相交

先判斷兩條線段是否不平行 最好同時判斷是否有交點並且不平行,因為浮點運算不精確 然後計算兩條線段的交點。以下是c語言 include include define eps 1e 8 define zero x x 0?x x eps 判兩直線平行 int parallel point u1,poin...

判斷線段相交

1.叉積的計算 為了確定兩個點的相對位置,可以使用叉積 有兩個點p1和p2,如果p1xp2 0,則p1位於p2的順時針方向,p1xp2 0,則p1位於p2的逆時針方向。p1的座標為 x1,y1 p2的座標為 x2,y2 則p1xp2 x1y2 x2y1 確定連續線段左轉還是右轉的問題,也可是使用叉積...

怎樣判斷線段相交

一.向量基本知識 因為後面的計算需要一些向量的基本知識,這裡只是簡單的列舉如下,如果需要更加詳細的資訊,可以自行搜尋wikipedia或google。1.向量的概念 如果一條線段的端點是有次序之分的,我們把這種線段成為有向線段 directed segment 如果有向線段p1p2的起點p1在座標原...