POJ 1039 Pipe(計算幾何)

2022-07-17 20:33:12 字數 1717 閱讀 4177

有一寬度為1的折線管道,上面頂點為(xi,yi),所對應的下面頂點為(xi,yi-1),假設管道都是不透明的,不反射的,光線從左邊入口處的(x1,y1),(x1,y1-1)之間射入,向四面八方傳播,求解光線最遠能傳播到**(取x座標)或者是否能穿透整個管道。

最遠的直線必定經過乙個上折點和乙個下折點。列舉這兩個點即可。

#include #include 

#include

#include

#include

#include

#include

#include

#include

#include

using

namespace

std;

const

double eps = 1e-8

;int sgn(double

x)struct

point

point(

double _x,double

_y)

point

operator -(const point &b)const

//叉積

double

operator ^(const point &b)const

//點積

double

operator *(const point &b)const

void

input()

};struct

line

line(point _s,point _e)

//兩直線相交求交點

//第乙個值為0表示直線重合,為1表示平行,為0表示相交,為2是相交

//只有第乙個值為2時,交點才有意義

pair operator &(const line &b)const

double t = ((s-b.s)^(b.s-b.e))/((s-e)^(b.s-b.e));

res.x += (e.x-s.x)*t;

res.y += (e.y-s.y)*t;

return make_pair(2

,res);

}};//

判斷直線和線段相交

bool seg_inter_line(line l1,line l2) //

判斷直線l1和線段l2是否相交

point up[

100],down[100

];int

main()

bool flag = false;//

穿過所有的標記

double ans = -10000000.0

;

intk;

for(int i = 0;i < n;i++)

if(k > max(i,j)) //

由於不清楚l究竟是與第k-1節管子的上管壁還是下管壁相交,因此都計算交點,取最優

if(seg_inter_line(line(up[i],down[j]),line(down[k-1

],down[k])))}}

if(flag)break

; }

if(flag)printf("

through all the pipe.\n");

else printf("

%.2lf\n

",ans);

}return0;

}

poj 1039 Pipe (計算幾何)

題目 劉汝佳的黑書 演算法藝術與資訊學競賽 上的第3章計算幾何初步的例2 管道問題 有一寬度為1的折線管道,上面頂點為 xi,yi 所對應的下面頂點為 xi,yi 1 假設管道都是不透明的,不反射的,光線從左邊入口處的 x1,y1 x1,y1 1 之間射入,向四面八方傳播,求解光線最遠能傳播到 取x...

POJ 1039 Pipe 線段相交

題目 給乙個管子,有很多轉彎處,問從管口的射線射進去最長能射到多遠 題解 根據黑書,可以證明的是這條光線一定經過了乙個上頂點和下頂點 所以我們列舉每對上下頂點就可以了 include include include include define eps 1e 5 using namespace st...

POJ 1039 Pipe (列舉,判線段相交)

題目大意 一根由平行線段組成的管道,給出管道的上端折點,下端折點比上端折點高度少1。有一束光從入口射入,求可以照到的最遠位置。思路 列舉任意兩點,從入口處開始判斷光線是否通過折點出 即與折點豎直線段相交 記錄最遠位置並判斷,輸出即可。開始腦抽,總覺的光要沿著入口上下點射入。放了三天果斷1a了。mem...