メルマガ:あゆしゃのC言語プログラミング
タイトル:あゆしゃのC言語プログラミング(Vol.553) ヒステリシス1 座標変換  2005/04/18


/*========================================================*/
    <<<あゆしゃのC言語プログラミング>>>
/*========================================================*/
 第553回 ヒステリシス1 座標変換
 発行    2005年4月18日(月曜日)
 発行数   約2600

{magclick}
/*========================================================*/
 はじめに ( 決り文句 )
/*========================================================*/
・このメールマガジンは、主にまぐまぐさんから発行しています。
・ジャンルは、マルチメディアのプログラム、C言語です。
・横60文字で作成し、インデントは大抵半角スペース4つです。
・ここで扱うプログラムは、C言語と半光年以内のものです。
・登録解除は、メルマガのホームページでお願いします。
・過去ログはバックナンバー(下欄参照)を活用して下さい。
・内容は私が感じたもので、最新の技術も、へたれもあります。
・わかりやすさを優先させる為、たまに嘘があるかもしれません。
・セキュリティ突破のため、暗号化された単語があります。

/*========================================================*/
 ご挨拶
/*========================================================*/

 こんにちは。あゆしゃです。

 先日、「コンピュータ将棋のアルゴリズム」という本を購入
しました。

 その名前のとおり、将棋ソフトについてのアルゴリズムがつら
つらと紹介されています。

 ソースコードもすべてついているので、嬉しいです。

 が。少々コードが疑問です。

 高速化をうたっているわりには、あまり高速ではなさそうな
コードなのです。

 高速化を目的としているらしいところが高速化になっておらず、
いたずらにソースを醜くしています。

 たとえば、メモリを少なくすると処理が早くなるような誤解を
されているようですが、大事なことは、メモリを少なくすること
ではなく、

 メモリへのアクセス回数を少なくすること、

 というところです。

 また、あゆしゃは将棋の腕前はからっきしなのですが、それなり
に考えを持っており、その考えと紹介されているアルゴリズムの
違いに違和感を感じます。

 というわけで自分でアルゴリズムを作ってみようと考えました。

http://ayusya.hp.infoseek.co.jp/AboutShougiApp.html

 とりあえず、駒を表示してみました。


/*========================================================*/

 さて、今回も相互紹介があります。

──────────────────────────────────────

●「とおってもわかりやすい経済用語」

「なあんだこんなことだったのか!! 」新聞・ニュースが良く分かります。
よく読むが、よく聞くが何となく意味の分からない言葉を分かりやすく説明します。
今まで新聞はテレビ欄しか見なかったというあなたも経済欄がこんなに簡単に!!

【登録】→ http://www.mag2.com/m/0000113177.htm

──────────────────────────────────────

 経済用語のメルマガらしいです。

 少し購読してみたのですが、かなり難しいです。

 判りやすいとは書いてありますが、初心者向きではありません。

 そもそも、説明書きが専門用語を使ってなされているので、
知っている人でなければ理解できないでしょう。

 情報量が多く、正確でもある(だろう)から、ある程度かじって
いる上で理解を深めようという人や、(まじめに)勉強しようとい
う人にかぎって、良いメルマガだと思います。

 また、先だってこちらの紹介をしていただいたのですが、それに
対する「筆者のコメント」として、まぐまぐに表示しているこの
メルマガの紹介文が転載されていました。

 経済用語の部分以外は、手抜きであるようです。

{magclick}
/*========================================================*/
 今回のお題  << ヒステリシス1 座標変換 >>
/*========================================================*/

 ゲームプログラムには欠かせないアルゴリズムの代表格である、
ヒステリシスについて説明します。

 ヒステリシスというと難しい気がするかもしれませんが、しかし
意外に、知らず知らずのうちに使ってしまっているほどの、
ポピュラーなアルゴリズムです。

 前回紹介したCImageのサンプルには、マウスを当てた部分が
ぷにぷに動くという、わけのわからない機能が付いています。

 あれは、ヒステリシスを実験したものです。

 呼吸に伴う胸の上下運動や、まばたきなど、座標変換による簡単
(で安価)なエフェクトを入れるときにあのようなことをします。

 また、拡大縮小を伴うゲームでは、大活躍です。

 たとえば、

/*========================================================*/

画像の (320,240)-(639,479) の範囲を、

画面の (100,100)-(499,399) の範囲に表示している状態で、

マウスで (234,345) をクリックされた時、

そこに相当する画像のドットをペンで塗りつぶす。

/*========================================================*/

 という動作があるとします。

 グラフィックエディッタが日常的に行っていることです。

 この座標変換を計算するには、

int gx1 = 320; // 画像の始点
int gy1 = 240;

int gx2 = 639; // 画像の終点
int gy2 = 479;

int dx1 = 100; // 画面の始点
int dy1 = 100;

int dx2 = 499; // 画面の終点
int dy2 = 399;

int mx = 234; // マウスの座標
int my = 345;

// mx,my に相当する画像上の座標
int tx = gx1 + ( (mx-dx1)*(gx2-gx1) ) / (dx2-dx1);
int ty = gy1 + ( (my-dy1)*(gy2-gy1) ) / (dy2-dy1);

 という感じになります。これはお決まりの式、公式です。

 計算結果としては、

tx = 320+((234-100)*(639-320))/(499-100)
   = 320+134*419/399
   = 320+56146/399
   = 320+140
   = 480

ty = 240+((345-100)*(479-240))/(399-100)
   = 240+245*239/299
   = 240+58555/299
   = 240+195
   = 435

 となるでしょうか。(あっていますか?)

/*========================================================*/

 足したり引いたり掛けたり割ったり、四則演算をすべて使う上に
変数が多くて、混乱します。

★まるで、「5分で肺が腐る空気を吸った」感じです。

 また、割り算で0演算エラーが起きないようにエラーチェックを
する必要がありますが、面倒であり、ソースを煩雑にします。

 だから、関数にしましょう。

int con2( int d, int x1, int x2, int y1, int y2 )
{
    if( d < x1 ) return y1;
    if( d > x2 ) return y2;
    if( x1 == x2 ) return y1;
    return y1 + ( (d-x1) * (y2-y1) ) / (x2-x1);
}

 となります。

 この関数を使って上の問題を解くとすると、

int tx = con2( mx, dx1, dx2, gx1, gx2 );
int ty = con2( my, dy1, dy2, gy1, gy2 );

 となります。さっきより簡単ですね。

 この関数の働きを図で書くと、このようになります。

http://ayusya.hp.infoseek.co.jp/Image/Hys_con2.jpg

 d は、横軸のどれかになります。

 座標がペアであると考えると、関数に指定する情報は3つであり
とても簡単で幸せです。


/*========================================================*/

 このように、座標変換を行う処理のことを、

★コンバート

 といいます。(だから変数名が「こん」なのです)

{magclick}
/*========================================================*/
 さいごに
/*========================================================*/

 今後の予定表です。

済 CImageサンプルの説明(していなかった?)
済 ヒステリシス1 ヒステリシスとは座標変換
第554回 ヒステリシス2 ヒステリシスとは状態遷移
第555回 ヒステリシス3 ヒステリシスとはファジィ
第556回 ヒステリシス4 テンプレートで作成しよう
第557回 ヒステリシス5 クラスにまとめよう
第558回 テンプレート木構造1 TreeMasterをテンプレートに
第559回 テンプレート木構造2 クラス設計
第560回 テンプレート木構造3 追加、検索
第561回 テンプレート木構造4 ソート、left検索
第562回 テンプレート木構造5 マクロ定義
第563回 ガベージコレクタ1 テンプレートの隠蔽
第564回 ガベージコレクタ2 ユーザ設計
第565回 ガベージコレクタ3 クラス設計
第566回 ガベージコレクタ4 登録、削除処理
第567回 ガベージコレクタ5 Attach、Detachの処理
第568回 キャラエディッタ1 ソフトの説明

 あくまでも予定です。

 アイデアはいろいろあるのですが、時間が足りません。

 なぜかというと、G一年戦争が難しすぎてクリアできないから
ファントムキングダムに逃避しているためです。

 無限増殖技が開発されているので、反則かと思いつつもそれを
利用して、速攻クリアに挑戦中です。

{magclick}
/*========================================================*/
 次回予告
/*========================================================*/

 次回は4月20日(水曜日)に、第554回をお送りします。
 お題は「ヒステリシス2 状態遷移」

 ゲームプログラムに欠かせないアルゴリズムの代表格である
(らしい)、ヒステリシスアルゴリズムについて特集します。

 お楽しみに!

/*========================================================*/
 最後の決り文句
/*========================================================*/
 このメールマガジンは、まぐまぐさんから発行しています。
 このメールマガジンを解除したい場合は、まぐまぐさんをご利用
ください。このメルマガのまぐまぐアイディーは最後にあります。
 このメールマガジンには広告が挿入されていますか?
 このメールマガジンの内容に文面の引用はありませんか?
 めーらっくすの場合はめーらっくすの利用方に従ってください。
 このメールマガジンの内容の、転用、流用、宣伝、リンク、
最強の王手 なんて大歓迎です。

{magclick}
/*========================================================*/
 
/*========================================================*/

発行者 あゆしゃ

ホームページ::あゆしゃの世界
http://ayusya.hp.infoseek.co.jp/

ご意見・ご感想・ご質問メール
mailto:ayusya@flamenco.plala.or.jp

まぐまぐ::アイディー
0000020674

まぐまぐ::登録と解除
http://www.mag2.com/m/0000020674.htm

まぐまぐ::バックナンバー
http://jazz.tegami.com/backnumber/frame.cgi?id=0000020674

めーらっくす::アイディー
MM3E1AEE285AB4F

めーらっくす::登録と解除
http://www.mailux.com/mm_dsp.php?mm_id=MM3E1AEE285AB4F 

めーらっくす::バックナンバー★最近のものならこちらが便利★
http://www.mailux.com/mm_bno_list.php?mm_id=MM3E1AEE285AB4F

ブラウザの閉じるボタンで閉じてください。