16

2Dポイントのリストを重みで補間して、レベルカーブで補間を生成する方法を理解するのに役立つ、Javaライブラリのコード例(または開始点)を見つけようとしています。

グーグルこれを行うために利用できるアルゴリズムがいくつかあることがわかり、興味深い内容の説明がいくつか見つかりました。私が試したい最初のアルゴリズムは、逆距離加重補間です。

しかし、このすべての情報で、私はいくつかの基本的な疑問を持っています:

  • 下の画像のような1つの画像を生成するには、ピクセルマトリックス(重み付き)を実行し、データを補間し、ピクセルを(色の範囲で)グループ化してから、ポイントを結合して曲線を描画し、このような参照テキスト値を配置する必要があります?

  • このピクセルマトリックスを実行する必要がある場合、巨大な補間には非常にコストがかかるため、より少ないポイントを実行し、スプラインを使用して結合してからカラーレベルを作成できますか?

データ例:

+-------------------+
|  X  |  Y  | WEIGHT|
+-------------------+
|  2  |  5  |   30  |
|  7  |  3  |   25  |
|  1  |  1  |   10  |
|  5  |  6  |   45  |
|  7  |  9  |   15  |
+-------------------+

ルールの例:

  • 00〜10の値:
  • 10〜20の値:
  • 20〜30の値:黄色
  • 30〜40の値:

結果の例:

シェパード補間の例

サンプルデータ、ルール、および結果には互換性がなく、私の問題を説明するための単なるランダムな例です。


これが私の最後のテストクラスです:http://pastebin.com/nD6MT8eS

4

3 に答える 3

5

使用できるPointクラス(java.awt.Pointなど)があると仮定すると、重みをマップに入れることができます。

Map<Point,Double> points = new HashMap<Point,Double>();
points.put( new Point(2,5), 30 )
...

次に、画像を作成し、x、y座標ごとに、最高のスコアを見つけます。スコアは、逆距離にテーブル内のポイントの重みを掛けたものであると想定しています。もしそうなら、それはこのようです:

image = createBitmap( width, height )
for( int x = 0; x < width; x++ )
    for( int y = 0; y < height; y++ )
    {
         double maxScore = -Double.MAX_VALUE
         for( Point p : points.keySet() ) 
         {
             double score = points.get(p)/p.distance( x, y ) //Inverse distance times point weight
             minDist = Math.max( maxScore, score )
         }
         image.setPixelColour( x, y, getColorForDistance( 1/minDist * points.get(p) )
    }

getColourForDistance(double dist)は明らかですが、レベルを正しく設定する必要があります。createBitmap(width、height)が画像を作成すると仮定しています。作成する画像の種類は、setPixelColourメソッドなどがあるかどうかと同様に、アプリケーションによって異なります。ポイントクラスの選択は、アプリケーションによっても異なります。

これは最適化されていません。少なくともO(x * y * p)です。ここで、pはポイントの数です。pが大きくなる場合は、ポイントを格納するためのより適切なデータ構造を調べることをお勧めします。

于 2013-02-04T23:16:44.250 に答える
2

@mo-sephと@Xipan-Xiaoの回答を補完するために、逆距離から電力へのアルゴリズムを実装するjFreeChartプロジェクトのNonGridContourDatasetクラスを確認できます。

于 2013-02-05T15:49:09.427 に答える
1

コメントを追加する方法がわからないので、この回答領域に自分の考えを追加しています。

少なくとも、「ピクセルを(色の範囲で)グループ化してから、ポイントを結合して曲線を描く」必要はありません。必要な画像を生成するには、次のようにします。

picture = createBitmap( width, height );
for( int x = 0; x < width; ++ x ){
    for( int y = 0;y < height; ++ y ){
        double value = interpolate( x, y, inputs );
        Color color = colorRangeOf( value );
        picture.setPixel( x, y, color );
    }
}

したがって、画像は、色をグループ化してピクセルマトリックスを作成せずに作成されます。画像の各ピクセル値が指定されると、境界の「曲線」が自動的に存在します。

于 2013-01-15T18:10:26.787 に答える