[Java]给定二维平面中的4个坐标点,如何判定这四个坐标点能否构成长方形?(经_典_面_试_题_目)

来源:互联网 发布:开淘宝店的经历 编辑:程序博客网 时间:2024/06/05 18:32
给定二维平面内的四个点,判断这四个点是否能组成正方形。坐标(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;}}


原创粉丝点击