線段相交判斷

2021-08-04 21:23:00 字數 1380 閱讀 2639

1.快速排斥實驗。

設以線段p1p2為對角線的矩形為r,設以線段q1q2為對角線的矩形為t,如果r和t不相交,則兩線段不相交。

所以p1p2和q1q2相交的必要條件是以他們為對角線的矩形相交,即:

min(p1.x,p2.x) <= max(q1.x,q2.x) &&

min(q1.x,q2.x) <= max(p1.x,p2.x) &&

min(p1.y,p2.y) <= max(q1.y,q2.y) &&

min(q1.y,q2.y) <= max(p1.y,p2.y);

2.跨立實驗。

a、若p1p2跨立q1q2,則向量(p1-q1)和(p2-q1)位於向量(q2-q1)的兩側,即( p1 - q1 ) × ( q2 - q1 ) * ( p2 - q1 ) × ( q2 - q1 ) < 0。

等價於(q1.x-p1.x,q1.y-p1.y) × ( q1.x-q2.x,q1.y-q2.y ) * ( q1.x-p2.x,q1.y-p2.y ) × ( q1.x-q2.x,q1.y-q2.y ) < 0

等價於((q1.x-p1.x)*(q1.y-q2.y)-(q1.y-p1.y)*( q1.x-q2.x)) * ((q1.x-p2.x)*(q1.y-q2.y)-(q1.y-p2.y)*(q1.x-q2.x)) < 0

b、若q1q2跨立p1p2,則向量(q1-p1)和(q2-p1)位於向量(p2-p1)的兩側,即( q1 - p1 ) × ( p2 - p1 ) * ( q2 - p1 ) × ( p2 - p1 ) < 0。

等價於(p1.x-q1.x,p1.y-q1.y) × ( p1.x-p2.x,p1.y-p2.y ) * ( p1.x-q2.x,p1.y-q2.y ) × ( p1.x-p2.x,p1.y-p2.y ) < 0

等價於((p1.x-q1.x)*(p1.y-p2.y)-(p1.y-q1.y)*(p1.x-p2.x)) * ((p1.x-q2.x)*(p1.y-p2.y)-(p1.y-q2.y)*( p1.x-p2.x)) < 0

a和b兩個不等式同時滿足時即可判斷兩條線段相交。

排斥實驗和跨立實驗的示例如下圖所示。

bool islinesegmentcross(const point &p1,const point &p2,const point &q1,const point &q2)//跨立判斷

判斷線段相交

先判斷兩條線段是否不平行 最好同時判斷是否有交點並且不平行,因為浮點運算不精確 然後計算兩條線段的交點。以下是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在座標原...