三角格子による等高線
上図はcontourTtest.dprojを実行した場合です。
四点のデーターを使用して、四角形として、各辺を通る値から等高線を描画する方法もあります。
三角格子を使用した等高線の作画が一番簡単なので、本プログラムは三角格子を採用しています、他の方法はよく解らないので。
プログラムリストを見れば、どの様な手順で、作図しているかわかります、リストの中に、かなり詳しくコメントを入れました。
平面上の
分布データーを測定した場合、測定データーを等高線で表現することがあります。
ここでは、測定点間を三角形にして、その辺に設定した等高線が通るかどうかで、グラフ化する一番単純な例のプログラム例を紹介しています。
上図は、プログラム中に埋め込まれたデーターを使用して、グラフ化した例です。
サンプルとしてダウンロードできます。
左図①②③④は、測定点で、値は、
1, 3, 4, 4 とした場合、辺①③間に三本 等高線がとおり、それぞれ対辺に抜ける例です。
三角形の辺の中で、一番等高線が通る辺を探し出し、値の大きい等高線から順に、描けばよいことになります。
例えば、等高線の値が、 3.3
であったとすると、辺①③の上のほうを通り、辺②③の中央から少し下を通ることになります。1 より大きくて 3
より小さければ、辺①②を通ることになり、これを全ての三角部分設定した三角格子に対して行えば等高線が作図できることになります。
しかし、上図のような、三角形に区切ると、かなり不自然な等高線となるので少し手を加えることとします。
等高線を引く場合、データーの最小値と、最大値を等高線で分割する数を決め、分割した値のレベル値が、一つの三角形の辺を通る数を調べ、もし、三角形の辺を通過したら、三角形の辺に通る等高線数のの順番にソートし、全ての三角形に同じ作業を行っているので、三角形の数を増やしてやれば良い事が解ります。しかし、データーの数は限られているので、新たなデーターを作り出す必要があります。
次にContour_prg.dprojについて説明します。
今度の三角格子は、中間点を追加し倍に増えた三角形にたいして行うようにしています。
Contour_prg.dproj
測定点の中間点に、新たな仮想点を作成し、そこへ周りの四点の平均値を与えます、こうする事により、三角形を2倍にする事が出来、かなり滑らかな等高線を作図可能となります。
アルゴリズムを使用し、縦横データー数により自動的に、新たな点を追加出来る様にすればよかったのですが、等高線を必要とするプログラムを必要とする機会が少なかったの作成しませんでした。
プログラム毎固定のデーター数となっています。
必要であれば、新たに作成してください。
中間点の追加と、三角形の各頂点の番号には、一定の法則があるのでそう難解な問題ではないと思います。
一番上の図からすれば、等高線の数は少ないのですが、かなり滑らかになって作図されているのがわかると思います。
ダウンロードできるプログラムには、単純なな三角形による例と、中間点を追加した場合の例が入っています。
単純な三角形による例は、実行をすると、一番上の等高線と、測定のX方向ピッチと、Y方向を変えた例、更に全ての測定点の座標を入れた場合の例が表示されます。
中間点を追加した例は、データーのサンプリング方法が違う、三種類のモード例となってます。
二つのモードは、プログラムに内にデーターを埋め込んであり、テストモードして表示が可能です。
残りの一つのモードは、データー数が非常に多いために、ファイルから読み込む事になります。
又、前記二つのモードにも、ファイルから読み込むことが出来ます、データーファイルは、ダウンロード圧縮ファイルの中にプログラムソースと一緒に入っています。
データーファイルの拡張子は ”.CSV”となっていますが、他の”.CSV”ファイルと混ぜて保存しないで下さい
データーを読み込む時にどのモードのファイル化を単に、ファイルのサイズで判断しているので、用途の違うファイルを読み込むとエラーになります、本来は、先頭行に判別用のコード設定するか、専用の拡張子にすればよいのですが、少し手を抜きました。
地図ならば、線画だけでも良いかねしれませんが、測定データーとか、温度分布を表示する場合、塗りつぶしをした方が見やすいでしょう。
又、立体的に表示すると、地図などはすごくわかりやすくなります。
Contour_prg.dprojには、立体表示のルーチンも入っています、立体に表示する方法は、立体トラスと同じですが、塗りつぶす場合は、格子の作図順に気をつけないと、正しく描画できません。
次の図で説明をします。
二次元の等高線画面が表示されたら、3Dのボタンをクリックすれば、3Dになり、もう一度クリックすると、2Dに戻ります。
左図は 等高線では見づらいので塗りつぶしをしさらに、立体的に表示して見やすくしています。
三次元グラフィックなので、マウスで画面上をドラッグすることにより、表示画像を回転移動できますが、非常に描画すべきデーター数が多いため、描画速度を上げる必要があります。
描画速度上げるのには、OpenGLかDilectXを使うことになり、本プログラム例では、DilectXを使用しています。
Contour_prg.dprojは、DilectXを使用しているので、これを取り込んでおかないと、プロジェクトを開いただけでエラーとなります。
Delphi XE3以降には、FireMonkeyというDilectXを使えるモードがあるのですが、とにかく、これに変換をするのは大変なので古くから使用しているDelphiXを使用しています。
DilectXを使用しても、データー数が多いと普通のパソコンでは、滑らかな移動は出来ません、そこで、移動中は作図する格子の数の間引きをしたり、グリッドが表示になっていたら、移動中は表示させない等、作図処理の量を減らす工夫が必要です。
DelphiXは"http://www.micrel.cz/Dx/"からダウンロードしてください。下の方にリンクしてあります。
最近になって、DelphiXをダウンロードし、XE3にパッケージとして取り込みましたが、どうも動作が正常ではありません。
マウスで、フォームを移動すると、Draw画面が真っ黒くなり消えてしまいます。
ダウンロードしたDelphiXの中に入っているサンプルも開いて実行してみたがどうもおかしい。
ためしに、Delphi7と古いDelphiXで作成したものを、Win7、8で動作させましたが、全く正常に動作しました。
色々調べた結果、DelphiXが、昔のから修正されており、修正した部分が悪さしていることがわかりました。
取りあえず、今回の等高線のソフトで正常に動作するようにだけ、DelphiXのソースを修正しましたので、修正については、後で説明をします。
塗りつぶしを行う為には、、そのエリア囲む座標を全て指定する必要があります。
その囲むモードは、八個あり、0から7まで番号わけして塗りつぶしを実行します。
一番等高線の通る辺の書き出し辺から、どの辺に抜けたかのフラグをたてて判別します。
例えば、Aフラグ、Bフラグとも、FalseでAフラグ辺に抜けたら、モード①としAフラグをTrueに設定、次にBフラグ辺に抜けAフラグがTrueだったら、モード③といった手順で判別をし、モード①なら各辺の交点三箇所と色を、モード③だったら、各線の交点五箇所をと、色を塗りつぶしサブルーチンに渡します。
実際には、レベルの低いほうから、塗りつぶしを行います。図を見ると等高線が四本だと、五分割になるので、最後の一本処理が終わった後、残った部分の処理をして一つの三角部分の処理が終わります。
塗りつぶしを行う場合は、等高線の通らない三角格子も、塗りつぶし処理を行う必要があります。
三点の頂点の値から、色を設定し、塗りつぶしをします。
等高線が通らない場合は、全て同じ値か、近い値になっているので、どれかの頂点の値を元に、塗りつぶす色を設定します。
三次元処理は、データー点の値をを高さ方向ととして、立体とし、視点から座標点に対する角度と距離により作図を行いますが、
ここで問題になるのは、作図順で、視点から遠いものから先に作図し、順に近いほうへ作画します。
実際には影にかくれて見えない部分も作図することになりますが、見えない部分であることを判別するのは容易ではないので、
見えない部分は上書きしてしまい、消してしまうのが処理が単純ですみます。
距離は、図形の中心位置で計算しています、、三点の視点からの距離を加算して距離とします。
比較さえ出来れば良いので、3で割って平均値にする必要はありません、割り算は計算に時間が掛かります、0.33333を乗算しても良いのですが、無駄です。
全ての三角要素の距離の計算が出来たら、遠い順にソートします。
ソートは、時間短縮の為マージソートを使用します、パソコンで行うソートは、マージソートが一番早いようです。
バブルソートでは、遅すぎて表示に時間が掛かりすぎ、実用になりません。
DelphiX
DelphiXの"http://www.micrel.cz/Dx/"からダウンロードしてください。 DelphiXのダウンロード
ソースファイルでダウンロードした場合は、新しくDelphiXという名前のホルダーを ”C:¥ユーザー¥パブリック¥パブリックのドキュメント¥RAD Studio¥10.0¥の中に作成し、その中に圧縮ファイル解凍します。
10.0の部分は、Delpi XE のバージョンによって変わります。
Delphiバージョン、インストール、OSの条件により、ホルダーの場所そのものが変わるので注意しましょう、わからない場合は、適当に新しいホルダー作成して、その中に解凍しても良いでしょう。
Delphiを起動します。
まず、ツール オプション Delphiオプション ライブラリー ライブラリパス でDelphiXのSourceホルダーへのパスを追加します。
パスを追加したら、DelphiXのプロジェクトを開きます、XE3の場合は、DelphiX170.dprojです、後は、次の手順で DXDraws.pas の内容を修正し、インストールを実行してください。
インストールは、プロジェクトマネージャーが表示している DelphiX***.bplをマウスで選択、右ボタンクリックでインストールを実行します。
既にインストールされている場合は、単にビルドを実行すれば良いでしよう。
エラーになった場合は、修正にミスがあるので、再確認してください。
DelphiXの修正部分の説明
DXDraws.pasを表示すると、最初に上図のエラーが表示されます、しかし、コンパイル時は正常に通るので、単にエディターのバグと思われますが気になるようであれば、最後の行に下図の様にスペースを追加するか、改行すれば良いでしょう。
次に本来の修正を行います。
画面上で、実行実行中のフォームをドラッグした時に、DirectXのImage表示が消えてしまう対策です、これは、単純にマウスイベントでイニシャライズされる為なので、そのイベント部分をコメントアウトします。
DelphiXをフルスクリーンで表示するオプションがあるのですが、この時エラーになってしまうバグを修正します。
DelphiXをダウンロードする時、All-in-One packでダウンロードした場合は、Samples¥Graphi¥Basic¥BasicSample.dprojを実行してみて下さい。
フルスクリーンの切り替えは、シフト+ALT and ENTER です、プログラムの終了は、 Esc となっています。
フルスクリーン切り替え時に、グラフィックドライバーを確認するのですが、確認するルーチンが抜けている為エラーになります。
古い、DelphiXのバージョンでは、do3Dを使用しないと、このルーチンを通らなかったのですが、新しいのではdo3Dをどこかのルーチンで無条件に追加しているようです。
この追加を探し出して、対策をするのは大変なので取りあえず、エラーが出ないように対処します。
赤線で囲まれた部分を追加します。
前記の対処を含め、ここでの変更は、DelphiXを使用する他のプログラムに対して、問題が出る可能性があります。
気になるようであれば、DXDraws.pasを本プログラムContour_prg.dprojのホルダーへコピーし、プロジェクトに追加、その上で修正しれば、本プログラムContour_prg.dproj専用となります。
各種プログラム計算例に戻る