演算法1:
[cpp]view plain
copy
///----------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
intmain()
} time_t
seconds2 = time (null);
cout << "time used in alg 1:"
<< seconds2-seconds1 <<
" seconds."
<< endl;
// alg 2
time_t
seconds3 = time (null);
i=0;
j=0;
for( ; i!=20000; ++i )
} time_t
seconds4 = time (null);
cout << "time used in alg 2:"
<< seconds4-seconds3 <<
" seconds."
<< endl;
// alg 3
time_t
seconds5 = time (null);
i=0;
j=0;
for( ; i!=20000; ++i )
} time_t
seconds6 = time (null);
cout << "time used in alg 3:"
<< seconds6-seconds5 <<
" seconds."
<< endl;
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;
51nod 1264 線段相交
題目 給出平面上兩條線段的兩個端點,判斷這兩條線段是否相交 有乙個公共點或有部分重合認為相交 如果相交,輸出 yes 否則輸出 no 這道題直接套白書裡面的模板就行 但是要注意的是因為白書給的那個模板不包含端點。所以我們這裡需要進行修改一下。包含了端點,所以自然點積就為0了。include incl...
51nod1264 線段相交
數學渣渣看了一下午各種找公式才明白 下面寫一下理解 判斷兩個線段相交與否。可以看成直線是否與線段相交 根據高數所學,向量的叉乘積,可以利用右手法則來判斷結果的方向。那麼如果兩種情況的方向乙個上,乙個下,那麼自然也就是不在直線的同側,那麼就滿足條件了。是有需要注意x,y用double型別,否則乘法會有...
51Nod 1264 線段相交
1264 線段相交 基準時間限制 1 秒 空間限制 131072 kb 分值 0 難度 基礎題 給出平面上兩條線段的兩個端點,判斷這兩條線段是否相交 有乙個公共點或有部分重合認為相交 如果相交,輸出 yes 否則輸出 no input 第1行 乙個數t,表示輸入的測試數量 1 t 1000 第2 t...