给定二维空间中四点的坐标,返回四点是否可以构造一个正方形。
一个点的坐标(x,y)由一个有两个整数的整数数组表示。
注意:
所有输入整数都在 [-10000,10000] 范围内。
一个有效的正方形有四个等长的正长和四个等角(90度角)。
输入点没有顺序。
判断对角线比较简单,正方形对角线需要:
① 相等
②相互垂直
③中点重合
满足这两个即可判定是正方形
而如果用边判断就比较麻烦,要判断四条边垂直相等,由于点的顺序不确定,带来很多麻烦
对角线就只要两两组合即可,对顺序要求不高
class Solution {
public boolean h(int[] p1, int[] p2, int[] p3, int[] p4){
boolean flag=true;
//对角线要相等
flag=flag&&(Math.pow(p1[0]-p2[0],2)+Math.pow(p1[1]-p2[1],2)==Math.pow(p3[0]-p4[0],2)+Math.pow(p3[1]-p4[1],2));
//对角线要垂直
flag=flag&&(0==((p1[0]-p2[0])*(p3[0]-p4[0])+(p1[1]-p2[1])*(p3[1]-p4[1])));
//对角线中心要重合
flag=flag&&(p1[0]+p2[0]==p3[0]+p4[0])&&(p1[1]+p2[1]==p3[1]+p4[1]);
return flag;
}
//点重合判断
public boolean h2(int[] p1, int[] p2){
return p1[0]-p2[0]!=0||p1[1]-p2[1]!=0;
}
public boolean validSquare(int[] p1, int[] p2, int[] p3, int[] p4) {
return (h2(p1,p2))&&(h(p1,p2,p3,p4)||h(p1,p3,p2,p4)||h(p1,p4,p3,p2));
}
}