判斷兩個線段相交

2021-08-08 22:20:37 字數 3006 閱讀 4698

我們首先將問題分成如下幾個小問題討論

首先要解決的第乙個問題是判斷直線是否平行,我們首先假設四個點的座標為

前兩個點為a(x1, y1), b(x2, y2) 後兩個點為 c(x3, y3), d(x4, y4),求出兩個直線的方向向量e1

→=(x

1−x2

,y1−

y2) , e2

→=(x

3−x4

,y3−

y4) 。通過e

1→, e2

→ 求得e1

→×e2

→=th

eta=

(e1x

e2y−

e1ye

2x) ,如果theta為0則表示平行。接著我們要判斷是否共線,很簡單,我們求出這兩之間的任意向量,如e3

→ =(x1 - x3, y1 - y3),求e1

→×e3

→=be

ta=(

e1xe

3y−e

1ye3

x),如果beta=0,則表示兩個線段共線,否則不共線即不相交。接著判斷是否重合,很簡單的乙個方法就是,我們可以先將這些點按從低到高排好順序,去比較幾何位置即可。

如果兩個線段不平行的話,等於分成了3種情況。首先我們判斷是否跨交。也就是判斷a,b是不是在c,d兩邊,c,d同時是不是也在a,b的兩邊。我們可以求m⃗ 

通過判斷m⃗ 

×e1→

與n⃗ ×

e1→ 是否異號就可以判斷出c,d是否在a,b兩側,如果異號說明在兩邊,如果同號則不在。另外判斷a,b是否在c,d兩側同理可得。

如果跨交的話求交點。

設交點為(x0, y0),則下列方程組必然成立:

其中k1和k2為任意不為0的常數(若為0,則說明有重合的端點,這種情況在上面已經被排除了)。1式與2式聯絡,3式與4式聯立,消去k1和k2可得:

將含有未知數x0和y0的項移到左邊,常數項移動到右邊,得:

設兩個常數項分別為b1和b2:

係數行列式的值為theta,用a1和a2替換x0的係數所得係數行列式的值為theta1,替換y0的係數所得係數行列式的值為d2,則有:

由此,可求得交點座標為:

如果是交於端點的話通過判斷集合位置關係就可以判斷出來了。

下面是**:

#include 

#include

//判斷兩個畫素是否相等

bool equal(double x, double y)

class point

bool

operator==(const point& rhs) const;

bool

operator!=(const point& rhs) const;

bool

operator

bool

operator>(const point& rhs) const;

point operator-(const point& rhs) const;

point operator+(const point& rhs) const;

static

double cross_product(const point& p1, const point& p2);

double pointx()

double pointy()

private:

double x, y;

};bool point::operator==(const point & rhs) const

bool point::operator!=(const point & rhs) const

bool point::operator

bool point::operator>(const point & rhs) const

point point::operator-(const point & rhs) const

point point::operator+(const point & rhs) const

double point::cross_product(const point & p1, const point & p2)

//判斷兩個線段是否相交

//相交返回1,重合返回2,不相交返回3

//出錯返回-1

int cross(point& a, point& b, point& c, point& d, point& f)//a,b表示乙個線段;c,d表示乙個線段, f表示交點座標

//判斷兩個是否平行

//得到線段的向量x, y

point x = a - b;

point y = c - d;

//計算差乘

double theta = point::cross_product(x, y);

if (a > b)

if (c > d)

if (equal(theta, 0))

else

if (b == c)

else

if (a == d)

else

}else

}else

else

if (b == c)//不平行交於端點

else

if (a == d)

else

}

}int main()

判斷兩個線段是否相交

html xmlns lang en charset utf 8 判斷兩個線段是否相交問題title rel stylesheet href css reset.css rel stylesheet href css style.css head class wrap 判斷兩個線段是否相交h2 br...

計算幾何之 判斷兩個線段是否相交

1.判斷兩個線段是否相交,需要檢測線段是否兩兩橫跨。所謂橫跨,即是點p1 位於向量n 的一邊,且另一點p2 位於向量n 的另一邊 2.此外,還需考慮邊界情況,即一條線段的某個端點位於另一條線段上。判斷線段p1p2,p3p4 是否相交,演算法流程如下 segment intersect p1,p2,p...

python判斷兩線段是否相交 判斷兩線段是否相交

演算法一 1.快速排斥實驗 設一線段p1p2為對角線的矩形為p,設一線段q1q2為對角線的矩形為q,如果p和q不相交,顯然兩線段不會相交。以下2種 方法1 方法2 方法判斷矩形是否相交僅限於正矩形。方法1 已知2個正矩形rect1 rect2 設兩個正矩形相交一定得到乙個正矩形rect 如果minx...