VC.NET WinXPを使用しています。
現在等高線を描くプログラムを作成しています。
データを基準値から、間隔毎にまるめ
(基準値100 間隔10 のとき 100、105は0、115は1に変換してます)
画素4近傍のデータと比較し、4近傍より値が大きければ、プロットするようなものを
作成しましたが、意図するような等高線が得られず、なんとなくもう少しよいアルゴリズムがな
いかと、探しています。
どなたか等高線を描くアルゴリズムをご存知ないでしょうか?
プログラムの質問ではなく不適切かもしれませんがよろしくお願いいたします。
その意図するような等高線とやらがどんなのか説明しないと
等高線を描くときの元になっているデータがどんなのなのかとか
自分が書きたい等高線のイメージはどんな物で
今の状態はどんな風になっているのかとか
情報が足りないなぁと思います。
ここには直接画像が貼れないので、どこかOpenなスペースに
画像をのっけてリンクを張るとかするとわかりやすいかも。
高度の値って全画素持っていたりするんでしょうか?
数値地図なんかだと一定の間隔の高度データしかないから
画素毎になんか持てそうに無い様に思いますけれど。
状況がつかめないからアドバイスができるのかすらよくわかりませんし。
何だか難しそうだな。
どういうものなのか俺にはわからんが
ちょっとした知性を持った処理じゃないと
間違った線を描いちゃいそうだな。
丸めるのは最後の処理です。
等高線のアルゴリズムは知りませんが、
>4近傍より値が大きければ
が
「あるデータ」がその上下左右のデータの何れかひとつより大きければ
という意味ならば風邪ギミ さんの方法で実現できそうだなーと思います。
皆さんがおっしゃるように
期待する動作と「どう違うのか」を明示しないと
適切な回答も付かないと思います。
おもしろそうなプログラムなのでがんばってください。
できたのかな?
最初にやることは等高線の間隔の値より十分少ない値まで細かくするって事だね!
等高線 アルゴリズムでぐれれば、参考になりそうなものは見つかるけれど。
面白そうなので少し考えてみました。勝手に仕様を推測・補完しています。
大前提として格子点の標高のデータがあるものとする。
各格子の4隅の標高から、その格子に描かれる可能性のある等高線の標高を求め、
辺の両端の標高を内分して、等高線が辺を横切る座標を求める。
対応する座標を直線で結んでこの格子については完成。
この処理を全格子で行う。
改良方法
これだと全ての等高線は直線になるので、
等高線が辺を越えるときに滑らかにつながるように、
2次関数か3次関数で近似する。
(多分Bezier曲線でハンドルの大きさが同じで向きが反対になるように
すれば良さそう。ちょっと適当)
考察その1
鞍部などでは正しく等高線が結ばれない可能性がある。
対応する辺上の座標を格子毎に判断するのでなく、
周囲の格子も判断の材料にすれば、正しくなる可能性が増すとは思う。
しかし、要求されている等高線の間隔と比較して十分な精度のデータがあれば、
格子毎の判断でも十分だと思う。逆に、元に十分な精度がなければ、
正しい等高線を引くのはかなり困難(or 無意味)だろう。
(ここで十分な精度のデータとは、メッシュの大きさというよりも、
メッシュ内の標高の差を指す。)
もしも格子点の標高データがない場合、ランダムなXY座標の標高データを
格子点の標高データに変換する必要がある。
以前そんなプログラムを使ったことがあるが、
ドローネ三角形に分割し、それぞれの三角形を3次曲面として、
近傍の三角形と滑らかにつながるように係数を調整していたようだ。