判斷兩條線段是否相交

2021-08-06 01:22:51 字數 3876 閱讀 3081

1.必備知識

向量積(矢積)與數量積(標積)的區別

名稱標積 / 內積 / 數量積 / 點積

矢積 / 外積 / 向量積 / 叉積

表示式(a,b和c粗體字,表示向量)

a·b=|a|·|b|cosθ

a×b=c,其中|c|=|a|·|b|sinθ,c的方向遵守右手定則

幾何意義

向量a在向量b方向上的投影與向量b的模的乘積

c是垂直a、b所在平面,且以|b|sinθ為高、|a|為底的平行四邊形的面積

運算結果的區別

標量(常用於物理)/數量(常用於數學)

向量(常用於物理)/向量(常用於數學)

表示方法

兩個向量a和b的叉積寫作a×b(有時也被寫成a∧b,避免和字母x混淆)。

定義 向量積可以被定義為:

模長:(在這裡θ表示兩向量之間的夾角(共起點的前提下)(0° ≤ θ ≤ 180°),它位於這兩個向量所定義的平面上。)

方向:a向量與b向量的向量積的方向與這兩個向量所在平面垂直,且遵守右手定則。

(乙個簡單的確定滿足「右手定則」的結果向量的方向的方法是這樣的:若座標系是滿足右手定則的,當右手的四指從a以不超過180度的轉角轉向b時,豎起的大拇指指向是c的方向。)

也可以這樣定義(等效):

向量積|c|=|a×b|=|a|·|b|sin< a,b >

即c的長度在數值上等於以a,b,夾角為θ組成的平行四邊形的面積。

而c的方向垂直於a與b所決定的平面,c的指向按右手定則從a轉向b來確定。

*運算結果c是乙個偽向量。這是因為在不同的座標系中c可能不同。

} double direction(point pi,point pj,point pk) //計算向量pkpi和向量pjpi的叉積

bool judge(point p1,point p2,point p3,point p4) //判斷線段p1p2和p3p4是否相交

int main()

for(int i=1; ifor(int j=i+1; j<=n; j++)

} cout

0;

}3.[c++]計算幾何之判斷線段相交

給定兩個點:

typedef  struct 

point;

point a1,a2,b1,b2;

首先引入兩個實驗:

a.快速排斥實驗

設以線段a1a2和線段b1b2為對角線的矩形為m,n;

若m,n 不相交,則兩個線段顯然不相交;

所以:滿足第乙個條件時:兩個線段可能相交。

b.跨立實驗

如果兩線段相交,則兩線段必然相互跨立對方.若a1a2跨立b1b2,則向量( a1 - b1 ) 和(a2-b1)位於向量(b2-b1)的兩側,

即(a1-b1) × (b2-b1) * (a2-b1) × (b2-b1)<0。

上式可改寫成(a1-b1) × (b2-b1) * (b2-b1) × (a2-a1)>0。

應該判斷兩次,即兩條線段都要為直線,判斷另一直線的兩端點是否在它兩邊,若是則兩線段相交。

若積極滿跨立實驗是不行的,如下面的情況:

即兩條線段在同一條直線上。所以我們要同時滿足兩次跨立和快速排斥實驗。

如圖:

應用:

1. 判斷兩個線段相交

2. 判斷線段與直線相交

3. 判斷點在矩形內

**:

/* 

(a1-b1) × (b2-b1) * (b2-b1) × (a2-a1) >= 0

(b1-a1) × (a2-a1) * (a2-a1) × (b2-a1) >= 0

*/#include

#define min(a,b) a#define max(a,b) a>b?a:b

typedef struct point;

point a1,a2,b1,b2;

point a1b1, b2b1, a2a1, b2a1;

double xx(point &s,point &t)

int kua() //跨立實驗

else

return 0

; }

int main()

else

printf("線段不相交\n");

} return 0

; }

4.[cad]

判斷兩條線段是否相交,可以採用向量積的方式來判斷,如下圖所示:

現定義乙個函式初步判斷兩線段是否相交,如下**:

///

/// 初步根據外圍框大致判斷兩條線段是否相交

//////

線段1的座標,長度為6

///線段2的座標,長度為6

///返回型別為bool,如果為true表示兩條線段可能相交,如果為false表示兩條線段不相交

private

bool

judgeaboutcrossstatus(double line01coords, double line02coords)

return returnresult;

}函式judgeaboutcrossstatus()如果返回值為true則表示兩條線段可能相交,則需要採用向量積的方式來判斷是否相交,如果為false則表示兩條線段不相交。現在定義乙個函式judge2linesrelation ()用於判斷兩條線段是否相交,其**如下:

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

//////

線段1的座標,長度為6

///線段2的座標,長度為6

///返回型別為bool,如果為true表示兩條線段相交,如果為false表示兩條線段不相交

private

bool

judge2linesrelation(double line01coords, double line02coords)

else

if (((babck > 0) && (babdk < 0)) || ((babck < 0) && (babdk > 0)))

else

}else

if ((babck == 0)||(babdk==0))//點c或d在直線ab上

else

//點d在直線ab上

if (line01coords[0] == line01coords[3])//是否垂直,是則比較y值

else

//比較x值}}

return returnresult;

}

2.叉積、線段相交判斷、凸包

3. 1288: 計算幾何練習題——線段相交

判斷兩條線段是否相交

如上圖,判斷線段ab和線段cd相交。分析 如果線段ab和線段cd相交,只能是圖中的兩種相交情況。可以用向量叉乘來判斷。如果 向量ab叉乘向量ac 向量ab叉乘向量ad 0 並且 向量cd叉乘向量ca 向量cd叉乘向量cb 0,那麼說明線段ab與線段cd相交。設a x1,y1 b x2,y2 c x3...

判斷兩條線段是否相交

題目 給定兩條線段,判斷這兩條線段是否相交,線段ab的表示形式是a x1,y1 b x2,y2 線段cd的表示形式為c x3,y3 d x4,y4 那麼我們如何判斷線段ab與線段cd是否相交。解析 在介紹如何解決線段相交問題之前,我們先介紹向量的叉積。如下圖所示 下面的圖 1 表示p1向量在p2向量...

判斷兩條線段是否相交

判斷兩條線段是否相交,可以採用向量積的方式來判斷,如下圖所示 現定義乙個函式初步判斷兩線段是否相交,如下 初步根據外圍框大致判斷兩條線段是否相交 線段1的座標,長度為6 線段2的座標,長度為6 返回型別為bool,如果為true表示兩條線段可能相交,如果為false表示兩條線段不相交 private...