REALbasic かってに連載します(第17回)


   PowerBookでは、標準の状態で、入力がしばらくなくなると、自動的に、処理スピードが遅くなる現象があらわれます。このためTimerなどのリズムが遅くなります。次のようにすると、この現象を改善できます。
 まず、コントロールパネルの「PowerBook」を開きます。
 この画面で、Optionキーを押しながらスイッチを、簡易からカスタムに切り替えると、オプションの画面があらわれます。
 ここで「プロセッササイクリングを許可する」のチェックをはずします。
 第17回 - 立体グラフを描くための座標軸変換-

 グラフの3次元表示を考えてみます。立体グラフを描くための基本事項の説明です。少しくどいかもしれませんがおつきあい下さい。
  このホームページは出来るだけ画像を使わずにテキストだけで作ることを心がけています。しかしながら今回は図がなければ説明出来そうにありません。重いページは、いらいらしますので、画像は相当に粗いものを使いました。



 せっかく立体図形を描くのですから、将来回転角度を変更して図形を自由に回転できるように、座標軸変換から話をはじめましょう。
 
 微分の説明用のグラフ。クラリスで描いたものを、グラフィックコンバーターでGIFにしたものです。
 まず、z−y座標軸での点P(y,z)を原点を中心にして、角度θだけ右回りに回転させた場合、新しい z1−y1座標軸上でのP点の座標P(y1,z1)は、上の図で示したように1式で表されます。少し考えてみて下さい。この(1)式を扱いやすくするために行列を使います。(2)式のようにすっきりした表現になります。(2)式の中の行列を回転行列といい、この部分だけ取り出したものを(3)式のように書きます。これは一般には座標軸の(-θ)回転を表すものですがここでは、図形の(+θ)回転を表しています。
 さてこの行列の演算(1次変換)を利用して、まず図1のような3次元の青色の面(この中のどこかの1点が点P(x,y,z)だと思って下さい。点Pを図の中に書き忘れました。)を図2のように(+θ)回転させ、(x,y,z)を(x1,y1,z1)に変換します。もちろんこのときx軸の回りに回転させるのですからxは変化しません。次に図3のようにz軸の回りに(+φ)回転させ(x1,y1,z1)を(x2,y2,z2)に変換します。プログラム内では「θ」は「TH」、「φ」は「PH」としています。
 クラリスで描いたものを、グラフィックコンバーターでGIFにしたものです。  クラリスで描いたものを、グラフィックコンバーターでGIFにしたものです。  クラリスで描いたものを、グラフィックコンバーターでGIFにしたものです。
 さて次が、3次元を2次元に変換する操作です。といって難しいわけではなく図4、図5のように視点の位置「L0」と、スクリーンの位置「L」でスクリーンに映る図形の縮尺が決まり、(x2,y2,z2)を(x3,y3,z3)に変換します。(x3,y3)の2次元にするわけですからz3は不必要ですね。
 クラリスで描いたものを、グラフィックコンバーターでGIFにしたものです。  クラリスで描いたものを、グラフィックコンバーターでGIFにしたものです。
 以上の操作をプログラムすることになります。
 3次元から2次元への変換はサブルーチンにしてModuleにまとめました。以下がその部分です。

Module1:Methods:axisrotate

//このサブルーチンは3次元空間を2次元に変換するものです。
//FileメニューのNew ModuleでModule1を作ります。
//このModule1の画面内でEditメニューよりNew Methodを選び
// Procedure name を「axisrotate」に決めParametersの欄に
//x as double,y as double,............... のように宣言します。
//戻り値のx3,y3はグローバル変数としてmodule1に定義します。
dim x1,x2, y1, y2 ,z1, z2 as double
//
//まずx軸の周りに角度(TH)ラジアン回転します。
y1=y*cos(th)+z*sin(th)
z1=-y*sin(th)+z*cos(th)
x1=x
//次にz軸の周りに角度(PH)ラジアン回転します。
y2=y1*cos(ph)+x1*sin(ph)
z2=z1
x2=-y1*sin(ph)+x1*cos(ph)
//z軸方向から見ます。
//z=l0 の位置にスクリーンがあり、視点は z=l の位置です。
y3=(l-l0)*y2/(l-z2)
x3=(l-l0)*x2/(l-z2)

 このサブルーチンを次のように、呼び出して使うわけです。

//サブルーチン「axisrotate」を呼び出します。
//0.8はx軸まわり、0.2はy軸まわりの回転角
//400と200は視点の位置とスクリーンの位置
axisrotate x, y,z0,0.8,0.2,400,100
// x3 と y3 に変換後の座標が入ります。

 戻り値を持たないサブルーチンは、Sub〜End Subで表示され。パラメータの渡し方は、「axisrotate x, y,z0,0.8,0.2,400,100」のように始めに「スペース」を入れて「, 」で続けます。これに対して、戻り値を持つサブルーチンは、Function〜End Functionで表示され。パラメータの渡し方は、「a=axisrotate (x, y,z0,0.8,0.2,400,100)」のように、「, 」で続けたパラメータを「 ( ) 」でくくることになります。ただし、今回のaxisrotateサブルーチンでは、x3 と y3の2つの戻り値が必要になったため、通常の戻り値を1つしか持てないサブルーチンとはせずに、x3 と y3はグローバル変数としました。このためx3 と y3は正確には、このサブルーチン自身の戻り値ではなく、サブルーチンの形としては、戻り値を持たないサブルーチンとなっています。



 今回の「3dimensions01」の ソースプログラムです。
 おまけに、「一次変換01h」と「疑似回転02」をつけました。なにかの役にたつでしょう。

  
  プロジェクトファイルのみです。REALbasicの最新バージョンが必要です。35 kバイト  

  ソースコードについての質問やご意見がありましたら以下のアドレスまでご連絡下さい。
          koko-@mx2.tiki.ne.jp

このホームページのホストは です。 無料ホームページをどうぞ!