2012-05-28 25 views
4

我計算點之間的距離,如果距離相等,則點使平方,否則不。我的代碼只適用於以下列順序讀取座標A(x,y),B(x,y),C(x,y),D(x,y)或反向的座標。但是,如果我讀這樣的例如A(x,y),B(x,y),D(x,y),C(x,y),它將不起作用,因爲dist方法將計算平方的對角線長度。我怎麼解決這個問題?閱讀4點的座標。他們做廣場嗎?

#include <iostream> 
using namespace std; 

struct { 
    int x; 
    int y; 
}a[10]; 

int dist(int x1, int y1, int x2, int y2) 
{ 
    int c1, c2; 
    c1 = x2-x1; 
    c2 = y2-y1; 
    return (c1*c1)+(c2*c2); 
} 

int main() 
{ 
    int d1, d2, d3, d4; 
    for (int i=1; i<=4; i++) 
    { 
     cout << 'X' << i << '='; cin >> a[i].x; 
     cout << 'Y' << i << '='; cin >> a[i].y; 
    } 
    d1 = dist(a[1].x, a[1].y, a[2].x, a[2].y); 
    d2 = dist(a[2].x, a[2].y, a[3].x, a[3].y); 
    d3 = dist(a[3].x, a[3].y, a[4].x, a[4].y); 
    d4 = dist(a[4].x, a[4].y, a[1].x, a[1].y); 
    if(d1==d2 && d1==d3 && d1==d4) 
     cout << "Is a square"; 
    else 
     cout << "Is not a square"; 
    return 0; 
} 
+6

如果距離相等,你已經有了一個菱形,不一定是正方形:) – Kos

+1

您應該檢查角度/對角線爲好。四個點中的每一個點應該有兩條相同長度的垂直線和一條長度爲sqrt(2 * x * x)'的對角線。 – chris

+0

https://www.codeeval.com/open_challenges/101/ –

回答

9

檢查距離是不夠的,你需要檢查至少一個角度,因爲形狀可能是菱形。

只檢查角度也是不夠的,因爲你可能會得到一個矩形。

點之間總共有6個距離。計算所有這些。在這6箇中,四個應該是相等的(稱其長度爲x)。 - 這保證了一個菱形

其他兩個應該相等(他們的長度爲y)。 這保證了一個矩形

把一個菱形和一個矩形放在一起,BAM! - 正方形。

+1

酷,但還有一件事:你認爲形狀是凸的。當形狀爲凹形時,OP有問題,如'▶◀',這是不夠的。您還需要考慮訂單。 – Kos

+1

@Kos實際上,這種形狀不會通過第一個要求。 –

+0

我不能同意。檢查距離而不考慮它們的順序將形狀視爲一組4個角點,這使得「▶◀」和矩形無法區分。頂點順序是區分兩者所必需的。 – Kos

2

你實際上只能用內部產品做角度。每個頂點A應該有另外兩個頂點B和C,使得AB和AC處於直角(0內積)以及一個頂點D,使得AB和AD以及AC和AD都處於完全45度(歸一化點積= acos(45度),即〜0.6675)。如果對於所有四個頂點都是正方形,則這是正確的。

2

選擇正方形的一個頂點(不失一般性,如A),並將其視爲原點。從原點到另一個角落(AB,AC,AD)獲取3個向量。這些由B-A,C-A和D-A給出。計算每個向量與另一個向量的內積。如果頂點形成一個矩形,則一個內積將爲零(垂直邊向量)。如果它們形成一個正方形,那麼其他兩個內部產品也必須彼此相等,因爲它們之間的共同角度爲45度。因此,如果一個內積是零,另外兩個彼此相等,並且4個距離相同,則您有一個正方形。

0

有四點,總共有六個距離。如果計算的距離的平方(這是更容易,當然),那麼對於任意一對,長度L1,L2的邊緣的,下面是真

L1 == L2 || 2*L1 == L2 || L1 = 2*L2 

可以創建下面的一段代碼來實現這一點:

int isSquare (point *p1, point *p2, point *p3, point *p4) { 
double dx, dy; 
double dd[6]; 
point *pp[4]; 

pp[0]=p1; pp[1]=p2; pp[2]=p3; pp[3]=p4; 
int ii, jj, kk, nn; 
kk = 0; 
// loop over all combinations of first and second point 
// six in all 
for(ii=0; ii<3; ii++) { 
    for(jj=ii+1; jj<4; jj++) { 
    dx = pp[ii]->x - pp[jj]->x; 
    dy = pp[ii]->y - pp[jj]->y; 
    dd[kk]= dx*dx + dy*dy; 
    if (dd[kk]==0) return 0; // two identical points: not a square 
    if(kk>1) { 
     for(nn= 0; nn < kk-1; nn++) { 
     // if both are "sides", we expect their length to be the same; 
     // if one is a diagonal and the other a side, their ratio is 2 
     // since we are working with the square of the number 
     if (!(((2*dd[nn] == dd[kk]) || \ 
       (dd[nn] == dd[kk]) || \ 
       (2*dd[kk] == dd[nn])))) return 0; 
     } 
    } 
    kk++; 
    } 
} 
return 1; // got here: all combinations tested OK, we have a square 

}