HDU 3902 Swordsman 2011 Multi-University Training Contest 7 - Host by ECNU 计算几何

    /*
	判断给定的多边形是不是轴对称图形
	因为对称轴仅可能经过顶点或者边的终点
	只需要枚举这些点能在o(n^2)的复杂度内解决
	*/
	#include<iostream>  
	#include<cstdio>
	#include<cmath>
    using namespace std;  
    #define N 40005  
	#define eps 1e-4;
    struct node{  
        double x,y;  
    }p[N];  
	int n,flag;
	double dis(int i,int a)
	{
	return (p[i].x-p[a].x)*(p[i].x-p[a].x)+(p[i].y-p[a].y)*(p[i].y-p[a].y);
	}
   
   int main()
	{
		while(scanf("%d",&n)!=EOF)
		{
			flag=0;
			for(int i=0;i<2*n;i=i+2)
			{
				scanf("%lf%lf",&p[i].x,&p[i].y);
				if(i!=0)
				{
					p[i-1].x=(p[i].x+p[i-2].x)/2.0;
					p[i-1].y=(p[i].y+p[i-2].y)/2.0;//拓展出边的中点
				}
			}
			p[2*n-1].x=(p[0].x+p[2*n-2].x)/2.0;
			p[2*n-1].y=(p[0].y+p[2*n-2].y)/2.0;
			for(int i=0;i<n;i++)//枚举有可能在对称轴上的点
			{		
				double x1=p[i].x-p[i+n].x;
				double y1=p[i].y-p[i+n].y;
				int k=i-1;
				int j=i+1;
				for(;j<i+n;j++,k--)//检查其他点是否关于此点对称
				{
					if(k<0)k=2*n-1;
					double x2=p[j].x-p[k].x;
					double y2=p[j].y-p[k].y;
					if(x1*x2+y1*y2!=0)
					break;
					if(dis(i,j)!=dis(i,k))
					break;
				}
				if(j==i+n)
				{
					flag=1;break;
				}
			}
			if(flag)puts("YES");
			else puts("NO");
		}
	}

你可能感兴趣的:(struct,ini,图形,Training)