設兩條線段ab
和cd
,其端點分別為(xa
,ya)
,(xb
,yb)
(xc,
yc),
(xd,
yd
)(x_a,y_a),(x_b,y_b) (x_c,y_c),(x_d,y_d)
(xa,y
a),
(xb
,yb
)(xc
,yc
),(
xd,
yd)
.需要判斷2條線段是否相交,若相交求交點。
兩條直線所在的引數方程為:
x = x_a + \alpha(x_b-x_a) \\ y = y_a + \alpha(y_b-y_a) \\ \end \right. \left\ x = x_c + \beta(x_d-x_c) \\ y = y_c + \beta(y_d-y_c) \end \right. \tag
x = x_a + \alpha(x_b-x_a)=x_c + \beta(x_d-x_c) \\ y = y_a + \alpha(y_b-y_a)=y = y_c + \beta(y_d-y_c) \end \right. \tag
\alpha(x_b-x_a) - \beta(x_d-x_c) = x_c - x_a \\ \alpha(y_b-y_a) - \beta(y_d-y_c) = y_c - y_a \end \right. \tag
x_b-x_a & -(x_d-x_c) \\ y_b-y_a & -(y_d-y_c) \end \tag
δ=∣∣∣∣
xb
−xa
yb−
ya
−(xd
−xc
)−(
yd−
yc)
∣∣∣
∣(4
)若δ=
0\delta=0
δ=0,則方程無解。意味著線段重合或平行。如果δ≠0
\delta\neq0
δ=
0,則可求出交點對應的兩個引數值:
\alpha = \frac \begin x_c-x_a & -(x_d-x_c) \\ y_c-y_a & -(y_d-y_c) \end \\ \beta = \frac \begin x_b-x_a & x_c-x_a \\ y_b-y_a & y_c-y_a \end \end \right. \tag
⎩⎪⎪⎪⎨⎪
⎪⎪⎧
α=δ1
∣∣∣
∣xc
−xa
yc
−ya
−(x
d−x
c)−
(yd
−yc
)∣∣
∣∣β
=δ1
∣∣∣∣
xb
−xa
yb−
ya
xc−
xay
c−y
a∣
∣∣∣
(5)
需要注意,只有0⩽α
⩽1,0
⩽β⩽1
0\leqslant \alpha \leqslant 1,0\leqslant \beta \leqslant 1
0⩽α⩽1,
0⩽β⩽
1時兩線段才真正相交。否則,交點在兩線段或其中某一條線段的延長線上,這時仍然認為是兩線段不相交。
將式(5)代入式(1)即可解得兩條線段交點。(或者兩條線段所在直線的交點)
根據上面公式可以很方便求解出線段的交點(或線段所在直線的交點)。由於專案開發經常使用opencv,因此給出乙份基於opencv資料結構的**實現.
//判斷線段是否相交,並求交點
//input param:pa,pb--line segment a's 2 points;
// pc,pd--line segments b's 2 points;
//output param:crossp--cross point
//return: true:line a, b intersect;false:none;
bool getlineintersect(const cv::point2f &pa, const cv::point2f &pb,
const cv::point2f &pc, const cv::point2f &pd,cv::point2f &crossp)
上面**利用上面函式返回值用來判斷兩條線段是否相交,線段相交返回值為opencv
中點(向量)的叉乘
來代替行列式的求解。建議對照數學公式進行理解!
true
;線段不相交,但線段所在直線相交,**同樣求出兩條直線的交點。 判斷兩線段相交,並求交點
原文 include math.h include stdio.h double e 0.0001 struct point double min double x1,double x2 double max double x1,double x2 bool between double x,dou...
C 判斷線段是否相交
c 判斷線段是否相交 線段是否相交,一種是從幾何上就是判斷兩個線段有沒有交點,還有一種是通過向量叉乘 也就是向量積 來判斷。因為向量叉乘的結果是乙個垂直於原來兩個向量的新向量,可以簡單的理解為垂直於原來兩向量所在平面的向量。我們來看圖。線段是否相交 線段p1p2的p1點 線段p1p2的p2點 線段q...
C 判斷線段是否相交
線段是否相交,一種是從幾何上就是判斷兩個線段有沒有交點,還有一種是通過向量叉乘 也就是向量積 來判斷。因為向量叉乘的結果是乙個垂直於原來兩個向量的新向量,可以簡單的理解為垂直於原來兩向量所在平面的向量。我們來看圖 線段是否相交 線段p1p2的p1點 線段p1p2的p2點 線段q1q2的q1點 線段q...