[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
");
}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
");
return 0;
}
}
printf("YES
");
}
}