zoukankan      html  css  js  c++  java
  • Rotating Scoreboard

    题目大意:RT

    分析:所谓内核可以理解为在多边形内存在点可以在这个点上看到多边形内部所有的部分,当然怎么求出来就是问题的关键了。我们知道多边形的每条边都是边界值,边的左边和右边肯定是一部分属于多边形一部分属于多边形外,如果这个多边形是顺时针的话那么右边就属于里面,左边就属于外边,如果这条变的外边那么一定是看不到这条边的了,所以可以排出。具体做法如下:

    如上图所示:这个多边形按照顺时针来的,有5个顶点,分别是12345,首先我们先把边12拿出,发现,123都属于边12的右边,45不属于,所以可以吧45扔掉,但是我们发现12和34相交与点A,所以当发现有点在左边的时候需要判断一下它所连接的线是否和这条线有交点,如果有把交点保存下来,可以使用叉积判断左右边。

    代码如下: 


    #include<iostream>
    #include<string.h>
    #include<stdio.h>
    #include<algorithm>
    #include<math.h>
    #include<queue>
    using namespace std;
    
    const int MAXN = 107;
    const int oo = 1e9+7;
    const double EPS = 1e-10;
    
    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 &t)const{
            return Point(x-t.x, y-t.y);
        }
        double operator ^(const Point &t)const{
            return x*t.y - y*t.x;
        }
    
    }p[MAXN], in[MAXN];
    struct Segment
    {///ax + by = c
        Point S, E;
        double a, b, c;
        Segment(Point S=0, Point E=0):S(S), E(E){
            a = S.y - E.y;
            b = E.x - S.x;
            c = E.x*S.y - S.x*E.y;
        }
        Point crossNode(const Segment &t)const{
            Point res;
    
            res.x = (c*t.b-t.c*b) / (a*t.b-t.a*b);
            res.y = (c*t.a-t.c*a) / (b*t.a-t.b*a);
    
            return res;
        }
        int Mul(const Point &t)
        {///用叉积判断方向
            return Sign((E-S)^(t-S));
        }
    };
    int CutPoly(Segment L, int N)
    {
        Point tmp[MAXN];
        int cnt = 0;
    
        for(int i=1; i<=N; i++)
        {
            if(L.Mul(in[i]) <= 0)
                tmp[++cnt] = in[i];
            else
            {
                if(L.Mul(in[i-1]) < 0)///求出交点
                    tmp[++cnt] = L.crossNode(Segment(in[i-1],in[i]));
                if(L.Mul(in[i+1]) < 0)
                    tmp[++cnt] = L.crossNode(Segment(in[i],in[i+1]));
            }
        }
    
        for(int i=1; i<=cnt; i++)
            in[i] = tmp[i];
        in[0] = in[cnt], in[cnt+1] = in[1];
    
        return cnt;
    }
    
    int main()
    {
        int N;
    
        while(scanf("%d", &N) != EOF && N)
        {
            int M;
    
            for(int i=1; i<=N; i++)
            {
                scanf("%lf%lf", &p[i].x, &p[i].y);
                in[i] = p[i];
            }
            in[0] = p[0] = p[N];
            in[N+1] = p[N+1] = p[1];
            M = N;
    
            for(int i=1; i<=N; i++)
                M = CutPoly(Segment(p[i],p[i+1]), M);
    
            if(M > 0)
                printf("YES
    ");
            else
                printf("NO
    ");
        }
    
        return 0;
    }
  • 相关阅读:
    解决windows上安装TortoiseSVN后不能使用命令行问题
    Python里Pure paths、PurePosixPath、PureWindowsPath的区别
    PHP数组运算符
    global,local,static的区别
    echo和print的区别
    PHP中foreach循环传值问题
    Matlab入门学习(文件读写)
    Matlab入门学习(程序设计)
    IDEA中使用Maven下载依赖时报错:unable to find valid certification path to requested target
    全国县市区编码表
  • 原文地址:https://www.cnblogs.com/liuxin13/p/4920531.html
Copyright © 2011-2022 走看看