2

どの空間検索アルゴリズム..特定の四角形の ..4 つの方向すべて (つまり、上、左、下、右) で最も近い隣接する四角形を照会するのに役立ちますか。

1: 距離は、長方形の一方の辺からもう一方の長方形の反対側まで直交しています。

2: 長方形は、実際にはフォーム上の GUI コンポーネントを表します。

4

1 に答える 1

0

左下隅から開始して増加する軸を想定して、JavaでOOPスタイルを実行します。

class Displacement
{
  float top, bottom, left, right;
  Rectangle r;

  Displacement(Rectangle r)
  {
    this.r = r;

    top = Math.max(r.y1, r.y2);
    bottom = Math.min(r.y1, r.y2);
    left = Math.min(r.x1, r.x2);
    right = Math.max(r.x1, r.x2);
  }

  float minDistance(Displacement d)
  {
    float min = 10000.0f;

    if (Math.abs(top - d.bottom) < min)
      min = Math.abs(top - d.bottom);
    if (Math.abs(bottom - d.top) < min)
      min = Math.abs(bottom - d.top;
    if (Math.abs(left - d.right) < min)
      min = Math.abs(left - d.right);
    if (Math.abs(right - d.left) < min)
      min = Math.abs(right - d.left);

    return min;
  }
}

これで、長方形でインスタンス化されたオブジェクトが長方形の最小スパンと最大スパンを計算するようになりました。このオブジェクトは、次のおかげDisplacementで別のオブジェクトとの最小距離を見つけることができます。DisplacementminDistance(...)

今、あなたはそのようなことを簡単に行うことができます:

class DistanceFinder
{
  ArrayList<Displacement> displs = new ArrayList<Displacement>();

  void addRect(Rectangle r)
  {
    displs.add(new Displacement(r));
  }

  Rectangle findNearest(Rectangle r)
  {
     Displacement current = new Displacement(r);
     Displacement nearest = null;
     float min = 10000.0f

     for (Displacement d : displs)
     {
       float curDist = current.minDistance(d);

       if (curDist < min)
       {
         nearest = d;
         min = curDist;
       }
     }
     return current;
  }
}

簡単な例を示すためにJavaで作成しましたが、アプローチはすべての言語で同じです。

距離を計算する方法をさまざまなカーティナル方向に分割することで、すべての方向をさまざまな方法で簡単に処理できるため、前のスニペットで行ったのと同じ作業を実行できますが、軸ごとに分割されます。

于 2010-03-09T16:58:11.063 に答える