第17章 伸びる豆腐(5)
2006年11月22日
「ブレゼンハムのアルゴリズム」は、加減算だけで構成された斜線描画アルゴリズムである。
昔8ビットCPUでマシンコードいじってた時は、その単純さ故の高速処理がありがたかったものだ。
対して現状のマシンは乗除算も軽々こなすから、もしかしたら速度的な恩恵はあまり無いのかもしれない。
しかし、このアルゴリズムの優れた点は速度ばかりではないと感じている。
加減算のみで得られるその結果は小数などと無縁で、いたってデジタルなのだ。
その考え方も柔軟性に富み、アマグラマーにとっては良い参考となり、随分と応用範囲も広い。
そんなわけで、早速実装に挑戦してみよう。
今回変更したのは、”main_process.cpp”内の関数MainTransaction()。
わざとらしく{}で囲った部分である。
私が考え出したアルゴリズムなら、ここで偉そうに解説させていただくところだが、とても恐れ多くてそんな真似できない。
代わりに、基本形をなるべく崩さずにコーディングしたつもりなので、紙と鉛筆でフローチャートを描いて動きを追っていただけることをお勧めする。
それだけの価値があるアルゴリズムであると、個人的には確信している。
老婆心ながら云わせていただければ、ここの部分の動きに注目していただきたい。
さて、こうして出来上がったソースをビルドして実行した結果が次のとおり、
うまい具合に直線を描画していることが判る。
しかし、ここで終わっては失敗アマグラマー(?)の名折れ。
もうちょっと「ブレゼンハムのアルゴリズム」で遊んでみよう。
と、その前に描画の排他処理をなんとかしようと思う。
こうぶちぶち千切れてもらっては、結果の確認が思うように出来ない。
で、こんな感じにソースを書き換えてみた。
何をいじったのかと云うと、関数SetCharacter()内でデバイスコンテキストのハンドルを取得するとき、すなわち関数CreateCompatibleDC()を呼び出したときに、取得に成功するまで繰り返すようにしてみたのだ。
ハンドル取得のリトライ処理である。
そう、関数BildClientArea()で描画しているあいだ、このハンドルを取得することをOSは許してくれない。
実行してみると、なるほど、ぎこちない動きではあるが、切れ目無く直線を描画してくれる。
・・・しかし、ひとつだけ隠しておけない事実がある。
アマグラミングをお楽しみの皆さんは、決してこの解決方法を真似しないでください。
なぜなら今回の解決方法は、エラーの発生原因を決めうちして対応したものだからだ。
もし、ハンドルの取得に失敗した理由が、関数BildClientArea()によるものではなかったら?
もし、(原因がこのアプリケーションとは限らない)未知のエラーが継続的に続き、いつまでたってもdoループから逃れることが出来なかったら?
・・・恐怖の無限ループに陥った挙句、アプリケーションもそこで固まってしまう可能性がある。
・・・ああ、恐ろしい。決して、真似てはいけない・・・。
ま、今回のプログラムは幸い問題なく稼動してくれているので、このまま実験を進めていこう。
それでは「ブレゼンハムのアルゴリズム」に少しいたずらして・・・
で、早速実行結果。
どうだろう?
ご期待にそえたであろうか?
そう、「ブレゼンハムのアルゴリズム」は曲線の生成も出来てしまったりするのである。
因みにどこをいじったのかは、内緒。
人の作ったアルゴリズムをいじる楽しみを共有していただければ、私は満足である。(←偉そうですいません)
さて、長かった豆腐延長計画も今回で終わりにしよう。
次回はいよいよ(?)、キャラクターの移動と描画に関する実験をしてみようと思う。
|