1. 程式人生 > >[Java]給定二維平面中的4個座標點,如何判定這四個座標點能否構成長方形?(經_典_面_試_題_目)

[Java]給定二維平面中的4個座標點,如何判定這四個座標點能否構成長方形?(經_典_面_試_題_目)

給定二維平面內的四個點,判斷這四個點是否能組成正方形。座標(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;
}
}