2012-01-27 27 views
8

マップ上のポイントのクラスタを表すために空間データを使用するソリューションがあります。私は、クラスタのエクステントを表す座標を使用して、前記のクラスタの集合を含むことができる最小境界矩形を見つける必要があります。座標による2次元形状の最小境界矩形の計算

これを計算するための簡単なアルゴリズムはありますか、これを実現するためにC#に組み込まれている機能はありますか?私はNetTopologySuiteを認識していますが、同じ目標を達成するためにこれを使用できるかどうかはわかりません。私は座標リストを持っていますので、この文字列リストを渡してMBRを取得する必要があります。

+0

残念ながら、私はこの問題でどこから始めるべきか分かりません。私はタイプ文字列のリストに座標を持ち、ここから移動する方法はわかりません。 – CSharpened

+1

@Wellには2つのタイプがあります:軸に合わせたバウンディングボックス。 min x/yとmax x/yを見つけることによって簡単に見つけられます。または、あなたはより複雑な任意の向きのバウンディングボックスを持っています(http://en.wikipedia.org/wiki/Minimum_bounding_box_algorithms)。技術的にはまだボックスを描いていますが、地球の曲率を考慮する必要がある場合は、これはもっと複雑になりますが(実際には球の表面の一部ですおそらくあなたが必要とするもののためにあまりにも多く) –

+0

私は参照してください。私はボックスの4座標を供給する関数が必要です。したがって、2つのX値と2つのY値。座標を分割してそれらをすべて比較して、最小のX値と最小のY値を見つけることが最良の方法だとお考えですか?私がそれをしなければならない場合、私はminXの値とmaxYの値しか得られないと仮定します。これら2つの図から、他のXとYの値を計算することは可能ですか?申し訳ありませんが、私は少し失われたようです。 Spatialは私のエリアではありません。 – CSharpened

答えて

10

最も簡単な解決策は、あなたが探している可能性が最も高いと仮定して、軸の揃えられた境界ボックスを計算することです。これは、単純に最小値/最大値xの値を見つけた場合です。&それらからボックスを構築する。

point[] points = [[x = -2, y = 0], [x = 1, y = 2], [x = 1, y = 1], [x = -1, y = -2]]; 
box bounds = bounding_box(points); 

私はあなたがそうこれらの与えられたジオメトリがで...

type point { float x; float y; } 
type box { point topleft; point topright; point bottomleft; point 

function bounding_box(points) 
{ 
    xmin = min(points.x) 
    xmax = max(points.x) 
    ymin = min(points.y) 
    ymax = max(points.y) 

    return new box{ 
    topleft = { x = xmin, y = ymax }, 
    topright = { x = xmax, y = ymax }, 
    bottomleft = { x = xmin, y = ymin }, 
    bottomright = { x = xmax, y = ymin } 
    }; 
} 

表現されるタイプを投稿していないことを考えると、あなたはそのための擬似コードをあげます

以下のすべてが真であろう。もちろん

bounds.topleft == [x = -2, y = 2]; 
bounds.topright == [x = 1, y = 2]; 
bounds.bottomleft == [x = -2, y = -2]; 
bounds.bottomright == [x = -1, y = -2]; 

、座標系は、T最低座標を有する場合オペアンプ(例えば、典型的なディスプレイのように) - 計算を逆転させる必要があります。最初にオブジェクト空間で結果を計算し、その後に論理空間に変換することができます。

注意将来的に任意の位置にあるボックスに更新することを決定した場合、4つのコーナーをすべて表すボックスのタイプになりました(ただし、同じトークンでポイント+ 2ベクトル)。

+0

それは私が何をしているかを正確に見ています。ありがとう。 – CSharpened

6

、それはこのようなことができ行うための一つの可能​​性のある、シンプルなしかし、方法は:

public Rectangle Test(List<Point> points) 
{ 
    // Add checks here, if necessary, to make sure that points is not null, 
    // and that it contains at least one (or perhaps two?) elements 

    var minX = points.Min(p => p.X); 
    var minY = points.Min(p => p.Y); 
    var maxX = points.Max(p => p.X); 
    var maxY = points.Max(p => p.Y); 

    return new Rectangle(new Point(minX, minY), new Size(maxX-minX, maxY-minY)); 
} 

これはもちろんありませんが、あなたが垂直および水平に整列された矩形を探していることを前提としています。したがって、どのように回転されていても最小の四角形を探しているなら、これはあなたのためではありません。

関連する問題