【计算几何——直线相交】POJ 1039

原创 2012年03月29日 21:22:36

黑书例题

#define eps 1e-9
#define pi acos(-1.0)

struct Point{
    double x,y;
};
int dbl_cmp(double d){
    if (fabs(d)<eps)
        return 0;
    return d>0?1:-1;
}
double det(double x1,double y1,double x2,double y2){
    return x1*y2-x2*y1;
}
double cross(Point a,Point b,Point c){
    return det(b.x-a.x,b.y-a.y,c.x-a.x,c.y-a.y);
}
int segcross_simple(Point a,Point b,Point c,Point d){
    if (dbl_cmp(cross(a,b,c))*dbl_cmp(cross(a,b,d))<=0)
        return 1;//相交
    return 0;//不相交
}
int segcross(Point a,Point b,Point c,Point d,Point &p){//求交点
    double s1,s2;
    int d1,d2;
    s1=cross(a,b,c);
    s2=cross(a,b,d);
    d1=dbl_cmp(s1);
    d2=dbl_cmp(s2);
    //规范相交求交点
    if ((d1^d2)==-2){
        p.x=(c.x*s2-d.x*s1)/(s2-s1);
        return 1;
    }
    if (d2==0){
        p.x=d.x;
        return 1;
    }
    if (d1==0){
        p.x=c.x;
        return 1;
    }
    return 0;
}
int main(){  
    Point up[22],bottom[22],p;
    int n,i,j,k;
    bool all;
    double ans;
    while (scanf("%d",&n) && n){
        all=false;
        ans=MIN;
        for (i=1;i<=n;i++){
            scanf("%lf%lf",&up[i].x,&up[i].y);
            bottom[i].x=up[i].x;
            bottom[i].y=up[i].y-1.0;
        }
        for (i=1;i<=n && !all;i++){
            for (j=1;j<=n;j++){
                for (k=1;k<=n;k++)
                    if (segcross_simple(up[i],bottom[j],up[k],bottom[k])==0)
                        break;
                if (k>n){//都没有交点
                    all=true;
                    break;
                }
                if (k>max(i,j)){
                    segcross(up[i],bottom[j],up[k],up[k-1],p);
                    ans=max(ans,p.x);
                    segcross(up[i],bottom[j],bottom[k],bottom[k-1],p);
                    ans=max(ans,p.x);
                }
            }
        }
        if (all)
            printf("Through all the pipe.\n");
        else
            printf("%.2lf\n",ans);
    }
    return 0;
}





















POJ 1039-Pipe(计算几何-线段相交、求交点)

Pipe Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 10638   Accepted...
  • MIKASA3
  • MIKASA3
  • 2017年02月04日 14:22
  • 255

POJ 1039 Pipe (计算几何、思维、线段相交)

题目链接:http://poj.org/problem?id=1039 题意:给一条曲折的管道,给出的形式是每一个转弯处口的坐标,求光线从入口进入能到的最远的x点,如果能穿过管子则输出“Th...

poj3304 计算几何 线段与直线相交

题意:给定n条线段,确定是否存在一条直线,使得这n条线段在这条直线上的射影具有公共点 可将问题转化为是否存在一条直线经过所有的线段,证明见依然的博客:http://blog.sina.com.cn/...

POJ3304(计算几何基础-判断线段与直线相交)

Segments Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 14774 Accepted: 46...

POJ3304 计算几何--判断直线与线段相交

0.0

POJ1269 简单的计算几何判断直线相交

Intersecting Lines Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 8898...
  • xky0714
  • xky0714
  • 2013年08月11日 15:42
  • 429

判断直线相交思维好题 (poj1039)

Pipe Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 10951 Accepted: 3405 Description Th...

poj 1039 Pipe 直线与线段相交

题目地址:poj1039

POJ 1039 Pipe(直线和线段相交判断,求交点)

Pipe Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 8280 Accepted: 2483 ...

POJ1127——Jack Straws(计算几何,直线相交)

Jack Straws Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 4059   Accepted: 1836...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:【计算几何——直线相交】POJ 1039
举报原因:
原因补充:

(最多只允许输入30个字)