///----------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
? ///------------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
? ///------------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
? 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所...