PKU1039 Pipe 計算幾何線段交點

2022-05-05 21:51:17 字數 2029 閱讀 1896

模板:給定l1上兩點(ax,ay),(bx,by),l2上兩點(cx,cy),(dx,dy),求兩直線交點(x,y)。

double

cross(

double

x1,

double

y1,

double

x2,

double

y2)void

intersec(point a, point b, point c, point d,

double

*x,

double*y)

1039

accepted

200k

63ms

63ms是有些慢,這一題是劉汝佳的《演算法藝術與資訊學競賽》p359的例題。

思路:列舉上下兩個頂點成光線所在直線,然後判斷光線是否合法,合法的話列舉判斷光線與管道上下壁是否相交,並存下最遠的交點橫座標。

**

#include

<

iostream

>

#include

<

cmath

>

using

namespace

std;

#define

maxn 25

#define

eps 1e-8

struct

point

point

operator-(

const

point

&a)

const

double

operator*(

const

point

&a)

const

void

input()

}upper[maxn],botto[maxn];

intn;

intsgn(

double

x)void

intersec(point a, point b, point c, point d,

double

*x,

double*y)

//判斷直線l(a,b)和線段l(up,down)是否相交

bool

check(point a,point b,point up,point down)

void

slove()

if(k

>=1)

continue

;for(k=

1;k<=

n;k++)if

(k>

n) intersec(upper[i],botto[j],upper[k-1

],upper[k],

&tx,

&ty);

if(sgn(tx

-upper[k-1

].x)

>=0&&

sgn(tx

-upper[k].x)

<=0)

if(maxx

<

tx) maxx

=tx;

intersec(upper[i],botto[j],botto[k-1

],botto[k],

&tx,

&ty);

if(sgn(tx

-botto[k-1

].x)

>=0&&

sgn(tx

-botto[k].x)

<=0)

if(maxx

<

tx) maxx

=tx;}if

(flag)

break;}

if(flag) puts(

"through all the pipe.");

else

printf(

"%.2lf\n

",maxx);

}int

main()

slove();

}return0;

}

pku 1039 Pipe 叉積的應用

黑書上的一道題目 題意 有一寬度為1的折線管道,上面頂點為 xi,yi 所對應的下面頂點為 xi,yi 1 假設管道都是不透明的,不反射的,光線從左邊入口處的 x0,y0 x,y0 1 之間射入,向四面八方傳播,求解光線最遠能傳播到 取x座標 或者是否能穿透整個管道.如果一根光線自始至終都未擦到任何...

poj 1039 Pipe (計算幾何)

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

POJ 1039 Pipe(計算幾何)

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