質問

このインターネットなどの見完璧なアルゴリズムのためにこの特定の問題:

お客様のセットポイントと重量のデータを各点にしていることにより示すことができるこのイメージ:

重点http://chakrit.net/files/stackoverflow/so_heightmap_points.png

るまでのGISプログラムが発生する可能性がある"heightmap"は一種の地形データからこれらのポイントとその重量値を、私たちが目の当たりにした近くには数千点のデータおよびこれらの変更、時間という独自のツールを自動生成されheightmaps.

これまでたっては計算のため重量の各ピクセルからの距離も近いデータポイント Sqrt((x1 - x2) ^ 2 + (y1 - y2) ^ 2) 適用の重量との距離係数のデータポイントの色を変勾配色には、その特定のピクセル:

heightmap結果http://chakrit.net/files/stackoverflow/so_heightmap_result.png

ですがまだまだ問題がある設定のデータポイントのアルゴリズムの時には多角形の画像がある場合多くのデータポイント。理想の結果は同省略以下のような多角形を作成します。

ここでは一例イメージに関するwikipedia記事の勾配を登るとの認識にたい:

山々http://chakrit.net/files/stackoverflow/so_gradient_descent.png

の勾配を登頂のアルゴリズムがないのに関心を持ちました。やっぱりそれは、興味あ;のアルゴリズムの計算の機能を画像にし、データポイントのウエイトである。

んでおりませんのクラスのトポロジカルの悩んでいくつかの計算.と思うとうがっていくで失ったときどのようなタイプがGoogle検索ボックス。

きのポインタ.

よろしく!

役に立ちましたか?

解決

あなたが探していることは曲面補間されます。

一部の製品は、これを実行するために存在する(ここでは 1 のです)

得られた機能/スプライン/他の数学的構築物は、次いで、高さマップを供給するために必要な分解能で調べることができる。

あなたの補間関数

Sqrt((x1 - x2) ^ 2 + (y1 - y2) ^ 2) 

は、あなた以外逆距離加重の方法に類似です任意のフィルタを適用し、他のデータ点の多くを廃棄している。

これらの技術のほとんどは、サンプルや価値観を支える「地形様」行動の合理的な数に依存しています。

Iは高試料として重量を使用し、補間点での全体的な高さの値にサンプル点の寄与の比率を取ることによって(で開始する任意の画素をフィルタリングしていない)第2のリンクに簡単シェパードのメソッドをしようと示唆していますあなたもポイントを着色するそれらの比でサンプルの色をブレンドすることができます。高さを表示したり、例えば画像のように黒で輪郭線を追加する(概ね単純なRGB空間の階調を話す)の強度を使用しています。

他のヒント

この問題は、それが表面に見た目ほど簡単ではありません。あなたの問題は、二つの領域の境界線の両側が言っているのと同じ高さを、持っている必要があり、所定のピクセルの高さはちょうど1最近傍以上によって決定されることです。

私はそれを正しく理解していれば、

は、少なくとも2つのアルゴリズム(と専門用語の3枚目)が必要です。

これを正しく行うには、ボロノイテッセレーションするに平面を分割する必要があります。

あなたはおそらくあなたを助けるために KD-ツリーを使用したいしようとしています最近傍を見つけます。代わりに、Oを(N ^ 2)服用の、これはO(n)は、n個(ログ)(追加の利点は、あなたのボロノイ領域生成相は、高さ算出相上で動作するように開発に十分な速度になるということです)にそれをダウンさせるでしょう。

今、あなたはその最も近い隣人私に各点のインデックスを作成する2-Dマップを持っていることを、あなたは、すべてのXを歩いて渡るマップ上のyのポイントとその高さを計算する必要があります。

最初のiをその最近傍を取得し、リストにそれを貼り付け、その後、ボロノイ図のすべての連続領域を収集し、任意の点のx、yのためにそれを行います。簡単な方法は、周りを見、その後、地域内のすべてのポイントを見つけるために、塗りつぶしを使用することです国境や他のアイデンティティを収集します。

すべての最近傍のこのリストを使用して、あなたは正しく補間でショットを持っています! (補間スキームの他の回答を参照してください)。

また情報アルゴリズムの2次補間の不定期データは、非常に複雑です。まいまいArcGIS、 暗号通信の使用を推奨 また補間 自動的に にArcGIS使用されること、そして 特徴 自動算出します。いらっしゃることと思います ることで 上書き独自の補間アルゴリズムです。もちろん、一部自動化のArcGISので、比較的簡単です。

う場合の書き独自の補間コード-アドバイスをしていないためにも、適切なものを選ぶアルゴリズムが複数あることによりそれぞれサンノゼのホテルを表示およびロテインを開発した理由です。こちらではのアドバイスcribbedらの結果、優秀と認められる補間のツール サーファー (ちなみも可能で自動化することでかなりやすい)。あのアルゴリズムは、これらかになった.

  • クリギング は、より柔軟な方法がありgriddingほとんどのタイプのデータセットです。ほとんどのデータアーカイブデータセットをクリギングのデフォルトのリニアvariogramは非常に効果的です。一般的に、我々もよくお勧めします。クリギングがデフォルトのgridding方法で生成することができ良き地図のほとんどのデータをセット。大きなデータアーカイブデータセットをクリギング"という。クリギングできるグリッドの外挿値を超えてお客様のデータのZです。
  • 逆距離加重 でもこの傾向を"牛の眼"パターンを同心円状の輪郭のデータポイント。逆距離になる前に外挿Z値の範囲を超えます。簡易逆距離加重のアルゴリズムが簡単に実装できまslowish.
  • 三角線形補間 が速い。ご利用の際は小さなデータアーカイブデータセットを三角線形補間を異なる三角形面との間のデータポイント。三角線形補間しない外挿Z値の範囲を超えます。
  • Shephardの方法 類似逆距離電力を行いませんが生成"ブルの目の"パターンの場合は特に、平滑化係数を使用します。 ェパの方法 で外挿値を超えてお客様のデータのZです。

を実施するアルゴリズムまGooglingのリンクのすべてのプロバイダのための答えなのです。がオープンソースのGISパッケージなどの補間、もしかしたら内容を抽出することも可能でアルゴリズムからだpotholingをC++.または この書籍 David Watsonあるクラシックですがトリッキーを読み、実際のサンプルコードはこちらでスパゲッティ基本!!でも、だからこそ聞朝食も普通に美味しいです。可能です。れば誰でも他のスタックオーバーフローを知っていてください正しいと思います。

クリギングに特にGISのフィールド内で、これを行うためのヘビー級のいずれかの方法であります。これは、いくつかの素敵な数学的な性質を持っている - の欠点は、それはあなたのバリオグラムのに応じて、遅くなることができるということです。

あなたはシンプルな何かをしたい場合は、非常によくこれを扱う多くの補間ルーチンがあります。あなたは数値レシピののコピーのネタを得ることができる場合は、第3章は、説明に専用されています多くの補間のための変異体、およびコード例およびそれらの機能的特性の記述を含む。

のアルゴリズムを計算 独自の機能と 最初の場所は、データポイント と揃っています。

可能です。場合はシングルポイントまで終わ界は、そのままにdatapointsいを考慮できるスキッシュのサークルに入り画像の画像の..

その理由だとしてポリゴンとしましょう離散機能計算の初のス、観光に幅広くご利用いただけ近い色、その後を決定するようになる。

するようにしましょうみ勾配のアルゴリズムのランク付け色点からの距離と体重からのdatapointsを同封してこの点に三角形です。

勾配のアルゴリズム

で何をしようとしている表示になります。単純なアルゴリズムにすることはできない。

各ピクセル:

  • の三つのポイントとなる最小の三角形を取り囲むこのピクセル
  • この点の色(HSVカラーシステム)の影響の両方の重量との距離れdatapoint:

    pixel.color = datapoint[1].weight * distance(pixel, datapoint[1]) * datapoint[1].color + datapoint[2].weight * distance(pixel, datapoint[2]) * datapoint[2].color + datapoint[3].weight * distance(pixel, datapoint[3]) * datapoint[3].color

を使用してい+ここでも必要な決断を平均化アルゴリズムアプリケーションに適してい

-アダム

表面補間は、ハードと数学の問題のようです。 それを行うには別の、安価な方法があります:

For each pixel:
For each point:
pixel.addWeight(weight(point, pixel))

def addWeight(w):
totalweight += w
numberofweights += 1
weight = totalweight / numberofweights

例重み関数

def weight(point, pixel):
return point.weight * 1/(1 + sqrt((point.x - pixel.x)^2 + (point.y - pixel.y)^2))

これをかなり強引なアプローチが、それは簡単です。

私はしばらく前にWinampのAVSでこのような何かを実装しました。これは、(例えば1.0)をキャッピングし、2次元格子上の各点について、それらの距離の和を取って、各データポイントから(速度のためSQRTを避けるために)距離を二乗逆数を計算する「メタボール」型のアプローチを使用します。これは、滑らかに変化する色/高さマップを与えるであろう。

あなたはコードを見たい場合は、その私の J10 AVSパックするから「明るい画像に」プリセットでます。

編集:ちょうど私がそれをきれいに見えるようにいくつかの他のジャズを追加し、それを見て、最も重要な部分はあります:

d1=s/(sqr(px1-rx)+sqr(py1-ry));
d2=s/(sqr(px2-rx)+sqr(py2-ry));
d3=s/(sqr(px3-rx)+sqr(py3-ry));
d4=s/(sqr(px4-rx)+sqr(py4-ry));
d5=s/(sqr(px5-rx)+sqr(py5-ry));
d6=s/(sqr(px6-rx)+sqr(py6-ry));
d=d1+d2+d3+d4+d5+d6;

6ポイントの合計値をとります。赤、緑、青の出力値に行われる他のすべては、それがきれいに見えるようにすることです。 6点くらいが、私はそれが新しかったとき(それは〜20FPSでいた)400MHzのマシン上の320x200のグリッド上でリアルタイムにこの実行をしようとした心に留めていません。 :)

緑、赤=を交換=と赤= D青= ...ライン、等...私が何を意味するかを確認します。すべてのかわいらしさは消え、あなたは、データポイントの周りに滑らかに変化するブロブのグレースケール画像が残されています。

別の編集:私はそれぞれのためにそれを変更すると、例えば、各点に重みを個々を与え、「s」は点の全ての共有重みであると言うことを忘れD1 = 2 /(...)とd2 = 1 /(...)D2としてその中心にD1二倍の高さを与えるだろう。あなたはまた、彼らは途中で無限遠にピークしないようにポイントのトップをオフに滑らかにするために、D1 = 2 /最大(...、1.0)のようなもので下部にある表現をキャップすることがあります。 :)

答えを乱雑申し訳ありません...私は、コード例を掲載することは十分だろうと思ったが、検査に私のコードは読み混乱と困難です。 :(

同様の問題を解決しようとしているときに

私は、これはかなり古い質問ですけど、私はそれに出くわします。

機能のまさにこのタイプを実装 Surfitすると呼ばれるオープンソースプロジェクトがあります。

あなたが何かを探しているというブレンダーの呼び出し "<のhref =" のhttp:// EN .wikipedia.org /ウィキ/メタボール "のrel = "nofollowをnoreferrer">メタボールを"(ウィキペディアに、の)リンクを含む記事。それをこのように考えてみます:

あなたのオブジェクトが地面から突き出コーンです。彼らはすべての放物線であり、重量は、彼らが地面から突き出どれだけ伝えます。また、全て同じ高さにそれらを作成し、それに応じて放物線の「平坦」を調整するので、低重量はそれがシャープになりながら、大きな重量が非常に広い円錐になります。多分両方ある程度ます。

私はあなたがこれを実装し、それがどのように見えるかを確認することをお勧めします。

次に、あなたは結果の上に布やゴムシートをハングアップする必要があります。布は、一定量だけ伸張し、それは一般的に重力によって垂れ下がるであろう。コーンはそれを維持ます。

限り、あなたは、円錐の中心に近接しているように、Z座標円錐の表面上にだけ位置です。あなたはコーンセンターを残しとして、重力がプルダウンを開始し、他のコーンの影響が大きくなります。

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