|
Posted on 2010-09-17 17:59 Uriel 阅读(404) 评论(0) 编辑 收藏 引用 所属分类: POJ 、 计算几何
5门专业必修+4门大类选修真纠结。。微机、计算机图像处理还行,数据库也还行,计算机组成原理算得头大,最纠结的还是编译原理,K老师的课漏听30min肯定就听不懂了,作业又一堆。。每天白天都用来上课+写作业了。。就晚上选修课结束回1教切会题。。 看起来很水的一道计算几何卡了两天才过。。悲剧啊。。 一开始没注意相似的点是对应的,不会说第一个多边形的第1个点对应第二个多边形的第3个点之类的,想了几个WS算法,WA。。今天注意到了这点,结果改来改去还是不对。。最后看了某解题报告,把判转向那里改了一下,总算过了。。 代码比较挫。。很多无用的东西懒得擦掉了。。
#include<math.h>
#include<stdio.h>
#include<stdlib.h>
#include<algorithm>
using namespace std;
#define eps 1e-6
const double INF=1e20;

 struct point {
double x,y;
 point operator-(point &b) {
point c;
c.x = x - b.x;
c.y = y - b.y;
return c;
}
}p1[11],p2[11];

int n;
int dir1[11],dir2[11];
double len1[11],len2[11];

 double dis(point a,point b) {
return (a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y);
}

 double Cos(point p0,point p1,point p2) {
return (dis(p0,p1)+dis(p1,p2)-dis(p0,p2))/(2*sqrt(dis(p0,p1))*sqrt(dis(p1,p2)));
}

 int cross_product(point p1,point p2,point p0) {
return (p1.x-p0.x)*(p2.y-p0.y)-(p2.x-p0.x)*(p1.y-p0.y);
}

 double dot_product(point p1,point p2,point p0) {
return (p1.x-p0.x)*(p2.x-p0.x)+(p1.y-p0.y)*(p2.y-p0.y);
}

 double cross(point a, point b) {
return a.x * b.y - a.y * b.x;
}

 int get_dir(point p1,point p2,point p3) {
double t1=cross(p2-p1,p3-p2);
if(fabs(t1)<eps)return 1;
if(t1<0)return 2;
else return 3;
}

 int main() {
int f1,f2,i,j,cnt;
bool ok;
double minn1,len,minn2,cons;
 while(scanf("%d",&n),n) {
for(i=0;i<n;i++)scanf("%lf %lf",&p1[i].x,&p1[i].y);
for(i=0;i<n;i++)scanf("%lf %lf",&p2[i].x,&p2[i].y);
cons=sqrt(dis(p1[0],p1[1]))/sqrt(dis(p2[0],p2[1]));
 for(i=0;i<n;i++) {
len1[i]=sqrt(dis(p1[i],p1[(i+1)%n]))/cons;
len2[i]=sqrt(dis(p2[i],p2[(i+1)%n]));
}
ok=true;
 for(i=0;i<n;i++) {
 if(fabs(len1[i]-len2[i])>eps) {
ok=false;
break;
}
}
 if(ok) {
 for(i=0;i<n;i++) {
 if(fabs(fabs(Cos(p1[i],p1[(i+1)%n],p1[(i+2)%n]))-fabs(Cos(p2[i],p2[(i+1)%n],p2[(i+2)%n])))>eps) {
ok=false;
break;
}
}
}
 if(ok) {
 for(i=0;i<n;i++) {
 if(get_dir(p1[i],p1[(i+1)%n],p1[(i+2)%n])!=get_dir(p2[i],p2[(i+1)%n],p2[(i+2)%n])) {
ok=false;
break;
}
}
}
if(ok)puts("similar");
else
puts("dissimilar");
}
return 0;
}
|