题意:两组点分别表示两个图形,判断两个图形是否相似。(可旋转或放大缩小)
判断每对应两点的距离是否成比例。
#include<stdio.h>
#include<math.h>
#include<iostream>
#include<algorithm>
using namespace std;
#define eps 1e-8
#define ll long long
struct q
{
int a;
int b;
}q[20],p[20];
ll q1[200],p1[200];
ll f(int a,int b,int c,int d)
{
return (c-a)*(c-a)+(d-b)*(d-b);
}
int judge(int qk)
{
int i;
for(i=1;i<qk;i++)
{
if(q1[i]*p1[0]!=q1[0]*p1[i])
return 0;
}
return 1;
}
int main()
{
int n,i,j;
while(scanf("%d",&n)!=EOF)
{
if(!n)break;
for(i=0;i<n;i++)
{
scanf("%d%d",&q[i].a,&q[i].b);
}
for(i=0;i<n;i++)
{
scanf("%d%d",&p[i].a,&p[i].b);
}
int qk=0,ph=0;
ll d1=(q[1].a-q[0].a)*(q[2].b-q[0].b)-(q[1].b-q[0].b)*(q[2].a-q[0].a);
ll d2=(p[1].a-p[0].a)*(p[2].b-p[0].b)-(p[1].b-p[0].b)*(p[2].a-p[0].a);
for(i=0;i<n-1;i++)
for(j=i+1;j<n;j++)
{
q1[qk++]=f(q[j].a,q[j].b,q[i].a,q[i].b);
p1[ph++]=f(p[j].a,p[j].b,p[i].a,p[i].b);
}
if(judge(qk)&&d1*d2>=0)cout<<"similar"<<endl;
else cout<<"dissimilar"<<endl;
}
return 0;
}