1.3 2次元図形とアフィン変換テストプログラム(その2))

1.3.2 アフィン変換テストプログラム(その2)

 ジェネラルプロシージャはメニューの[ツール]−[プロシージャの追加]によって作成できますが,直接コードウィンドウにコーディングできます.今の場合, Private Sub Draw( )とコードして[Enter]キーをクリックするとEnd Subが自動的に現れます.リスト1.8のようにコーディングします.

(リスト1.8)VB.Drawサブプロシージャ(frmTestCGI)

Private Sub Draw()

     Dim  i% ,ip%

    Picture1.Picture = Loadpicture() '画面クリア

  ' 座標軸

  Picture1.ForeColor = RGB( 100 ,100 ,255 )

     ' x軸

  Picture1.Line ( 10, y0 ) - ( Picture1.Width - 10, y0 )

    ' y軸

  Picture1.Line ( x0 ,10 ) - ( x0,Picture1.Height - 10,)

    ' 図形の描画

  Picture1.DrawWidht  = 2

  Picture1.ForeColor = RGB ( 0,0,0 )

    For i = 0 To n - 1

       ip = i + 1

           If ip = n Then

                ip = 0

         End If

         ' 各辺を描画

    Picture1.Line ( x0 + px ( i ) ,y0 - py ( i ) ) - ( x0 + px( ip ) ,y0 - py ( ip ) )

    Next

End Sub

 

 LoadPictureは,BMPファイルなどの画像をピクチャーボックスに表示するときに用いる関数です.引数を空白にするとクリアされます.

 ForeColorは文字や図形の色を指定するプロパティです.RGBは色のRGB値を表す長整数値を返す関数です.各色256階調で指定します.RGB(r,g,b)のrが赤成分,gが緑成分,bが青成分の明度を表します.黒を指定するときはRGB(0,0,0),白を指定するときはRGB(255,255,255)とします.

 For〜Nextステートメントは,同じような処理を決められた回数だけ繰り返すときに使用するステートメントです.

 コマンドボタンcmdRotateをマウスの左ボタンでクリックしたとき左回りに10度回転し,右ボタンを押したとき右回りに10度回転するようにします.

 コマンドボタンをダブルクリックすると自動的にClickイベントプロシージャが現れます.コードウィンドウの右上の「プロシージャ」ボックスでMouseDownイベントを選択し,リスト1.9のようにコーディングします.

(リスト1.9)VB.[回転]ボタンのMouseDownイベント(frmTestCGI)

Private Sub cmdRotate_MouseDown ( Button As Integer ,_ Sift As Integer ,X As Single ,Y As Single )

   Dim theta#

   

   If Button = 1 Then

        theta = 10

   Else

        theta = −10

   End If

 

   Call Rotate( theta )

   Call Draw

End Sub

 MouseDownイベントプロシージャには4個の引数が存在します.第1引数のButtonは左ボタンが押されたときは1,右ボタンが押されたときは2となります.第2引数のShiftによってイベント発生時に[Shift],[Ctrl],[Alt]キーが押されたかどうかを判断します.それぞれ1,2,4が割り当てられています.XとYは,マウスが押されたときのマウスポインタの位置を示します.なお,VBでは一つのステートメントは1行でコーディングします.紙幅の都合でやむなく2行となるときは,1行目の末尾にアンダーバーを付けて示します(省略することもある).しかし,アンダーバーをコーディングすることはできません.

 実際の回転操作は,リスト1.10のようにRotateサブプロシージャで行います.

(リスト1.10)VB.回転ルーチン:Rotateサブプロシージャ(frmTestCGI)

Private Sub Rotate ( ByVal theta# )

   Dim xx !,yy !

   Dim i%

 

   For i = 0 To n −1

         xx = px ( i ) : yy = py ( i )

         px ( i ) = xx * Cos ( PI * theta / 180 ) − yy * Sin ( PI  * theta / 180 )

         py( i ) = xx * Sin ( PI * theta / 180 ) + yy * Cos ( PI * theta / 180 )

NEXT

End Sub

 For〜Nextステートメントを用いて各頂点について式(1.2)を計算しています.今までの頂点座標を別の変数に置き換えてから計算していることに注意してください.頂点配列は常に新しい座標値に更新されます.


Copyright 2000 酒井 幸市

新刊のご案内


Copyright 1997-2001 CQ Publishing Co.,Ltd.