[Codeforces 1300D]Aerodynamic(计算几何)

[Codeforces 1300D]Aerodynamic(计算几何)

题面

给出一个凸多边形,判断该多边形平移得到的包含原点的所有多边形的并得到的吐血,和这个凸多边形本身相似。

分析

发现如果点数为奇数显然不行。否则判断这个多边形是否中心对称即可,即判断对边中点是否重合。

代码

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#define maxn 100000
using namespace std; 
struct Vector{
    double x;
    double y;
    Vector(){

    }
    Vector(double _x,double _y){
        x=_x;
        y=_y;
    }
    friend Vector operator + (Vector p,Vector q){
        return Vector(p.x+q.x,p.y+q.y);
    }
    friend Vector operator - (Vector p,Vector q){
        return Vector(p.x-q.x,p.y-q.y);
    }
    friend Vector operator * (Vector a,double d){
        return Vector(a.x*d,a.y*d);
    }
    friend Vector operator / (Vector a,double d){
        return Vector(a.x/d,a.y/d);
    }
    friend bool operator == (Vector p,Vector q){
    	return p.x==q.x&&p.y==q.y;
	}
	friend bool operator != (Vector p,Vector q){
    	return !(p==q);
	}
};
typedef Vector point;
inline double dot(Vector p,Vector q){
    return p.x*q.x+p.y*q.y;
}
inline double dist(point p,point q){
    return sqrt(dot(p-q,p-q));
}
inline double cross(Vector p,Vector q){
    return p.x*q.y-p.y*q.x;
}
inline double length(Vector x){
    return sqrt(dot(x,x));
} 
int n;
point a[maxn+5],b[maxn+5];
int main(){
	scanf("%d",&n);
	for(int i=1;i<=n;i++){
		scanf("%lf %lf",&a[i].x,&a[i].y);
	}
	if(n%2==1){
		printf("NO\n");
	}else{
		for(int i=2;i<=n/2;i++){
			if((a[i]+a[i+n/2])!=(a[i-1]+a[i-1+n/2])){
				printf("NO\n");
				return 0;
			}
		}
		printf("YES\n");
	}
}
posted @ 2020-02-10 10:05  birchtree  阅读(235)  评论(0编辑  收藏  举报