判斷兩條線段是否相交(三種演算法)

2021-08-09 11:57:55 字數 2667 閱讀 5264



///----------alg 1------------

struct point  

;   

bool between(double a, double x0, double x1)  

else

}  // 判斷兩條直線段是否有交點,有則計算交點的座標

// p1,p2是直線一的端點座標

// p3,p4是直線二的端點座標

bool detectintersect(point p1, point p2, point p3, point p4)  

else

if ( (fabs(p1.x-p2.x)<1e-6) ) //如果直線段p1p2垂直與y軸

else

}  else

}  else

if ( (fabs(p3.x-p4.x)<1e-6) ) //如果直線段p3p4垂直與y軸

else

}  else

}  else

else

if (between(line_x,p1.x,p2.x)&&between(line_x,p3.x,p4.x))  

else

}  }  ///------------alg 1------------

演算法2:

[cpp]view plain

copy

print

? ///------------alg 2------------

//叉積

double mult(point a, point b, point c)  

//aa, bb為一條線段兩端點 cc, dd為另一條線段的兩端點 相交返回true, 不相交返回false

bool intersect(point aa, point bb, point cc, point dd)  

if ( max(aa.y, bb.y)  

if ( max(cc.x, dd.x)  

if ( max(cc.y, dd.y)  

if ( mult(cc, bb, aa)*mult(bb, dd, aa)<0 )  

if ( mult(aa, dd, cc)*mult(dd, bb, cc)<0 )  

return

true;  

}  ///------------alg 2------------

演算法3:

html

[c-sharp]view plain

copy

print

? ///------------alg 3------------

double determinant(double v1, double v2, double v3, double v4)  // 行列式

bool intersect3(point aa, point bb, point cc, point dd)  

double namenda = determinant(cc.x-aa.x, cc.x-dd.x, cc.y-aa.y, cc.y-dd.y) / delta;  

if ( namenda>1 || namenda<0 )  

double miu = determinant(bb.x-aa.x, cc.x-aa.x, bb.y-aa.y, cc.y-aa.y) / delta;  

if ( miu>1 || miu<0 )  

return

true;  

}  ///------------alg 3------------

main函式測試:

[cpp]view plain

copy

print

? int main()  

}  time_t seconds2 = time (null);  

cout <

<

<

// alg 2

time_t seconds3 = time (null);  

i=0;  

j=0;  

for ( ; i!=20000; ++i )  

}  time_t seconds4 = time (null);  

cout <

<

<

// alg 3

time_t seconds5 = time (null);  

i=0;  

j=0;  

for ( ; i!=20000; ++i )  

}  time_t seconds6 = time (null);  

cout <

<

<

return 0;  

}  

vs2008編譯器環境下測試結果:

debug模式下: 

alg 1: 315 seconds;

alg 2: 832 seconds;

alg 3: 195 seconds;

release模式下: 

alg 1: 157 seconds;

alg 2: 169 seconds;

alg 3: 122 seconds;

結論: 使用演算法3,時間複雜度最低。

判斷兩條線段是否相交

如上圖,判斷線段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.必備知識 向量積 矢積 與數量積 標積 的區別 名稱標積 內積 數量積 點積 矢積 外積 向量積 叉積 表示式 a,b和c粗體字,表示向量 a b a b cos a b c,其中 c a b sin c的方向遵守右手定則 幾何意義 向量a在向量b方向上的投影與向量b的模的乘積 c是垂直a b所...