2つのポイントで長方形を定義する背後にあるアイデアは何ですか? [閉まっている

softwareengineering.stackexchange https://softwareengineering.stackexchange.com/questions/22643

質問

これが理にかなっていないということではありませんが、99%の時間の厄介な作品を作るだけです。

多くの場合、2Dグラフィックスでは、長方形が初期化され、保存され、一対のポイントとして操作されます。特定の言語がない、

class Rect:
   p1, p2: point

長方形を2つのx値と次のような2つのy値として定義する方が理にかなっています。

class Rect
   xleft, xright: int
   ytop, ybottom: int

2つのポイントで、ソースコードのある場所で上部のy値を使用する場合は、rect.p1.y(うーん、停止して、p1またはp2)と言う必要がありますが、 4つの値がプレーンデータメンバーとして、明確で直接的です。Rect.ytop(考えは不要です!)2つのポイントを使用すると、垂直を扱う際に水平にもつれを巻きつける必要があります。独立した要素の間には無関係な関係があります。

この2点のアイデアはどのようにして生まれましたか、そしてなぜそれが続くのですか?ベアXおよびY座標よりも利点がありますか?

追加メモ:この質問は、WindowsマネージャーやGUIツールキットなど、XYアラインドされた長方形のコンテキストで、描画およびペイントアプリの任意の形状のコンテキストではありません。

役に立ちましたか?

解決

エラーが発生しやすいと考えましたか?

(Point1、Point2)を使用する場合、 とても あなたが指定しているものをクリアします。 2ポイントを提供する場合、唯一の可能なエラーは、ポイントの順序が重要ではないため、ポイントを構築するときにユーザーがxとyを混同したことです。

4つの整数を供給すると、誰かが注意を払っていない場合、(x1、y1、x2、y2)、またはその逆の場合に(x1、x2、y1、y2)供給(x1、x2、y1、y2)を供給できます。また、WCFなどの一部のAPI rect 構造は、長方形を(x、y、幅、高さ)として定義します。これは、(1、2、3、4)の意味をめぐる混乱を引き起こす可能性があります。それは(x、y、w、h)または(x1、y1、x2、y2)または(x1、x2、y1、y2)ですか?

全体として、(Point1、Point2)は私には少し安全に思えます。

他のヒント

私はいつも長方形をポイント +幅と高さとして定義するのが好きでした。ポイントは長方形の左上隅です。

class Rect {
  float x, y;
  float width, height;
}

次に、他のメトリックを取得するために必要な方法を追加します。以下のような ジャワ バージョン

実際、長方形は2ポイントで定義されていません。長方形は、軸に平行な場合にのみ2つの点で定義できます。

軸に平行な長方形を表す方法はいくつかあります。

  1. 斜めに反対の2つの点
  2. 1つのコーナーポイント、高さ、幅
  3. センターポイント、半分の高さと幅(まれですが、時には便利です)。
  4. 2つのX座標と2つのY座標として

(1)の場合、多くのライブラリが慣習を使用して、どの2つのポイントが使用されているかを決定します。たとえば、左上と底部。

表現の選択は、長方形の定義の本来の目的によって推進される可能性がありますが、私はそれを想像してください 多くの場合、arbitrary意的です. 。表現は、それらが携帯する情報に同等です。しかし、それらは、長方形のプロパティを計算できる容易さと、操作を再angleで実行できる利便性が異なります。

定義の利点(1)他のものに対するものは次のとおりです。

  • 他のポリゴン、ラインなどとのAPIの一貫性
  • 最上部、底部はポイントを受け入れる任意の方法に渡すことができます
  • ポイントクラスの方法は、Topleft、BottomRightで呼び出すことができます
  • ほとんどのプロパティは、例えば簡単に導出できます。左右、上部、幅、高さ、中央、対角線の長さなど。

良い p1: Pointp2: Point それぞれが持っています 2 int 座標 とにかく彼らの中で、あなたのクラスは同じことになりませんか?

そして、これらの2つのポイントをファーストクラスとして保存する場合 Point オブジェクト、あなたはそれらからもう少し有用性を得ませんか?私が知っているほとんどのグラフィカル座標系では、ポイントはこの方法でサブクラス化され、オブジェクトの階層を作成します。 point -> circle -> ellipse 等々。

したがって、使用しないオブジェクトを作成した場合 Point クラスでは、そのオブジェクトをクラスの残りの階層から離婚させました。

これが私がデルファイが好きな理由です TRect. 。これは、現時点でより便利な方が、最上部、または左、左、右下、右整数のいずれかとして解釈できるバリアントレコード(C-Speakのユニオン構造)として定義されています。

確かに、長方形を次のように定義する場合:

class Rect
{
    Point bottomLeft;
    Point topRight;
}

次に、どのポイントがどのポイントであるかをすぐに知っています。

さらに良いことに、アプリケーションに必要な方法で長方形を操作できる追加のプロパティを追加することです。これらは、基礎となるデータ構造を単純に更新します。

形状に変換を追加することで、どんな方法でも長方形を向けることができます。迅速な受け入れ/拒否チェックのために、軸アラインされた境界ボックスが必要です:)

ただし、モデルが変換を適用せずに任意の方向で長方形を許可する場合、「左下」と「右上」には意味がなく、「P1」と「P2」(または同等のもの)に戻ります。

長方形がxとyの範囲とポイントで表されることはより理にかなっていると思います。場所を長方形の中心にすることもできます。そうすれば、回転とは無関係になります

しかし、おそらく2つのポイントとしてコーディングするのが最も簡単でした!

私たちは潜在的な程度の自由を投げ出したので、私はそれが好きではありません。一般的な2D長方形には5つの未知(自由度)があります。それらをポイントの座標、この点で頂点を形成する両側の長さ、および最初の線の水平からの角度(もう1つは角度が90度大きいと想定)として指定できます。他の無限の可能性も使用できますが、指定する必要がある5つの独立した量があります。いくつかの選択は、それらで行われていることに応じて、他の代数よりも簡単な代数につながります。

2ポイントとまったく同じことではありませんか?これはどのように厄介ですか...ほとんどの描画ルーチンには、個別のX/Yコンポーネントではなく、ポイントが必要です。

長方形をポイントペアとして定義すると、ポイントを別の形状の頂点として再利用できます。ちょっとした考え...

主に、すべての形状のプリミティブ間で均一性を確立することだと思います。

確かに長方形をさまざまな方法で定義できますが、同様のデータ構造を使用できる方法で三角形、星、または円をどのように定義しますか?

すべてのポリゴンは、ポイントをどうするかを決定するための短いロジックで、ポイントによって定義できます。

グラフィックライブラリは、主に頂点とエッジの観点からこれらのポリゴンで動作するため、それらの間のポイントとラインは、これら2つの機能とファセットで機能しますが、それ自体は単なるエッジの関数です。

2つの寸法では、長方形を2つのポイントとして保存することは、特定のコーナーと幅と高さを定義するよりも明確です - 負の幅または高さ、または各オプションを他のオプションから決定するのに必要な計算を考慮します。

ポイントで定義された長方形で回転を実行することは、ポイントと幅と高さで定義されたものよりもはるかに簡単です。

カプセル化がクラスのユーザーとしてこの差別化を重要ではないと予想しています。

長方形は、3つの次元で明確に定義される3つのポイントとして定義する必要があります。長方形を4つ以上の次元で定義する要件が完全にはわかりません。

それは完全にarbitrary意的です。長方形を描くには、4つの情報が必要です。ライブラリデザイナーは、2つのポイント(それぞれがXY座標付き)で表現することを決定しましたが、X/Y/w/hまたは上/下/左/右で簡単に実行できた可能性があります。

OPの本当の質問は次のとおりです。 どうして この特定の選択はなされましたか?

パラメーターの選択は、低レベルの設計者 /コーダーにとってのみ重要です。

高レベルのユーザーは、次のことを考える必要があります。

  • ispointInRect
  • 領域
  • 交差点(またはクリッピング)
  • hasoverlap(retersection.area> 0と同じ)
  • ユニオン(長方形のリストになる)
  • 減算(長方形aであるが長方形bではないのと同じポイントセットを表す長方形のリスト)
  • 変身
    • xとyのシフト
    • 回転(0、90、180、270)
    • xとyのスケーリング (ノートを参照してください)
  • プロパティXMIN、XMAX、YMIN、YMAX、幅、高さの単純な構文により、ユーザーがパラメーターの正確な選択を知る必要がないようにします。

注:スケーリング変換中の精度の損失を最小限に抑えるために、浮動小数点座標を使用する2番目の長方クラスを実装することが適切な場合があります。そのため、中間結果は変換のシーケンスに正確に保存し、最後のステップ。

@Stevenが言うように、私はそれが1つの(x、y)ポイントとa(w、h)サイズのベクトルの観点からあるべきだと思います。それは曖昧さに陥るのが簡単だからです。ポイント(0,0)から始まる次の充填された長方形があるとします。

  012
0 XXX
1 XXX
2 XXX

明らかにそれは幅です、高さは(3,3)ですが、2番目のポイントは何ですか?それは(2,2)または(3,3)ですか?

このあいまいさは、あらゆる種類の問題を引き起こす可能性があります。

私は何年も前にグラフィック座標を線と考える方が良いことを学びました の間に ピクセルのように、ピクセルのようにピクセル の上。そうすれば、あいまいさはありません。

Pa(x,y)*-----------------------------------*Pb(x,y)
       |                                   |
       |                                   |
       |                                   |
       |                                   |
       |                                   |
       |                                   |
Pc(x,y)*-----------------------------------*Pd(x,y)

したがって、PBとPCの両方を定義できます。

PB(PD(X)、PA(Y))

PC(PA(X)、PD(Y))

したがって、対称性のために4つのポイントすべてを定義する必要はありません

ライセンス: CC-BY-SA帰属
所属していません softwareengineering.stackexchange
scroll top