36

私は、2 次元の連続データの視覚化プロジェクトに取り組んでいます。これは、2D マップで標高データや温度パターンを調べるために使用できるようなものです。本質的には、3 次元を 2 次元と色にフラット化する方法です。私の特定の研究分野では、実際に地理的な標高データを扱っているわけではありませんが、これは良い比喩であるため、この投稿全体を通してこれを使用します。

とにかく、この時点で、私は非常に満足している「連続カラー」レンダラーを持っています。

連続カラー レンダラー

グラデーションは標準のカラー ホイールであり、赤いピクセルは高い値を持つ座標を示し、紫色のピクセルは低い値を示します。

基礎となるデータ構造は、いくつかの非常に巧妙な (私がそう言うなら) 補間アルゴリズムを使用して、マップの詳細への任意の深いズームを可能にします。

この時点で、(二次ベジエ曲線を使用して) いくつかの地形等高線を描画したいと考えていますが、これらの曲線を見つけるための効率的なアルゴリズムを説明している適切な文献を見つけることができませんでした。

私が考えていることのアイデアを提供するために、これは貧しい人の実装です (レンダラーは、輪郭線と交差するピクセルに遭遇するたびに黒の RGB 値を使用するだけです):

ゲットー トポ ラインによる連続カラー

ただし、このアプローチにはいくつかの問題があります。

  • 勾配が急なグラフの領域では、トポ ラインが細くなります (しばしば壊れます)。理想的には、すべてのトポ ラインが連続している必要があります。

  • 勾配がより平坦なグラフの領域では、トポ ラインが広くなります (特にレンダリング領域の外周では、領域全体が黒くなることがよくあります)。

だから私は、それらの素晴らしい、完璧な 1 ピクセルの太さの曲線を得るためのベクトル描画アプローチを検討しています。アルゴリズムの基本構造には、次の手順を含める必要があります。

  1. トポ ラインを描画する個別の標高ごとに、その座標の標高が目的の標高に非常に近い (任意のイプシロン値を指定) 座標のセットを見つけます。

  2. 余分なポイントを削除します。たとえば、3 つの点が完全に直線上にある場合、曲線の形状を変更せずに中心点を削除できるため、中心点は冗長です。同様に、ベジェ曲線では、隣接するコントロール ポイントの位置を調整することで、特定のアンカー ポイントを削除できることがよくあります。

  3. 2 つのポイント間の各セグメントが高度に中立な軌道に近似し、2 つのライン セグメントがパスを交差しないように、残りのポイントをシーケンスに組み立てます。各ポイント シーケンスは、閉じた多角形を作成するか、レンダリング領域の境界ボックスと交差する必要があります。

  4. 各頂点について、ステップ 2 で削除された冗長点に関して、結果の曲線が最小の誤差を示すような制御点のペアを見つけます。

  5. 現在のレンダリング スケールで表示される地形のすべてのフィーチャが適切な地形線で表されていることを確認します。たとえば、データに標高の高いスパイクが含まれているが、直径が非常に小さい場合でも、トポ ラインを描画する必要があります。垂直方向の特徴は、それらの特徴の直径が画像の全体的なレンダリングの粒度よりも小さい場合にのみ無視する必要があります。

しかし、これらの制約の下でも、行を見つけるためのいくつかの異なるヒューリスティックを考えることができます。

  • レンダリング境界ボックス内の高点を見つけます。その高い地点から、いくつかの異なる軌道に沿って下り坂を進みます。トラバーサル ラインが標高のしきい値を超えるたびに、そのポイントを標高固有のバケットに追加します。トラバーサル パスが極小値に達したら、コースを変更して上り坂に移動します。

  • レンダリング領域の長方形のバウンディング ボックスに沿って高解像度のトラバーサルを実行します。各標高のしきい値 (および勾配が方向を反転する変曲点) で、それらのポイントを標高固有のバケットに追加します。境界トラバーサルが終了したら、それらのバケットの境界点から内側にトレースを開始します。

  • レンダリング領域全体をスキャンし、一定間隔で標高を測定します。測定ごとに、標高しきい値への近さをメカニズムとして使用して、その近傍の補間測定を行うかどうかを決定します。この手法を使用すると、レンダリング領域全体のカバレッジがより確実に保証されますが、結果のポイントをパスを構築するための適切な順序に組み立てるのは困難です。

だから、それらは私の考えの一部です...

実装を深く掘り下げる前に、StackOverflow の他の誰かがこの種の問題の経験があり、正確で効率的な実装への指針を提供できるかどうかを確認したかった.

編集:

ellisbben による "Gradient" の提案に特に興味があります。そして、私の核となるデータ構造 (最適化補間ショートカットの一部を無視して) は、完全に微分可能な一連の 2D ガウス関数の合計として表すことができます。

3 次元の勾配を表すデータ構造と、任意の点でその勾配ベクトルを計算する関数が必要になると思います。頭のてっぺんから、それを行う方法がわかりません(簡単なように思えますが)が、数学を説明するリンクがあれば、私は大いに感謝します!

アップデート:

ellisbben と Azim による優れた貢献のおかげで、フィールド内の任意の点の等高線角度を計算できるようになりました。実際のトポ ラインの描画はすぐに続きます。

これは、私が使用してきたゲットー ラスター ベースの topo-renderer を使用した場合と使用しない場合の、更新されたレンダリングです。各画像には、赤い点で表される 1000 のランダムなサンプル ポイントが含まれています。その点の等高線は白い線で表されます。場合によっては、(補間の粒度に基づいて)特定のポイントで勾配を測定できなかったため、対応する等高線なしで赤い点が発生します。

楽しみ!

(注: これらのレンダリングでは、以前のレンダリングとは異なる表面トポグラフィを使用しています。これは、プロトタイプを作成している間に、反復ごとにデータ構造をランダムに生成するためです。ただし、コアのレンダリング方法は同じであるため、アイデア。)

代替テキスト

代替テキスト

ここに興味深い事実があります。これらのレンダリングの右側に、完全な水平および垂直角度で奇妙な等高線がたくさん表示されます。これらは、補間プロセスのアーティファクトです。補間プロセスでは、補間子のグリッドを使用して、コアのレンダリング操作を実行するために必要な計算の数を (約 500%) 削減します。これらの奇妙な等高線はすべて、2 つの補間グリッド セル間の境界に発生します。

幸いなことに、これらのアーティファクトは実際には重要ではありません。アーティファクトは勾配の計算中に検出できますが、異なるビット深度で動作するため、最終的なレンダラーはそれらに気づきません。


再度更新:

そして、寝る前の最後の楽しみとして、もう 1 組のレンダリングを示します。1 つは昔ながらの「連続カラー」スタイルで、もう 1 つは 20,000 のグラデーション サンプルを使用しています。この一連のレンダリングでは、ポイント サンプルの赤い点を削除しました。これは、イメージが不必要に乱雑になるためです。

ここでは、補間コレクションのグリッド構造のおかげで、前に言及した補間アーティファクトを実際に見ることができます。これらのアーティファクトは、最終的なコンター レンダリングでは完全に見えなくなることを強調しておく必要があります (隣接する 2 つのインターポレーター セル間の大きさの差は、レンダリングされたイメージのビット深度よりも小さいため)。

ボナペティ!!

代替テキスト

代替テキスト

4

9 に答える 9

9

勾配は、役立つ数学演算子です。

補間を微分可能な関数に変えることができれば、高さの勾配は常に最も急な上昇の方向を指します。同じ高さのすべての曲線は、その点で評価された高さの勾配に垂直です。

最高点から開始するというあなたの考えは賢明ですが、複数の極大値がある場合は機能を見逃す可能性があります。

私は提案します

  1. 線を描画する高さの値を選択します
  2. 細かく規則的に配置されたグリッド上に多数のポイントを作成し、線を描画したい最も近い高さに向かってグラデーション方向に各ポイントを小さなステップで歩きます
  3. グラデーションに垂直な各点をステップして曲線を作成します。別の曲線が近づきすぎたときにポイントを殺して余分なポイントを削除しますが、数字のような砂時計の中心を破壊しないようにするには、両方のポイントの勾配に垂直な向きのベクトル間の角度を確認する必要がある場合があります。(方向付けとは、計算した勾配と垂直値の間の角度が常に同じ方向で 90 度であることを意味します。)
于 2008-11-04T21:45:52.053 に答える
3

代わりに、問題に適していると思われるマーチング スクエアアルゴリズムがありますが、粗いグリッドを使用する場合は結果を滑らかにしたい場合があります。

描画する topo 曲線は、2 次元にわたるスカラー フィールドの等値面です。3 次元の等値面には、マーチング キューブアルゴリズムがあります。

于 2008-11-04T21:58:56.503 に答える
3

@ericksonへのコメントに応えて、関数の勾配の計算に関するポイントに答えてください。300 項関数の導関数を計算する代わりに、次のように数値微分を行うことができます。

画像内のポイント [x,y] を指定すると、勾配を計算できます (最急勾配の方向)

g={  ( f(x+dx,y)-f(x-dx,y) )/(2*dx), 
  {  ( f(x,y+dy)-f(x,y-dy) )/(2*dy) 

ここで、dx と dy はグリッド内の間隔です。等高線はグラデーションに対して垂直になります。したがって、等高線の方向 c を取得するには、g=[v,w] を行列 A=[0 -1, 1 0] で乗算します。

c = [-w,v]
于 2008-11-04T23:35:36.963 に答える
2

私自身もこのようなものが欲しかったのですが、ベクトルベースのソリューションは見つかりませんでした.

ただし、特にデータがラスター ベースの場合は、ラスター ベースのソリューションも悪くありません。データもベクトルベースである場合 (つまり、サーフェスの 3D モデルがある場合)、実際の計算を行って、さまざまな高度での水平面との交差曲線を見つけることができるはずです。

ラスターベースのアプローチでは、隣接するピクセルの各ペアを調べます。1 つが等高線レベルの上にあり、1 つが下にある場合、明らかにそれらの間に等高線が走っています。等高線をアンチエイリアスするために使用したトリックは、等高線の色を両方のピクセルに混ぜ合わせ、理想的な等高線への近さに比例させることです。

たぶん、いくつかの例が役立つでしょう。現在のピクセルが 12 フィートの「標高」にあり、隣接するピクセルが 8 フィートの標高にあり、等高線が 10 フィートごとにあるとします。次に、中間に等高線があります。不透明度 50% の輪郭線の色で現在のピクセルをペイントします。別のピクセルは 11 フィートにあり、隣接するピクセルは 6 フィートにあります。現在のピクセルを 80% の不透明度で色付けします。

alpha = (contour - neighbor) / (current - neighbor)

残念ながら、私はコードを手元に持っておらず、もう少し追加された可能性があります (斜めの隣人も見て、 で調整したことをぼんやりと思い出しますsqrt(2) / 2)。これで要点を十分に理解していただければ幸いです。

于 2008-11-04T22:00:56.343 に答える
1

あなたがやろうとしていることは、contour 関数を使用して MATLAB で行うのはかなり簡単だろうと思いました。輪郭に低密度近似を作成するようなことは、おそらく輪郭のかなり単純な後処理で行うことができます。

幸いなことに、MATLAB のクローンである GNU Octave には、さまざまな等高線プロット関数が実装されています。そのコードを見ると、ほぼ確実に数学的に正しいアルゴリズムと実装を確認できます。または、処理を Octave にオフロードできる場合もあります。他の言語とのインターフェースに関するページをチェックして、それがより簡単かどうかを確認してください。

開示:私はOctaveをあまり使用しておらず、実際に等高線図をテストしていません。ただし、MATLAB での私の経験から言えば、データを MATLAB に取り込めば、わずか数行のコードで必要なほとんどすべてが得られると言えます。

また、非常に VanGough 風のスロープ フィールド プロットを作成できたことをお祝いします。

于 2009-01-21T05:05:23.167 に答える
0

CONRECアプローチをお勧めします。

  • 空の線分リストを作成する
  • データを規則的なグリッド スクエアに分割します
  • グリッドの正方形ごとに、正方形を 4 つのコンポーネント三角形に分割します。
    • 三角形ごとに、ケース (a から j) を処理します。
      • 線分がいずれかのケースと交差する場合:
        • その終点を計算する
        • 線分をリストに格納する
  • 線分リストに各線分を描画します

線がぎざぎざしすぎる場合は、より小さいグリッドを使用します。線が十分に滑らかで、アルゴリズムに時間がかかりすぎる場合は、より大きなグリッドを使用してください。

于 2013-12-18T16:42:41.173 に答える
0

私は自分で深く掘り下げる前に、常にhttp://mathworld.wolfram.comのような場所をチェックします:)

多分彼らの曲線のセクションが役立つでしょうか?または、マップ上のエントリかもしれません。

于 2008-11-04T20:39:56.647 に答える
0

レンダリングしたものを実際のトポ マップと比較してください。それらは私と同じように見えます。私は何かを変えるつもりはありません...

于 2008-11-04T21:03:22.340 に答える