題意:
給出n條線段兩個端點的座標,問所有線段投影到一條直線上,如果這些所有投影至少相交於一點就輸出yes!,否則輸出no!。
思路:
計算幾何。這道題要思考到兩點:
1:把問題轉化為是否存在一條直線與每條線段都有交點。證明:若存在一條直線l和所有線段相交,作一條直線m和l垂直,則m就是題中要求的直線,所有線段投影的乙個公共點即為垂足。
2:列舉兩兩線段的各乙個端點,連一條直線,再判斷剩下的線段是否都和這條直線有交點。證明:若有l和所有線段相交,則可保持l和所有線段相交,左右平移l到和某一線段交於端點停止(「移不動了」)。然後繞這個交點旋轉。也是轉到「轉不動了」(和另一線段交於其乙個端點)為止。這樣就找到了乙個新的l滿足題意,而且經過其中兩線段的端點。
判斷線段與直線l是否相交的方法:
1:利用叉積的性質,判斷線段的兩個端點是否在直線的兩邊。
2:求線段所在的直線tmp,求tmp與l的交點p,由線段兩端點到p的距離之和,與線段的距離比較,若相等則證明線段與直線相交。
**:
#include#includeview codeusing
namespace
std;
const
int maxn = 105
;const
double eps = 1e-8
;int
n;struct
point
s[maxn], e[maxn];
double
mult(point sp, point ep, point op)
bool
findd(point p1, point p2)
intmain()
if(flag) cout << "
yes!
"<
else cout << "
no!"
<
}return0;
}
POJ 3304 Segments(計算幾何)
description 給出n條線段,問是否存在一條直線與這n條線段的任一條都相交 input 第一行一整數t表示用例組數,每組用例首先輸入一整數n表示線段數量,之後n行每行四個實數x1,y1,x2,y2分別表示線段兩端點橫縱座標 output 對於每組用例,如果存在一條直線與這n條線段的任一條都相...
poj3304 Segments 計算幾何
poj 3304 最近開始刷計算幾何了 公式好多完全不會 數學不行 幾何不行 記憶力不行 當機 查的題解 就當複習吧 這套專題拿來熟悉一下計算幾何模板 include include includeusing namespace std const double eps 1e 8 int sgn d...
POJ 3304 Segments 簡單幾何
題目大意 給出n條線段,現在問是否存在一條直線,使得所有線段向這條直線的投影存在乙個共同的交點 題目分析 題意有點抽象,需要轉換一下,因為所有的線段向某一條直線的投影存在乙個交點,那麼在那條直線上,從交點位置開始,沿著垂直於直線的方向做另一條直線,會發現這條直線與n條線段都存在乙個交點,也就是都相交...