• Intersection--poj1410(判断线段与矩形的关系)


    http://poj.org/problem?id=1410

    题目大意:给你一个线段和矩形的对角两点  如果相交就输出'T'  不想交就是'F'

    注意:

    1,给的矩形有可能不是左上 右下  所以要先判断的

    2,线段在矩形的内部输出T

    3,如果交点是矩形的顶点的话 是不相交的

    情况有点多  刚开始考虑的太少   wa的我心疼    

    #include<stdio.h>
    #include<string.h>
    #include<stdlib.h>
    #include<ctype.h>
    #include<math.h>
    #include<queue>
    #include<algorithm>
    #include<iostream>
    
    using namespace std;
    #define N 20
    const double ESP = 1e-8;
    #define INF 0x3f3f3f3f
    #define memset(a,b) memset(a,b,sizeof(a))
    
    struct Point
    {
        double x,y;
        Point(double x=0,double y=0):x(x),y(y) {}
        Point operator - (const Point &temp)const
        {
            return Point(x-temp.x,y-temp.y);
        }
        int operator * (const Point &temp)const
        {
            double t=(x*temp.y)-(y*temp.x);
            if(t>ESP)
                return 1;
            if(fabs(t)<ESP)
                return 0;
            else
                return -1;
        }
    } p[N],j;
    
    Point line(Point u1,Point u2,Point v1,Point v2)///求交点模板
    {
        Point ret=u1;
        double t=((u1.x-v1.x)*(v1.y-v2.y)-(u1.y-v1.y)*(v1.x-v2.x))/((u1.x-u2.x)*(v1.y-v2.y)-(u1.y-u2.y)*(v1.x-v2.x));
    
        ret.x+=(u2.x-u1.x)*t;
        ret.y+=(u2.y-u1.y)*t;
    
        return ret;
    }
    
    
    int main()
    {
        int n;
        scanf("%d",&n);
        while(n--)
        {
            j.x=j.y=INF;
            memset(p,0);
            double x1,x2,y1,y2;
            double a,b,c,d;
            scanf("%lf %lf %lf %lf",&x1,&y1,&x2,&y2);
            scanf("%lf %lf %lf %lf",&a,&b,&c,&d);
            if(a>c)
                swap(a,c),swap(b,d);
            int u,D;
            u=max(b,d);
            D=min(b,d);
            if(x1>=a && x1<=c && x2>=a && x2<=c && y1>=D && y1<=u && y2>=D && y2<=u)
            {
                printf("T
    ");
                continue;
            }
            ///判断线段与矩形的一条边是否相交
            p[1]=Point(x1,y1);
            p[2]=Point(x2,y2);
            p[3]=Point(a,b);
            p[4]=Point(c,b);
            p[5]=Point(c,b);
            p[6]=Point(c,d);
            p[7]=Point(a,b);
            p[8]=Point(a,d);
            p[9]=Point(a,d);
            p[10]=Point(c,d);
            int k,kk;
            int flag=0;
            for(int i=2; i<=5; i++)
            {
                k=abs((p[1]-p[i*2-1])*(p[i*2]-p[i*2-1])+(p[2]-p[i*2-1])*(p[i*2]-p[i*2-1]));
                kk=abs((p[i*2-1]-p[1])*(p[2]-p[1])+(p[i*2]-p[1])*(p[2]-p[1]));
                if(k!=2 && kk!=2)///如果相交
                {
                    if((p[1]-p[i*2-1])*(p[i*2]-p[i*2-1])==0 && (p[2]-p[i*2-1])*(p[i*2]-p[i*2-1])==0)///共线
                    {
                        if(i==2 || i==5)
                        {
                            if((p[1].x>a && p[1].x<c)||(p[2].x>a && p[2].x<c) || (p[1].x<=a && p[2].x>=c) || (p[2].x<=a && p[1].x>=c))
                            {
                                flag=1;
                                break;
                            }
                        }
                        else
                        {
                            if((p[1].y>D && p[1].y<u)||(p[2].y>D && p[2].y<u) || (p[1].y<=D && p[2].y>=u) || (p[2].y<=D && p[1].y>=u))
                            {
                                flag=1;
                                break;
                            }
                        }
                    }
                    j=line(p[1],p[2],p[i*2],p[i*2-1]);
                    if(i==2)
                    if(j.x>a && j.x<c && j.y==b)///如果交点在a和c之间(不包括a c)
                    {
                        flag=1;
                        break;
                    }
                    if(i==3)
                    {
                        if(j.x==c && j.y>D && j.y<u)
                        {
                            flag=1;
                            break;
                        }
                    }
                    if(i==4)
                    {
                        if(j.x==a && j.y>D && j.y<u)
                        {
                            flag=1;
                            break;
                        }
                    }
                    if(i==5)
                    {
                        if(j.x>a && j.x<c && j.y==d)
                        {
                            flag=1;
                            break;
                        }
                    }
                }
            }
            if(flag==0)
                printf("F
    ");
            else
                printf("T
    ");
        }
        return 0;
    }
  • 相关阅读:
    github替代品
    【推荐】通用全面的APP测试用例设计
    Jmeter 性能测试,完整入门篇
    2020年,有哪些特别好用的 app 测试工具?
    如何做好Web端性能测试?
    如何做Web服务的性能测试?
    Office 各版本批量授权(VOL)和激活方法
    django中引用bootstrap的几种方式
    list类型数据执行效率测试
    Linux安装python3环境
  • 原文地址:https://www.cnblogs.com/linliu/p/5435932.html
Copyright © 2020-2023  润新知