時乃工房-Windowsとアマグラマーな関係-

アクセスアップにオートリンクネット リンクが自動で増殖オートリンクの登録はこちら 節約内職情報検索局
ページランク向上リンク集
役立つリンク集 Web Links
SEO対策ディレクトリ型検索エンジン Su-Jine
メニュー
トップ
アマグラミング
C++編 目次
第16章
第18章
ソフトウェア開発製品
相互リンク

<勘違いだらけのアマグラミングな日々(C++編)>

第17章 伸びる豆腐(5)

2006年11月22日

「ブレゼンハムのアルゴリズム」は、加減算だけで構成された斜線描画アルゴリズムである。
昔8ビットCPUでマシンコードいじってた時は、その単純さ故の高速処理がありがたかったものだ。
対して現状のマシンは乗除算も軽々こなすから、もしかしたら速度的な恩恵はあまり無いのかもしれない。
しかし、このアルゴリズムの優れた点は速度ばかりではないと感じている。
加減算のみで得られるその結果は小数などと無縁で、いたってデジタルなのだ。
その考え方も柔軟性に富み、アマグラマーにとっては良い参考となり、随分と応用範囲も広い。

そんなわけで、早速実装に挑戦してみよう。

List.002-015
main_window.h
main_window.cpp
main_callback.h
main_callback.cpp
main_process.h
main_process.cpp
graphics_control.h
graphics_control.cpp
bitmap.rc
main_menu.h
main_menu.cpp
main_menu.rc
<ソースのダウンロード>

今回変更したのは、”main_process.cpp”内の関数MainTransaction()
わざとらしく{}で囲った部分である。
私が考え出したアルゴリズムなら、ここで偉そうに解説させていただくところだが、とても恐れ多くてそんな真似できない。
代わりに、基本形をなるべく崩さずにコーディングしたつもりなので、紙と鉛筆でフローチャートを描いて動きを追っていただけることをお勧めする。
それだけの価値があるアルゴリズムであると、個人的には確信している。
老婆心ながら云わせていただければ、ここの部分の動きに注目していただきたい。

さて、こうして出来上がったソースをビルドして実行した結果が次のとおり、
うまい具合に直線を描画していることが判る。
しかし、ここで終わっては失敗アマグラマー(?)の名折れ。
もうちょっと「ブレゼンハムのアルゴリズム」で遊んでみよう。












と、その前に描画の排他処理をなんとかしようと思う。
こうぶちぶち千切れてもらっては、結果の確認が思うように出来ない。

List.002-016
main_window.h
main_window.cpp
main_callback.h
main_callback.cpp
main_process.h
main_process.cpp
graphics_control.h
graphics_control.cpp
bitmap.rc
main_menu.h
main_menu.cpp
main_menu.rc
<ソースのダウンロード>

で、こんな感じにソースを書き換えてみた。
何をいじったのかと云うと、関数SetCharacter()内でデバイスコンテキストのハンドルを取得するとき、すなわち関数CreateCompatibleDC()を呼び出したときに、取得に成功するまで繰り返すようにしてみたのだ。
ハンドル取得のリトライ処理である。
そう、関数BildClientArea()で描画しているあいだ、このハンドルを取得することをOSは許してくれない

実行してみると、なるほど、ぎこちない動きではあるが、切れ目無く直線を描画してくれる。
・・・しかし、ひとつだけ隠しておけない事実がある。

アマグラミングをお楽しみの皆さんは、決してこの解決方法を真似しないでください。

なぜなら今回の解決方法は、エラーの発生原因を決めうちして対応したものだからだ。
もし、ハンドルの取得に失敗した理由が、関数BildClientArea()によるものではなかったら?
もし、(原因がこのアプリケーションとは限らない)未知のエラー継続的に続き、いつまでたってもdoループから逃れることが出来なかったら?
・・・恐怖の無限ループに陥った挙句、アプリケーションもそこで固まってしまう可能性がある。
・・・ああ、恐ろしい。決して、真似てはいけない・・・。

ま、今回のプログラムは幸い問題なく稼動してくれているので、このまま実験を進めていこう。
それでは「ブレゼンハムのアルゴリズム」に少しいたずらして・・・

List.002-016a
main_window.h
main_window.cpp
main_callback.h
main_callback.cpp
main_process.h
main_process.cpp
graphics_control.h
graphics_control.cpp
bitmap.rc
main_menu.h
main_menu.cpp
main_menu.rc
<ソースのダウンロード>

で、早速実行結果。

どうだろう?
ご期待にそえたであろうか?
そう、「ブレゼンハムのアルゴリズム」曲線の生成も出来てしまったりするのである。
因みにどこをいじったのかは、内緒。
人の作ったアルゴリズムをいじる楽しみを共有していただければ、私は満足である。(←偉そうですいません)











さて、長かった豆腐延長計画も今回で終わりにしよう。
次回はいよいよ(?)、キャラクターの移動と描画に関する実験をしてみようと思う。

<前章> <目次>





<時乃工房>
Net Office Nakai
メビウスリング投稿掲示板には小説日記ゲームアニメコミック小学生中学生などの掲示板過去ログがあります。相互リンクも募集中。