[Java]给定二维平面中的4个坐标点,如何判定这四个坐标点能否构成长方形?(经_典_面_试_题_目)
程序员文章站
2022-04-02 19:02:20
...
给定二维平面内的四个点,判断这四个点是否能组成正方形。坐标(x,y)为整数。 输入的整数范围为 [-10000, 10000]。
当我们面对问题的时候首先不能头大,回顾初中所学的知识,如何判断一个四边形是否是正方形:正方形判定定理 :1:有一个角是直角的菱形是正方形 2:一组邻边相等的矩形是正方形 3:对角线互相垂直的矩形是正方形4:四边相等,有一个角是直角的四边形是正方形(先证菱形)5:一组邻边相等且有一个角是直角的平行四边形是正方形(先证菱形)6:四边均相等,对角线互相垂直平分且相等的平面四边形(先证菱形)以上红色文字不用阅读 :)为了使本篇文章不成为数学证明题,以上证明过程略.当你看完红字后会感觉一头雾水,这里直接给出程序中判定较为简单的方法:邻边相等且对角线相等的四边形是正方形.我们将由四个坐标点组成的线段进行排序;,默认最长的两条线为对角线,剩下的为四边形的四条边;因为这六条线是有序的,所以将前两条线(相邻边)和后两条线(对角线)进行比较;满足"邻边相等且对角线相等"就可以判定这四个点能否构成正方形了;分析完问题,理清脉络后就会发现问题并不难;接下来进行在编程上的抽象:给定的是坐标;所以用一个长度为2的一维数组进行保存;int p1[],int p2[],int p3[],int p4[];
为了区分四个点;所以用一个二维数组Point [n ] [ m] 来保存上面的一维数组;其中n表示是四个点中的哪一个点,m中下标为0表示相应点中的X坐标;下标为1表示相应点中的Y坐标;所以这个二维数组长度应该为Point [4 ] [ 2];int p[][]={{p1[0],p1[1]},{p2[0],p2[1]},{p3[0],p3[1]},{p4[0],p4[1]}};
别忘了再创建一个数组用来保存线段的长度;
int len[]=new int[6];
接下来就是最重要的一步;进行各个线段长度的计算;
for(int i=0;i<=3;i++){ for(int j=i+1;j<=3;j++){ // p[i][0]是第i个点的x坐标;p[j][1]是第j个点的y坐标 len[cnt++]=(p[i][0]-p[j][0])*(p[i][0]-p[j][0])+(p[i][1]-p[j][1])*(p[i][1]-p[j][1]); } }
然后将这个数组排序;并且分别比较相邻边和对角线长度是否相等就行了,注意避免坐标重叠问题,应该保证对角线长度大于边的长度.
最后附上源代码public class Is_square { public boolean isSquare (int p1[],int p2[],int p3[],int p4[]){ int p[][]={{p1[0],p1[1]},{p2[0],p2[1]},{p3[0],p3[1]},{p4[0],p4[1]}}; int cnt=0; int len[]=new int[6]; for(int i=0;i<=3;i++){ for(int j=i+1;j<=3;j++){ // p[i][0]是第i个点的x坐标;p[j][1]是第j个点的y坐标 len[cnt++]=(p[i][0]-p[j][0])*(p[i][0]-p[j][0])+(p[i][1]-p[j][1])*(p[i][1]-p[j][1]); } } //数组排序 最长的是对角线 Arrays.sort(len); //相邻两边相等,对角线相等的四边形是正方形; if(len[0]==len[1]&&len[4]==len[5]&&len[4]>len[1]){ return true; } return false; } }