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 メソッドが正方形の対角線の長さを計算するため、機能しません. どうすればこの問題を解決できますか?

#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;
}
4

4 に答える 4

9

距離を確認するだけでは不十分です。形状がひし形である可能性があるため、少なくとも角度を確認する必要があります。

長方形になってしまう可能性があるため、角度だけをチェックするだけでは不十分です。

ポイント間の合計距離は 6 です。それらをすべて計算します。それらの 6 つのうち、4 つが等しい必要があります (それらの長さを呼び出しますx)。-これにより菱形が保証されます

他の 2 つは、それらの間で等しい必要があります (それらの長さを呼び出しますy)。これは長方形を保証します

ひし形と長方形をくっつけてバン!- 四角。

于 2012-05-28T14:22:31.257 に答える
2

正方形の頂点を 1 つ選び (一般性を失わずに A とします)、これを原点と見なします。原点から互いの角 (AB、AC、AD) に形成される 3 つのベクトルを取得します。ベクトル的には、これらは BA、CA、および DA によって与えられます。各ベクトルの内積を計算します。頂点が長方形を形成する場合、1 つの内積はゼロになります (垂直エッジ ベクトル)。それらが正方形を形成する場合、他の 2 つの内積も互いに等しくなければなりません。これは、それらの間の共通の角度が 45 度であるためです。したがって、1 つの内積がゼロで、他の 2 つが互いに等しく、4 つの距離が同じである場合、正方形になります。

于 2012-05-28T17:13:55.770 に答える
2

実際には内積を使って角度だけでできます。各頂点 A には、AB と AC が直角 (0 内積) になるように他の 2 つの頂点 B と C が必要であり、AB と AD および AC と AD が両方とも正確に 45 度 (正規化された) になるように 1 つの頂点 D が必要です。内積 = acos(45 度)、つまり ~ 0.6675)。これが 4 つの頂点すべてに当てはまる場合は、正方形になります。

于 2012-05-28T14:35:04.143 に答える