[Java]給定二維平面中的4個座標點,如何判定這四個座標點能否構成長方形?(經_典_面_試_題_目)
阿新 • • 發佈:2019-02-16
給定二維平面內的四個點,判斷這四個點是否能組成正方形。座標(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; } }