如何判定兩條直線或者線段相交

2021-06-21 15:16:54 字數 1538 閱讀 1015

//判斷兩條直線是否相交

//每個線段的兩點都在另乙個線段的左右不同側,則能斷定線段相交

//公式對於向量(x1,y1)->(x2,y2),判斷點(x3,y3)在向量的左邊,右邊,還是線上.

//p=x1(y3-y2)+x2(y1-y3)+x3(y2-y1).p<0 左側, p=0 線上, p>0 右側

bool ::islinesegmentcross(point pfirst1, point pfirst2, point psecond1, point psecond2)

//判斷pfirst1和pfirst2是否在psecond1->psecond2兩側

linep1 = psecond1.x * (pfirst1.y - psecond2.y) + psecond2.x * (psecond1.y - pfirst1.y) + pfirst1.x * (psecond2.y - psecond1.y);

linep2 = psecond1.x * (pfirst2.y - psecond2.y) + psecond2.x * (psecond1.y - pfirst2.y) + pfirst2.x * (psecond2.y - psecond1.y);

if (((linep1 ^ linep2) >= 0) && !(linep1 == 0 && linep2 == 0))

//否則判為相交

return true;

}//可利用此函式對四邊形的四個點進行排列,使0->1->2->3->0剛好畫成乙個四邊形(對凹四邊形無效)

void ::sortpoint(vector&ppoint)

//判斷1->2是否和3->4相交

//如果相交轉換2和3的位置

if (islinesegmentcross(ppoint[0],ppoint[1],ppoint[2],ppoint[3]))

if (islinesegmentcross(parect.apoint[0],parect.apoint[2],parect.apoint[1],parect.apoint[3]))

if (islinesegmentcross(parect.apoint[0],parect.apoint[3],parect.apoint[1],parect.apoint[2]))

}//如果相交,計算出相交點(很簡單的數學知識)

//公式:(x-x1)/(y-y1) = (x1-x2)/(y1-y2)

// (x-x3)/(y-y3) = (x3-x4)/(y3-y4)

point ::functionintersection(point ori1,point ori2,point ext1,point ext2)

//還可以利用這個函式判斷乙個點是否在乙個四邊形內

//演算法:用這個點向乙個方向上,平行於x軸做一條直線,如果與此四邊形的四個邊相交的點數為奇數,那麼此點在四邊形內,如果為偶數,那麼在四邊形外

//判斷startpoint是否在四邊形rect內

void ::findpoint()

}else}}

if(0 != count%2)

}

如何判斷兩條直線是否相交

之前寫過一篇如何判斷兩條線段是否相交,我們緊接這個主題,再來談談如何判斷兩條直線是否相交 總體來上,判斷直線是否相交比判斷線段是否相交容易多了 兩條直線相交只有兩種情況 第一種 兩條直線斜率不相同 斜率不存在的情況算做一種斜率 第二種 兩斜率相同且截距也相同,即重合 如果這個相同的斜率都是斜率不存在...

判斷兩條線段 直線相交,並求交點

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

兩條線段是否相交

可以通過叉積來判斷兩條線段是否相交,ab ac與ab ad的結果為異號,並且 cd ca與cd cb的結果為 異號,則兩條直線相交。b相交.判斷兩線段是否相交 1 快速排斥試驗 設以線段 p1p2 為對角線的矩形為 r,設以線段 q1q2 為對角線的矩形為 t,若 r t 不相交,則兩線段不可能相交...