8

これは、私のキャリアの中で何度か出てきた質問であり、私と同僚を 2 つのグループに分けます。私はそれがこのサイトで最もよく答えられるかもしれないと思った.

ほとんどすべてのグラフィックス UI ライブラリは Rectangle 構造を実装していますが、その方法は通常、次の 2 つのオプションに分かれています。

  1. 長方形は、同じ座標系内の 2 つの 2D 点として定義され、通常は p0 と p1 という名前が付けられるか、x0、y0、x1、y1 などの個々のコンポーネントが付けられます。
  2. 四角形は 2D の原点とサイズのベクトルとして定義され、通常は位置とサイズ、または個別に x、y、幅、高さの名前が付けられます。

さて、UI ライブラリを作成するとしたら、2 つの選択肢のうちどちらを選択すればよいでしょうか?

更新:質問は、インターフェースではなく、実装に関するものです。もちろん、四角形のインターフェイスは両方のアプローチを十分にサポートできますが、四角形内にデータをどのように格納しますか?

4

2 に答える 2

8

両方を選んでみませんか?

実際、重要なのはライブラリとその内部の間のインターフェースだけです。または、ユーザーがライブラリをどのように使用するか。長方形の情報は好きなように保存できますが、ユーザーが長方形の保存方法を気にする必要がなく、実際には長方形であるというだけで、ユーザーから遠く離れた場所にカプセル化する必要があります。

つまり、両方を選択すると、オブジェクト指向コードを記述している場合は、長方形を好きなように保存してから、ユーザーがどちらかの方法を使用して長方形を作成できるようにすることができます。

たとえば、宣言は次のようになります。

class Rectangle
{
public:
    Rectangle(Point p1, Point p2);
    Rectangle(Point origin, int width, int height);
    ...
};

(C ++、タグ付けしたので)

ポイントはいくつかのクラスです:

class Point
{
public:
    Point(int x, int y) : mX(x), mY(y) {}
private:
    int mX;
    int mY;
};

このように、ライブラリは、長方形を作成するための1つのタイプの仕様のみをサポートするように制限されていません。

特に実装に関しては、それは本当に重要ではありません。これらは両方とも機能し、相互に簡単に変換でき、同じ量のメモリを使用するため、一方を他方に使用してもパフォーマンスに大きな影響はありません。

開発を簡単にするために、長方形のユースケースを検討してください。そのクラス用に作成する必要のある各メンバー関数を見て、それらの関数の作成を容易にする形式を検討してください。

もし私だったら、おそらく2つのポイントで実装するでしょう。

編集:どちらの方法でも実装しても、ほとんどの場合、まったく違いがないと思う理由に対する学術的なアプローチ。

長方形で機能するか、計算を行うRectangleクラスのメンバー関数または操作があるとします。1つの実装方法(幅/高さ/原点または2つのポイント)が他の実装よりも大幅に高速にこの操作を実行すると仮定します。

次のようにして、実装の幅/高さ/原点から変換できます。

// assuming x0,y0 is top left and x1,y1 is bottom right
x0 = originX;
y0 = originY;
x1 = originX + width;
y1 = originY + height;

そして、次のように実装から2つのポイントに変換できます。

// assuming x0,y0 is top left and x1,y1 is bottom right
originX = x0;
originY = y0;
width = x1 - x0;
height = y1 - y0;

したがって、他の実装よりもはるかに遅い/悪いこの操作を実行する実装は、O(1)の実行時間で他の実装に変換できるため、他の実装は最初の実装よりもはるかに優れていることはありません。

この操作を1秒間に数千回実行するか、パフォーマンスが非常に制限されているデバイスで実行しない限り、パフォーマンスに違いはないと確信しています。どちらの実装も4つのfloat/intを格納するだけなので、メモリの違いはすでにありません。

これにより、コーディングの利便性が大幅に向上します。上記の元の投稿で述べたように、「長方形のユースケースを検討してください。そのクラス用に作成する必要のある各メンバー関数を見て、考えてみてください。どのフォーマットがそれらの関数を書きやすくするかについて。」

于 2012-04-05T10:14:04.750 に答える
2

もちろん、これはあなたが直面している問題にのみ依存します。

グラフィック描画アルゴリズムの場合、2番目のオプションには非常に小さな利点があるようです。一方、ユークリッド平面で定義された一般的な「幾何学的」アルゴリズムの場合、最初のオプションはやや便利です。

また、かつて地球表面で定義されたアルゴリズムに取り組んでいました。つまり、x、y 座標はそれぞれ経度/緯度を表します。x 座標は明らかに周期的です。この特定のケースでは、(一種の) rect を定義するために - 角だけを定義するだけでは不十分で、方向も必要です。これは、1 番目のポイント (p0) が最も左のポイントであるのに対し、2 番目のポイント (p1) が最も右のポイントであるという規則によって処理される場合があります。しかし、私は代わりに、コーナーとオフセット ベクトルが自然にある 2 番目の規則に切り替えることを好みました。

于 2012-04-05T10:21:01.140 に答える