Description
在二维坐标轴内给出四个点,这四个点能否构成一个正方形。
Input
第一行包括一个整数:T(1≤T≤30),表明有T组测试数据。
下面各行有8个整数:x1,y1,x2,y2,x3,y3,x4,y4(数据均在-1000,1000之间),以逆时针顺序给出四个点的坐标。
Output
对每个样例,如果是正方形,则单独在一行内输出YES,否则,输出NO。
Sample Input
2
0 0 1 0 1 1 0 1
-1 0 0 -2 1 0 2 0
Sample Output
YES
在二维坐标轴内给出四个点,这四个点能否构成一个正方形。
Input
第一行包括一个整数:T(1≤T≤30),表明有T组测试数据。
下面各行有8个整数:x1,y1,x2,y2,x3,y3,x4,y4(数据均在-1000,1000之间),以逆时针顺序给出四个点的坐标。
Output
对每个样例,如果是正方形,则单独在一行内输出YES,否则,输出NO。
Sample Input
2
0 0 1 0 1 1 0 1
-1 0 0 -2 1 0 2 0
Sample Output
YES
NO
判断正方形的条件是:
四条边都相等,任意两个向量都垂直。 垂直的代码是:x1*x2+y1*y2=0,用勾股定理怎么都不对,考虑到精度的问题,做题的时候,还是找最靠谱的方式做,最好的方法,就是最接近成功的。
#include <iostream>
#include <stdio.h>
#include <math.h>
int distance(int x1,int y1,int x2,int y2)
{
// printf("%d %d %d %d\n",x1,y1,x2,y2);
int d=sqrt((x2-x1)*(x2-x1)+(y2-y1)*(y2-y1));
return d;
}
int main(void)
{
//freopen("C.txt","r",stdin);
int n;
scanf("%d",&n);
while(n--)
{
int x1,x2,x3,x4,y1,y2,y3,y4;
scanf("%d%d%d%d%d%d%d%d",&x1,&y1,&x2,&y2,&x3,&y3,&x4,&y4);
int d1;d1=distance(x1,y1,x2,y2);
int d2=distance(x1,y1,x3,y3);
int d3=distance(x1,y1,x4,y4);
int d4=distance(x2,y2,x3,y3);
int d5=distance(x3,y3,x4,y4);
// printf("%d %d %d %d %d\n",d1,d2,d3,d4,d5);
if(d1==d3&&d1==d4&&d1==d5&&d3==d4&&d3==d5&&d4==d5&&(x1*x2+y1*y2==0))
printf("YES\n");
else
printf("NO\n");
}
return 0;
}