ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

Pipe 计算几何基础

2020-01-20 17:02:22  阅读:240  来源: 互联网

标签:p2 p1 int double pos Pipe 计算 几何 e1


题意:

题目链接1题目链接2
大概就是给你一些管道,求光从管口处射入最多能射多远

思路:

枚举拐点(上壁与下壁都算)作为直线(光束)上的两个点。然后判断这条直线和每一条线段\((x_i, y_i)(x_i, y_i - 1)\)是否有交点。若无,则求出最远能到达的x。

注意事项:

丧心病狂的卡精度
不能直接跟0比较,而应是eps(好像本来就该这样吧。。。)
考虑精度误差,以及各种细节

code:

#include<cstdio>
#include<cmath>
#include<algorithm>
using namespace std;
const int N=30;
const double eps=1e-7;
struct point{double x,y;}e1[N],e2[N];
inline double lfabs(double x){if(x<-eps)x=-x;return x;}
bool operator==(point x,point y){return (lfabs(x.x-y.x)<eps)&&(lfabs(x.y-y.y)<eps);}
point operator-(point x,point y){return (point){x.x-y.x,x.y-y.y};}
double operator^(point x,point y){return x.x*y.y-x.y*y.x;}
double ans;
int n;
inline double inc(point p1,point p2,point u,point v)
{
    return (((p1-u)^(p2-u))*((p1-v)^(p2-v)));//线段与直线判断交点情况
}
inline double slv_inc(point p1,point p2,point u,point v)
{
    double s1=(u-p1)^(v-p1),s2=(v-p2)^(u-p2);
    double anss=p2.x+(p1.x-p2.x)*s2/(s1+s2);
    return anss;
}
int main()
{
    while(7)
    {
        scanf("%d",&n);
        if(!n) break;
        for(int i=1;i<=n;++i)
        {
            scanf("%lf%lf",&e1[i].x,&e1[i].y);
            e2[i]=e1[i]-(point){0.0,1.0};
        }
        bool pd=0;
        int nn=n<<1;ans=e1[1].x;
        for(int i=1;i<=nn&&(!pd);++i)
            for(int j=i+1;j<=nn;++j)
            {
                point p1=i<=n?e1[i]:e2[i-n];
                point p2=j<=n?e1[j]:e2[j-n];
                if(p1.x>p2.x) swap(p1,p2);
                bool flag=0;int pos=0;
                for(int k=1;k<=n;++k)
                {
                    if(e1[k]==p1||e1[k]==p2||e2[k]==p1||e2[k]==p2) continue;
                    if(e1[k].x-p2.x>eps){pos=k;break;}
                    if(inc(p1,p2,e1[k],e2[k])>eps){flag=1;break;}
                }
                if(flag) continue;
                while(inc(p1,p2,e1[pos],e2[pos])<eps&&pos<=n)++pos;
                if(pos>n||pos==0){puts("Through all the pipe.");pd=1;break;}
                if(inc(p1,p2,e1[pos],e1[pos-1])<eps)ans=max(ans,slv_inc(p1,p2,e1[pos],e1[pos-1]));
                if(inc(p1,p2,e2[pos],e2[pos-1])<eps)ans=max(ans,slv_inc(p1,p2,e2[pos],e2[pos-1]));
            }
        if(pd) continue;
        printf("%.2f\n",ans);
    }
    return 0;
}

标签:p2,p1,int,double,pos,Pipe,计算,几何,e1
来源: https://www.cnblogs.com/zmyzmy/p/12218608.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有