POJ3304 Segments 線段直線相交

2022-06-26 04:51:11 字數 1025 閱讀 4904

題意:

給出n條線段兩個端點的座標,問所有線段投影到一條直線上,如果這些所有投影至少相交於一點就輸出yes!,否則輸出no!。

思路:

計算幾何。這道題要思考到兩點:

1:把問題轉化為是否存在一條直線與每條線段都有交點。證明:若存在一條直線l和所有線段相交,作一條直線m和l垂直,則m就是題中要求的直線,所有線段投影的乙個公共點即為垂足。

2:列舉兩兩線段的各乙個端點,連一條直線,再判斷剩下的線段是否都和這條直線有交點。證明:若有l和所有線段相交,則可保持l和所有線段相交,左右平移l到和某一線段交於端點停止(「移不動了」)。然後繞這個交點旋轉。也是轉到「轉不動了」(和另一線段交於其乙個端點)為止。這樣就找到了乙個新的l滿足題意,而且經過其中兩線段的端點。

判斷線段與直線l是否相交的方法:

1:利用叉積的性質,判斷線段的兩個端點是否在直線的兩邊。

2:求線段所在的直線tmp,求tmp與l的交點p,由線段兩端點到p的距離之和,與線段的距離比較,若相等則證明線段與直線相交。

**:

#include#include

using

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;

}

view code

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條線段都存在乙個交點,也就是都相交...