麻豆小视频在线观看_中文黄色一级片_久久久成人精品_成片免费观看视频大全_午夜精品久久久久久久99热浪潮_成人一区二区三区四区

首頁 > 學院 > 開發設計 > 正文

POJ 1039-Pipe(計算幾何-線段相交、求交點)

2019-11-14 11:14:38
字體:
來源:轉載
供稿:網友

Pipe
Time Limit: 1000MS Memory Limit: 10000K
Total Submissions: 10638 Accepted: 3293

Description

The GX Light Pipeline Company started to PRepare bent pipes for the new transgalactic light pipeline. During the design phase of the new pipe shape the company ran into the problem of determining how far the light can reach inside each component of the pipe. Note that the material which the pipe is made from is not transparent and not light reflecting. 
Each pipe component consists of many straight pipes connected tightly together. For the programming purposes, the company developed the description of each component as a sequence of points [x1; y1], [x2; y2], . . ., [xn; yn], where x1 < x2 < . . . xn . These are the upper points of the pipe contour. The bottom points of the pipe contour consist of points with y-coordinate decreased by 1. To each upper point [xi; yi] there is a corresponding bottom point [xi; (yi)-1] (see picture above). The company wants to find, for each pipe component, the point with maximal x-coordinate that the light will reach. The light is emitted by a segment source with endpoints [x1; (y1)-1] and [x1; y1] (endpoints are emitting light too). Assume that the light is not bent at the pipe bent points and the bent points do not stop the light beam.

Input

The input file contains several blocks each describing one pipe component. Each block starts with the number of bent points 2 <= n <= 20 on separate line. Each of the next n lines contains a pair of real values xi, yi separated by space. The last block is denoted with n = 0.

Output

The output file contains lines corresponding to blocks in input file. To each block in the input file there is one line in the output file. Each such line contains either a real value, written with precision of two decimal places, or the message Through all the pipe.. The real value is the desired maximal x-coordinate of the point where the light can reach from the source for corresponding pipe component. If this value equals to xn, then the message Through all the pipe. will appear in the output file.

Sample Input

40 12 24 16 460 12 -0.65 -4.457 -5.5712 -10.817 -16.550

Sample Output

4.67Through all the pipe.

Source

Central Europe 1995

題目意思:

給出管道上半部分各個拐點處的坐標(x,y),因為管道寬度為1,所以對應下半部分各個拐點處的坐標是(x,y-1)。

有一道光線從管道最左邊射入,光線不能穿透管壁也不能拐彎,求解它是否能穿過這個管道,如果不可以,輸出到達管中位置的最大橫坐標x。

解題思路:

先根據上下拐點的連線確定光線的入射斜率,枚舉其與各個拐點的上下連線是否有交點,因為有交點則說明光線可以穿過該段管道。如果光線能夠穿過管道,那么它將穿過每一段管道。

如果不能穿過,在第k節管道處無法穿過,則需要計算最大坐標x:

分別計算與第k-1節管子的上、下管壁相交, 求得最大坐標。

#include<iostream>#include<cstdio>#include<cmath>#include<iomanip>using namespace std;#define MAXN 30const int INF=1e9;const double eps=1e-3;struct point{    double x,y;};int sgn(double p)//對double確定精度{    if(fabs(p)<eps)  return 0;    return p>0?1:-1;}double circulation(point a,point b,point c)//計算向量BA、CA的叉積{    return (b.x-a.x)*(c.y-a.y)-(b.y-a.y)*(c.x-a.x);}double dir(point A,point B,point P)//計算P點在AB的左側還是右側(AC與AB的螺旋關系){    return circulation(A,B,P);}bool cross(point A,point B,point C,point D)//判斷線段AB和CD是否相交{    return (sgn(dir(A,B,C))*sgn(dir(A,B,D))<=0);}double intersection(point A,point B,point C,point D)//求AB與CD的交點x值{    double area1=dir(A,B,C);    double area2=dir(A,B,D);    int c=sgn(area1);    int d=sgn(area2);    if(c*d<0) //CD在AB的兩側,規范相交        return (area2*C.x - area1*D.x)/(area2-area1);//交點計算公式    if(c*d==0)   //CD的其中一個端點在AB上,不規范相交    {        if(c==0)            return C.x;//C在AB上,返回AB與CD非規范相交時的交點C的橫坐標        else            return D.x;//D在AB上,返回AB與CD非規范相交時的交點D的橫坐標    }    return -INF; //CD在AB同側,無交點,返回負無窮}int main(){#ifdef ONLINE_JUDGE#else    freopen("F:/cb/read.txt","r",stdin);    //freopen("F:/cb/out.txt","w",stdout);#endif    ios::sync_with_stdio(false);    cin.tie(0);    int n;    while(cin>>n&&n)//n表示管道的數目    {        point p[MAXN],q[MAXN];        for(int i=0; i<n; i++)        {            cin>>p[i].x>>p[i].y;            q[i].x=p[i].x;            q[i].y=p[i].y-1;        }        bool flag=false;        double ans=-INF;        int k;        for(int i=0; i<n; i++)//枚舉每段線段        {            for(int j=0; j<n; j++)            {                if(i==j) continue;                for(k=0; k<n; k++)//枚舉當前光線與第k個拐點處的上下連線是否相交                    if(!cross(p[i],q[j],p[k],q[k]))//掃描到一個不相交                        break;                if(k>=n)//與每個拐點處都相交                {                    flag=true;                    break;                }                else if(k>max(i,j))//不能穿過,求解最大x值                {                    double temp=intersection(p[i],q[j],p[k],p[k-1]);//求交點橫坐標                    if(ans<temp)//與第k-1節管子的上管壁相交                        ans=temp;                    temp=intersection(p[i],q[j],q[k],q[k-1]);                    if(ans<temp)//與第k-1節管子的上管壁相交                        ans=temp;                }            }            if(flag)//可穿                break;        }        if(flag)            cout<<"Through all the pipe."<<endl;        else            cout<<fixed<<setprecision(2)<<ans<<endl;    }    return 0;}/*40 12 24 16 460 12 -0.65 -4.457 -5.5712 -10.817 -16.550*/


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 亚洲成人免费视频在线 | 美女污污在线观看 | 亚洲电影在线播放 | 日本网站一区二区三区 | 久草视频在线看 | 视频久久免费 | 久久最新视频 | 亚洲精品无码不卡在线播放he | 水卜樱一区二区av | 国产视频软件在线 | 美女视频网站黄色 | 日日鲁一鲁视频 | 欧美一级毛片欧美一级成人毛片 | 久久人人爽人人爽人人片av高清 | 羞羞羞网站 | 国产精品亚洲综合一区二区三区 | 91青青 | 99影视在线视频免费观看 | 亚洲精品a在线观看 | 成人毛片免费视频 | av影院在线播放 | 视频一区二区在线观看 | 国产精品1区2区 | 中文字幕在线第二页 | 黄色一级片在线免费观看 | 深夜影院一级毛片 | 日韩一级片一区二区三区 | 性猛交ⅹxxx乱巴西 欧美日韩1区2区3区 | 久久国产精品99国产 | 男男啪羞羞视频网站 | 久久久久久久黄色片 | 国产一区精品在线观看 | julieann艳星激情办公室 | 国产成人av免费看 | 色综合狠狠 | 中文字幕在线第二页 | 在线亚洲综合 | 黄色av片在线观看 | 91成人免费网站 | 天天草天天干天天射 | 91社区电影|