• Geometric Shapes


    题目大意:给一些几何图形的编号,求出来这些图形都和那些相交。
     
    分析:输入的正方形对角线上的两个点,所以需要求出来另外两个点,公式是:
    x2:=(x1+x3+y3-y1)/2; y2:=(y1+y3+x1-x3)/2;
    x4:=(x1+x3-y3+y1)/2; y4:=(y1+y3-x1+x3)/2;
    这个是可以推倒出来的,有兴趣的可以推一下,给的矩形三个点,是按照顺序给的,求出来第四个点即可,比较容易求,x4=x1-x2+x3, y4=y1-y2+y3
    别的图形的点也都是按照顺序给的,两个图形如果相交一定是边的相交,一个图形把另一个包含不算相交。所以处理完输入输出,还是比较容易做的。
     
    代码如下:
    ========================================================================================================================
    #include<stdio.h>
    #include<math.h>
    #include<string.h>
    #include<algorithm>
    using namespace std;
    
    const int MAXN = 26;
    const double EPS = 1e-8;
    
    int Sign(double t)
    {
        if(t > EPS)return 1;
        if(fabs(t) < EPS)return 0;
        return -1;
    }
    struct Point
    {
        double x, y;
        Point(double x=0, double y=0):x(x),y(y){}
        Point operator - (const Point &tmp)const{
            return Point(x-tmp.x, y-tmp.y);
        }
        double operator ^(const Point &tmp)const{
            return x*tmp.y - y*tmp.x;
        }
    };
    struct Segment
    {
        Point S, E;
        Segment(Point S=0, Point E=0):S(S), E(E){}
        bool Intersect(const Segment &tmp)const{
            int t1 = Sign((S-E)^(tmp.S-E));
            int t2 = Sign((S-E)^(tmp.E-E));
    
            return abs(t1+t2) != 2;
        }
    };
    struct Shapes
    {
        Segment sg[MAXN];
        int N;
    };
    bool Find(int u, int v, Shapes a[])
    {
        for(int i=0; i<a[u].N; i++)
        for(int j=0; j<a[v].N; j++)
        {
            if(a[u].sg[i].Intersect(a[v].sg[j]) && a[v].sg[j].Intersect(a[u].sg[i]))
                return true;
        }
    
        return false;
    }
    void Link(Shapes a[], int k, Point p[])
    {
        int i, N=a[k].N;
        p[N] = p[0];
        for(i=1; i<=N; i++)
            a[k].sg[i-1] = Segment(p[i-1], p[i]);
    }
    int main()
    {
        char Id[MAXN], s[MAXN], s1[MAXN], s2[MAXN];
        Shapes a[MAXN];
        Point p[MAXN];
    
        memset(a, 0, sizeof(a));
    
        while(scanf("%s", Id) != EOF && Id[0] != '.')
        {
            if(Id[0] == '-')
            {
                for(int i=0; i<MAXN; i++)
                {
                    if(a[i].N)
                    {///如果这个符号的形状存在
                        int ans[MAXN], k=0;
                        for(int j=0; j<MAXN; j++)
                        {
                            if(!a[j].N || i==j)
                                continue;
                            if(Find(i, j, a) == true)
                                ans[k++] = j;
                        }
    
                        if(k == 1)
                            printf("%c intersects with %c
    ", i+'A', ans[0]+'A');
                        else if(k == 0)
                            printf("%c has no intersections
    ", i+'A');
                        else
                        {
                            printf("%c intersects with %c", i+'A', ans[0]+'A');
                            for(int t=1; t<k-1; t++)
                                printf(", %c", ans[t]+'A');
                            if(k == 2)
                                printf(" and %c
    ", ans[k-1]+'A');
                            else
                                printf(", and %c
    ", ans[k-1]+'A');
                        }
                    }
                }
                printf("
    ");
                memset(a, 0, sizeof(a));
            }
            else
            {
                scanf("%s", s);
                int k = Id[0] - 'A';
    
                if(strcmp(s, "square") == 0)
                {///正方形
                    a[k].N = 4;
                    scanf("%s%s", s1, s2);
                    sscanf(s1, "(%lf,%lf)", &p[0].x, &p[0].y);
                    sscanf(s2, "(%lf,%lf)", &p[2].x, &p[2].y);
    
                    p[1].x = (p[0].x+p[2].x + p[2].y-p[0].y)/2;
                    p[1].y = (p[0].x-p[2].x + p[0].y+p[2].y)/2;
                    p[3].x = (p[0].x+p[2].x + p[0].y-p[2].y)/2;
                    p[3].y = (p[2].x-p[0].x + p[0].y+p[2].y)/2;
                }
                else if(strcmp(s, "line") == 0)
                {///直线
                    a[k].N = 2;
                    scanf("%s%s", s1, s2);
                    sscanf(s1, "(%lf,%lf)", &p[0].x, &p[0].y);
                    sscanf(s2, "(%lf,%lf)", &p[1].x, &p[1].y);
                }
                else if(strcmp(s, "rectangle") == 0)
                {///长方形
                    a[k].N = 4;
                    for(int t=0; t<3; t++)
                    {
                        scanf("%s", s1);
                        sscanf(s1, "(%lf,%lf)", &p[t].x, &p[t].y);
                    }
                    p[3].x = p[0].x-p[1].x+p[2].x;
                    p[3].y = p[0].y-p[1].y+p[2].y;
                }
                else if(strcmp(s, "triangle") == 0)
                {///三角形
                    a[k].N = 3;
                    for(int t=0; t<3; t++)
                    {
                        scanf("%s", s1);
                        sscanf(s1, "(%lf,%lf)", &p[t].x, &p[t].y);
                    }
                }
                else if(strcmp(s, "polygon") == 0)
                {///多边形
                    scanf("%d", &a[k].N);
    
                    for(int t=0; t<a[k].N; t++)
                    {
                        scanf("%s", s1);
                        sscanf(s1, "(%lf,%lf)", &p[t].x, &p[t].y);
                    }
                }
    
                Link(a, k, p);
            }
        }
    
        return 0;
    }
  • 相关阅读:
    C# dynamic使用
    Linq简介二
    遇事处理方式
    为什么select关键字没有放到前面而是放到了后面
    decimal、float、double区别
    ViewBag、ViewData、TempData区别
    CommandBehavior.CloseConnection的使用
    LINQ简介一
    ViewBag、ViewData使用
    SQL Server 使用WriteText 存储大容量数据
  • 原文地址:https://www.cnblogs.com/liuxin13/p/4797478.html
Copyright © 2020-2023  润新知