欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

[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;
}
}