判斷線段是否相交並求交點

2021-10-11 16:36:34 字數 2524 閱讀 4369

設兩條線段abcd,其端點分別為(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​−

xa​y

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...