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

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

プロシージャの引数について

 イベントプロシージャの引数は自動的に用意されますが,ジェネラルプロシージャが引数を必要とするときは,自分で作成しなければなりません.引数の変数を宣言するとき,参照渡しなのか値渡しなのかを指定しなければなりません.ByRefキーワードを使えば参照渡しとなり,値そのものでなく値を格納しているアドレス(番地)が渡されます.すなわち,引数を受け取ったプロシージャ側で値を変更すると,元のプロシージャ側でもその値は変化します.これに対し,ByValキーワードを使うと値渡しとなり,元のプロシージャ側には影響しません.キーワードを省略するとByRef,すなわち参照渡しになります.

 Form_Loadイベントプロシージャでは,リスト1.11のようにScaleModeの変更とデカルト座標の中心点を設定します.

(リスト1.11)VB.Form_Loadイベント(frmTestCGI)
Private Sub Form_Load()

     ScaleMode = 3

     Picture1.ScaleMode = 3 

      x0 = Picture1.Width / 2

     y0 = Picture1.Height / 2

End Sub

 以上で実行してみます.スケーリングおよび平行移動に関するルーチンをリスト1.12に示します.[拡大・縮小]ボタンを左クリックするとx方向,y方向ともに2倍となり,右クリックで0.5倍となるようにしています.[x方向移動]ボタンによって水平に±10移動します.[y方向移動]に関しては自作してください.

(リスト1.12)VB.その他のプロシージャ(frmTestCGI)

Private Sub Scaling(ByVal sx !,ByVal sy !)

     Dim  i% 

    For i = 0 To n - 1

           px ( i ) = sx * px ( i )

           py ( i ) = sy * py ( i )

    NEXT

End Sub

 

Private Sub Translate(ByVal tx !,ByVal ty !)

     Dim  i% 

    For i = 0 To n - 1

           px ( i ) = px ( i ) + tx

           py ( i ) = py ( i ) + ty

    NEXT

End Sub

 

Private Sub cmdScale_MouseDown( Button As Integer,_Shift As Integer ,X As Single ,Y As Single ) 

     Dim sx ! sy !

    

     If Button = 1 Then

         sx = 2 : sy = 2

     Else

         sx = 0.5 : sy = 0.5

    End If

   

    Call Scaling ( sx,sy )

    Call Draw

 End Sub

Private Sub cmdTranslateX_MouseDown( Button As Integer,_Shift As Integer ,X As Single ,Y As Single ) 

      Dim tx ! ty !

    

    If Button = 1 Then

         tx = 10

    Else

         tx = - 10

    End If

    ty = 0

   

     Call Translate( tx,ty )

     Call Draw

 End Sub

 以上の方法では,平行移動後に回転やスケーリングを行うと,原点を中心に操作されます.このように,アフィン変換はどちらを先に実行するかによって結果が変わります.図1.8にその様子を示しています.図1.8(a)は座標の原点を中心として定義した正方形です.図1.8(b)はその図形を45度回転した後で(4,0)の位置へ平行移動した結果です.図1.8(c)は(4,0)へ平行移動した後に45度回転した結果です.

(図1.8)アフィン変換

(約5Kバイト)

 

 


Copyright 2000 酒井 幸市

新刊のご案内


Copyright 1997-2001 CQ Publishing Co.,Ltd.