判斷連個線段是否相交,分為兩步:
(1).快速排斥試驗設以線段 p1p2 為對角線的矩形為r, 設以線段 q1q2 為對角線的矩形為t,如果r和t不相交,顯然兩線段不會相交;
(2).跨立試驗
如果兩線段相交,則兩線段必然相互跨立對方,p1p2跨立q1q2 ,則向量 ( p1 - q1 ) 和( p2 - q1 )位於向量( q2 - q1 ) 的兩側,即
( p1 - q1 ) × ( q2 - q1 ) * ( p2 - q1 ) × ( q2 - q1 ) < 0
上式可改寫成
( p1 - q1 ) × ( q2 - q1 ) * ( q2 - q1 ) × ( p2 - q1 ) > 0
所以判斷p1p2跨立q1q2的依據是:
( p1 - q1 ) × ( q2 - q1 ) * ( q2 - q1 ) × ( p2 - q1 ) ≥ 0
同理判斷q1q2跨立p1p2的依據是:
( q1 - p1 ) × ( p2 - p1 ) * ( p2 - p1 ) × ( q2 - p1 ) ≥ 0
// segmentline.cpp : 定義控制台應用程式的入口點。
//#include "stdafx.h"
#include #include #include #include using namespace std;
bool judgestatus(double line01coords, double line02coords)
return returnresult;
}typedef structpoint;
bool linecross(double line1, double line2)
} return false;
}double culculate(double line)
void main()
} for(i=0; i < line_num; i++)
printf("\n");
} int count = line_num;
double maxlen=-1;
double len=0;
for(i = 0; i < line_num; i++)
while(!remain.empty())
}if(flag)
else
} printf("\n");
if(len > maxlen)
}printf("%lf",maxlen);
while(1);
}
注意:使用容器的erase函式在for迴圈中刪除元素時,使用:
for(ite = v.begin(); ite != v.end();)
else
}
51Nod 1264 線段相交 兩線段相交的判定
基準時間限制 1 秒 空間限制 131072 kb 分值 0 難度 基礎題 給出平面上兩條線段的兩個端點,判斷這兩條線段是否相交 有乙個公共點或有部分重合認為相交 如果相交,輸出 yes 否則輸出 no input 第1行 乙個數t,表示輸入的測試數量 1 t 1000 第2 t 1行 每行8個數,...
兩線段相交的判別方法
向量運算有很多用途,判斷兩線段相交我們可以利用向量的叉積來計算。我們先來思考兩線段相交的特點,顯然是有乙個公共點,也就是說對於每條線段來說,另一條線段總會穿過這條線段 所以線段的端點分布在另一條線段的兩端 既然是兩端我們自然可以用叉積來判斷 因為叉積的方向性 至此問題解決 下面放上一道集訓的題目 裡...
線段是否相交的判斷方法
判斷一點在已知直線的左側還是右側。f x,y y y1 x2 x1 x x1 y2 y1 if f x3,y3 0 點 p x3,y3 在p1p2 的左側 if f x3,y3 0 點 p x3,y3 在p1p2 的右側 if f x3,y3 0 點 p x3,y3 在p1p2 線上。判斷兩線段是否...