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 酒井 幸市
|