FZU 1918 John’s Direction 解题报告

题意:给出一个点,和一堆边和坐标轴平行的多边形,问由这个点发出的射线不和多边形相交的角度之和。多边形是给出一个起点,然后通过向前走一定的距离和向左向右转90度得到的,且最后一个点是起点
解法:用atan2计算出起点和多边形每条边的极角的大小,然后统计不重叠的角度的大小之和。所得的是会和多边形相交的角度,再用360减就可以。
要注意的地方是,所得的交是小于180°的,如果用atan2计算出两角之差大于pi,则角度应该为(a2,PI)和(-PI,a1);
如果点在多边形边上,要特判。其实直接跳过就可以。
还有一点是有可能出现-0.00所以要取绝对值或者+eps,我就是因为这个wa了六炮
//Memory: 15884 KB		
//Time: 375 MS
#include 
#include 
#include 
#include 
#include 
#include 
#include 
using namespace std;
const int maxn = 1000005;
const int inf = 1111111111;
const double eps = 1e-10;
const double PI = acos(-1.0);
int dx[]={0,-1,0,1},dy[]={1,0,-1,0};
int dcmp(double x)
{
    if(fabs(x) PI)
    {
        arg[an++] = Node(a2,PI);
        arg[an++] = Node(-PI,a1);
    }
    else arg[an++] = Node(a1,a2);
}
int main()
{
    //freopen("in.txt","r",stdin);
    int cas,n,m,d;
    double len;
    char str[5];
    Point q,p1,p2;
    scanf("%d",&cas);

    for(int ca = 1; ca<=cas; ca++)
    {
        scanf("%d",&n);
        q.input();
        an = 0;
        for(int i = 0; i < n; i++)
        {
            scanf("%d",&m);
            p1.input();
            d = 0;
            for(int j = 0; j < m; j++)
            {
                scanf("%s",str);
                //cout<0)
                {
                    ans+=arg[i].y-r;
                    r= arg[i].y;
                }
            }
            else
            {
                l = arg[i].x,r = arg[i].y;
                ans+=r-l;
            }
        }
        printf("Case %d: %.2lf\n",ca,(2*PI-ans)/PI*180+eps);
    }
    return 0;
}

你可能感兴趣的:(中等,计算几何)