• 検索結果がありません。

3D回転体プログラム

N/A
N/A
Protected

Academic year: 2021

シェア "3D回転体プログラム"

Copied!
10
0
0

読み込み中.... (全文を見る)

全文

(1)

プログラムの概要

入力画面で、マウスを用いて、側面より見た平 面図を描きます。マウスの左ボタンをクリック する事で連続線を描き、右ボタンをクリックす ると新しい線を描く事が出来る。 側面図が完成すると、回転の基本角度を設定し て、確定ボタンをクリックすると、平面図を立 体図に座標変換する。 各軸の回転角度を設定して、表示ボタンをクリ ックすると、立体図が表示される。各軸の回転 角度を変更して、表示ボタンをクリックすると 色々な角度から立体図を見る事が出来る。

3D回転体プログラム

VB 2005 ④ □ 単純変数の宣言(Private) □ 標準コントロールの利用(Picture、GroupBox、RadioButton、Label、Text、Button) □ プロパティの値の取得と設定(Image、Button、X、Y、Enabled) □ イベントの利用(Load、Click、MouseDown) □ メソッドの利用(FromImage、BringToFront、Dispose) □ メソッドの利用(Clear、DrawLine、Refresh) □ ステートメントの利用(Call、End) □ 演算子(代入演算子、算術演算子、比較演算子、結合演算子) □ 制御構造構文(条件分岐、ループ処理) □ サブルーチン(新規プロシージャ、引数) 今回の課題項目 □ マウスイベントに依るマウス座標の取得(MouseDown) □ 描画メソッドに依るグラフィックスの描画(Clear、DrawLine、Refresh) 今回の重点項目 □ 視点と物体、物体と表示面の距離を自由に設定出来る様にする。 □ 作成した立体画像をファイルに記録出来る様にする。 今回の応用項目

(2)

■ オブジェクト・プロパティ一覧 ■ コントロールの種類 プロパティ プロパティの設定値 フォーム Name kaitentai Text 3D回転体 ピクチャーボックス1 Name picInput BackColor White Size 640, 400 ピクチャーボックス2 Name picDisp BackColor White Size 640, 400 グループボックス1 Name grpBaseDegree Text、Font 回転の基本角度(MS明朝,標準,9) グループボックス2 Name grpAxisDegree Text、Font 各軸の回転角度(MS明朝,標準,9) ラジオボタン1 Name radBaseDegree10 Text 10 ラジオボタン2 Name radBaseDegree20 Text 20 ラジオボタン3 Name radBaseDegree30 Text 30 Checked True ラベル1 ボタン1 ラジオボタン1~8 ピクチャーボックス1 ピクチャーボックス2 ピクチャーボックスの 1と2は同じ場所に重 ねて貼り付ける。 グループ1 テキスト1 ボタン2 ボタン3 ボタン4 ラベル2 テキスト2 ラベル3 テキスト3 グループ2

(3)

コントロールの種類 プロパティ プロパティの設定値 ラジオボタン4 Name radBaseDegree40 Text 40 ラジオボタン5 Name radBaseDegree45 Text 45 ラジオボタン6 Name radBaseDegree60 Text 60 ラジオボタン7 Name radBaseDegree90 Text 90 ラジオボタン8 Name radBaseDegree120 Text 120 ラベル1 Name lblAxisDegreeX Caption X軸 ラベル2 Name lblAxisDegY Caption Y軸 ラベル3 Name lblAxisDegZ Caption Z軸 テキストボックス1 Name txtAxisDegX TextAlign Right Text 30 テキストボックス2 Name txtAxisDegY TextAlign Right Text 0 テキストボックス3 Name txtAxisDegZ TextAlign Right Text 0 ボタン1 Name btnInput Text、Font 入力(MS明朝,太字,11) ボタン2 Name btnFix Text、Font 確定(MS明朝,太字,11) ボタン3 Name btnDisp Text、Font 表示(MS明朝,太字,11) ボタン4 Name btnFinish Text、Font 終了(MS明朝,太字,11)

(4)

■ 既存の標準モジュールの追加 ■ プロジェクトに既存の標準モジュールを追加するには、ソリューションエクスプローラでプロジェクト を右クリックして表示されるポップアップメニューで、『追加』をクリックし、更に、サブメニューか ら『既存項目の追加』を選択する。猶、因みに、新規に標準モジュールを作成する場合は、『モジュー ルの追加』を選択する。 次に、既存項目を指定する為のダイアログが表示されるので、既存の標準モジュールを選択し、『開く』 ボタンをクリックする。以上で、プロジェクトに、既存の標準モジュールが組み込まれる。

(5)

■ プログラムリスト(フォームモジュール部分) ■

Public Class kaitentai

Private G As Graphics

' フォームが読み込まれた時の処理

Private Sub kaitentai_Load( ByVal sender As Object, ByVal e As System.EventArgs ) _ Handles Me.Load ' 視点~物体~表示面の距離の設定 D2D = 500 D2E = 500 ' 使用可能なボタンの制限 btnFix.Enabled = False btnDisp.Enabled = False ' Graphics オブジェクトの生成 With picInput

.Image = New Bitmap( .Width, .Height ) End With

G = Graphics.FromImage( picInput.Image ) End Sub

' ボタン(入力)がクリックされた時の処理

Private Sub btnInput_Click( ByVal sender As Object, ByVal e As System.EventArgs ) _ Handles btnInput.Click ' 入力画面の表示と初期化 picInput.BringToFront( ) G.Clear( Color.White ) G.DrawLine( Pens.Blue, 0, 200, 639, 200 ) G.DrawLine( Pens.Blue, 320, 0, 320, 399 ) Flag = False Cnt = 0 ' 使用可能なボタンの制限 btnFix.Enabled = False btnDisp.Enabled = False End Sub ' ボタン(終了)がクリックされた時の処理

Private Sub btnFinish_Click( ByVal sender As Object, ByVal e As System.EventArgs ) _ Handles btnFinish.Click Me.Dispose( ) End End Sub ピクチャボックスの Imege プロ パティに、描画を行うキャンバス の役目をするBitmap オブジェク トを生成して居る。 実際に描画を行う Graphics オブ ジェクトをピクチャボックスの Image から生成して居る。 此処で宣言した変数は同じフォー ム内の総てのサブプロシージャで 値の参照と設定を行う事が出来 る。 此の値を変更する事に依り拡大率 等を変更する事が出来る。 同じ位置に2枚重ねたピクチャー ボックスをBringToFront メソッ ドに依り、表示するピクチャーボ ックスを切り替えて居る。 Enabled プロパティを False に設 定する事に依り、使用出来るボタ ンを制限して居る。 入力画面のクリアとX軸・Y軸の 描画を行う。 アプリケーションを終了する場 合、Dispose メソッドに依り、正 しくプログラムをメモリから消去 して終了する事が望ましい。

(6)

' ボタン(確定)がクリックされた時の処理

Private Sub btnFix_Click( ByVal sender As Object, ByVal e As System.EventArgs ) _ Handles btnFix.Click ' 計算ジェネラルプロシージャの呼出 Call Calculation( ) ' 使用可能なボタンの制限 btnFix.Enabled = False btnDisp.Enabled = True End Sub ' ボタン(表示)がクリックされた時の処理

Private Sub btnDisp_Click( ByVal sender As Object, ByVal e As System.EventArgs ) _ Handles btnDisp.Click ' 表示画面の表示 picDisp.BringToFront( ) ' 表示ジェネラルプロシージャの呼出 Call Display( ) End Sub ' 入力画面でマウスボタンが押し下げられた時の処理

Private Sub picInput_MouseDown( ByVal sender As Object, _

ByVal e As System.Windows.Forms.MouseEventArgs ) Handles picInput.MouseDown If e.Button = Windows.Forms.MouseButtons.Left Then

' 左ボタンが押し下げられた場合 If Not Flag Then

Xa = e.X : Ya = e.Y

G.DrawLine( Pens.Red, Xa, Ya, Xa, Ya ) Flag = True

Else

Xb = e.X : Yb = e.Y

G.DrawLine( Pens.Red, Xa, Ya, Xb, Yb )

X1(Cnt) = Xa - 320 : Y1(Cnt) = -(Ya - 200) : Z1(Cnt) = 0 X2(Cnt) = Xb - 320 : Y2(Cnt) = -(Yb - 200) : Z2(Cnt) = 0 Cnt += 1

Xa = Xb : Ya = Yb

If Not btnFix.Enabled Then btnFix.Enabled = True End If

picInput.Refresh( )

ElseIf e.Button = Windows.Forms.MouseButtons.Right Then ' 右ボタンが押し下げられた場合 Flag = False End If End Sub End Class 此処では、マウスイベントに依るマウス座標の取得と描画メソッドに依るグラフィックスの描画を主題として居る 為、平面座標を立体座標に変換する等の部分は、標準モジュールkaitentai_mod.vb に既に入力された物を組み込ん で使用する。標準モジュールは、通常、アプリケーションの他のモジュールで共通に使う為の宣言やプロシージャを 記述する為に使用する。 其の時点で使用出来るボタンを Enabled プロパティに依り、使用 可と使用不可に切り替える事で誤 操作を防ぐ事が出来る。 同じ位置に2枚重ねたピクチャー ボックスをBringToFront メソッ ドに依り、表示するピクチャーボ ックスを切り替えて居る。 Call は、Sub プロシージャ等に制 御を渡すステートメントで有る。 引数のe には、マウスイベントに 関する情報(マウスボタンの種類 やマウスポインタの位置)が格納 されて居る。 赤いペンで直線を描画して居る。 描画後は、Refresh メソッドで再 描画しないと、描画結果が反映さ れない。 マウスの右ボタンがクリックされ た場合は、描画フラグをFalse に 設定し、非描画モードにする。

(7)

■ プログラムリスト(標準モジュール部分) ■

Module kaitentai_mod ' グローバルな定数の宣言

Public Const MAX As Integer = 1000

Public Const DEG As Single = 3.14159 / 180

' グローバルな変数の宣言

Public X1( MAX ), X2( MAX ), Y1( MAX ), Y2( MAX ), Z1( MAX ), Z2(MAX) As Single Public CosX, CosY, CosZ As Single

Public SinX, SinY, SinZ As Single Public Xa, Xb, Xn As Integer Public Ya, Yb, Yn As Integer Public Cnt, D2D, D2E As Integer Public Flag As Boolean

' 3D回転体を表示するジェネラルサブプロシージャ Public Sub Display( )

' サブプロシージャレベルでローカルな変数の宣言 Dim I As Integer

Dim F As New Kaitentai( ) Dim G As Graphics

' アクティブなフォームの設定 F = Kaitentai.ActiveForm

' Graphics オブジェクトの生成

F.picDisp.Image = New Bitmap( .Width, .Height ) G = Graphics.FromImage(F.picDisp.Image)

' 表示画面のクリア G.Clear( Color.White )

' 各軸の回転角度の基本値の計算

CosX = Math.Cos( Val( F.txtAxisDegX.Text ) * DEG ) CosY = Math.Cos( Val( F.txtAxisDegY.Text ) * DEG ) CosZ = Math.Cos( Val( F.txtAxisDegZ.Text ) * DEG ) SinX = Math.Sin( Val( F.txtAxisDegX.Text ) * DEG ) SinY = Math.Sin( Val( F.txtAxisDegY.Text ) * DEG ) SinZ = Math.Sin( Val( F.txtAxisDegZ.Text ) * DEG ) ' 各座標を変換して表示

For I = 0 To Cnt

Call Convert( X1( I ), Y1( I ), Z1( I ) ) : Xa = Xn : Ya = Yn Call Convert( X2( I ), Y2( I ), Z2( I )) : Xb = Xn : Yb = Yn G.DrawLine( Pens.Blue, Xa, Ya, Xb, Yb )

Next I End Sub 此処でPublic 宣言した定数は、総 てのクラスの総てのプロシージャ で参照する事が出来る。 此処で Public 宣言した変数は総 てのクラスの総てのプロシージャ で値の参照と設定を行う事が出来 る。 配列の要素数は、将来の変更に備 えて、定数や変数で指定する事が 望ましい。此の場合定数MAX の 値を変更するだけで、簡単に総て の要素数を変更する事が出来る。 此処で宣言した変数は宣言したプ ロシージャ内でしか値の参照と設 定を行う事が出来ない。 標準モジュールからフォームモジ ュールを操作する為の変数を設定 して居る。 回転体を描画する為のピクチャボ ックスを基に Graphics オブジェ クトを生成して居る。 何度も使用される値は、其の都度 計算するのではなく、予め計算し た結果を変数に格納して置くと実 行速度を上げる事が出来る。 特に、ループ内で複雑な計算を行 うと実行速度が下がるので、注意 を要する。 Call は、Sub プロシージャ等に制 御を渡すステートメント。引数が 必要なプロシージャを呼び出す場 合は、引数リストを括弧で囲む必 要が有る。

(8)

' 平面座標を立体座標に変換するジェネラルサブプロシージャ Public Sub Calculation( )

' サブプロシージャレベルでローカルな変数の宣言 Dim C As Single Dim D As Integer Dim I As Integer Dim J As Integer Dim K As Integer Dim N As Integer Dim S As Single Dim T As Integer

Dim F As New Kaitentai( ) Dim R As Control

' アクティブなフォームの設定 F = Kaitentai.ActiveForm

' 平面座標を立体座標に変換 T = Cnt

For Each R In F.grpBaseDegree.Controls If TypeName( R ) = "RadioButton" Then

If CType( R, RadioButton ).Checked = True Then K = Val( R.Text ) Exit For End If End If Next For I = 1 To ( 360 / K – 1 )

D = K * I : S = Math.Sin( D * DEG ) : C = Math.Cos( D * DEG ) For J = 0 To ( T – 1 )

N = T * I + J

If N > MAX Then

MsgBox( "データが大き過ぎます!" & vbNewLine & _ "回転の基本角度を変えて遣り直して下さい" ) Exit Sub End If X1( N ) = Z1( J ) * S + X1( J ) * C Y1( N ) = Y1( J ) Z1( N ) = Z1( J ) * C - X1( J ) * S X2( N ) = Z2( J ) * S + X2( J ) * C Y2( N ) = Y2( J ) Z2( N ) = Z2( J ) * C - X2( J ) * S Next J Next I Cnt = N + 1 For I = 0 To ( 360 / K – 1 ) For J = 0 To T N = ( T + 1 ) * I + J + Cnt 標準モジュールからフォームモジ ュールを操作する為の変数を設定 して居る。 此処で宣言した変数は宣言したプ ロシージャ内でしか値の参照と設 定を行う事が出来ない。 フォームやコントロールもデータ 型と仕て指定する事が出来る。 此処では,何のラジオボタンが選 択されて居るかを判定して居る が、判定が付けば、残りの判定は 不要なので Exit For でループか ら強制脱出して居る。 此処では2種類の算術演算子が使 用されて居る。 +:加算(足す) *:乗算(掛ける) 優先順位は、数学と同じく乗算が 加算よりも高く、先に計算される。 Sin や Cos 等の算術関数は、Math クラスで定義されて居る。

(9)

If J = T Then X1( N ) = X2( T * I + J – 1 ) Y1( N ) = Y2( T * I + J – 1 ) Z1( N ) = Z2( T * I + J – 1 ) If I = 360 / K - 1 Then X2( N ) = X2( J – 1 ) : Y2( N ) = Y2( J – 1 ) : Z2( N ) = Z2( J – 1 ) Else X2( N ) = X2( T * ( I + 1 ) + J – 1 ) Y2( N ) = Y2( T * ( I + 1 ) + J – 1 ) Z2( N ) = Z2( T * ( I + 1 ) + J – 1 ) End If Else X1( N ) = X1( T * I + J ) Y1( N ) = Y1( T * I + J ) Z1( N ) = Z1( T * I + J ) X2( N ) = X1( T * ( I + 1 ) + J ) Y2( N ) = Y1( T * ( I + 1 ) + J ) Z2( N ) = Z1( T * ( I + 1 ) + J ) End If Next J Next I Cnt = N End Sub ' 座標を変換するジェネラルサブプロシージャ

Public Sub Convert( ByVal X As Single, ByVal Y As Single, ByVal Z As Single ) ' サブプロシージャレベルでローカルな変数の宣言 Dim X3 As Single Dim X4 As Single Dim Y3 As Single Dim Y4 As Single Dim Z3 As Single Dim Z4 As Single Dim TT As Single ' 各座標の変換

X3 = ( Y * SinX + Z * CosX ) * SinY + X * CosY Y3 = ( Y * CosX - Z * SinX )

Z3 = ( Y * SinX + Z * CosX ) * CosY - X * SinY X4 = X3 * CosZ - Y3 * SinZ Y4 = X3 * SinZ + Y3 * CosZ Z4 = Z3 TT = ( D2D - Z4 ) / ( Z4 - D2D - D2E ) Xn = Int( ( TT + 1 ) * X4 + 0.5 ) : Yn = Int( ( TT + 1 ) * Y4 + 0.5 ) Xn = 320 + Xn : Yn = 200 - Yn End Sub End Module 配列の要素番号(添字)には変数 だけでなく、変数を含む計算式も 指定出来る。 点 P(x,y,z)をX軸の周りに角度α だけ回転させた時の点 P’(x’,y’,z’) は三角関数を用いて下記の様に表 す事が出来る。 x’ = x

y’ = ycosα - zsinα z’ = ysinα + zcosα Int関数は、引数を超えない最 大の整数を返す関数で有るが、正 の値を指定する時には、単に整数 部分を返す関数と考えて差し支え 無い。

(10)

イベントハンドラのsender 引数と e 引数 各イベントハンドラのメソッド宣言(旧称:イベントプロシージャ)には、共通してsender と e の2 個の同じ引数が渡される。 イベントハンドラのメソッドの第1引数 sender には、イベントの発生源で有るコントロールのインス タンス(イベント発生源のオブジェクト)への参照が格納されて居る。 イベントハンドラのメソッドの第2引数は、System.EventArgs クラス、又は、其れを継承したクラス が指定されて居り、イベントに関連する補足情報が格納されて居る。 引数e には、特に付加情報の無い Click イベント等は、基本と成る System.EventArgs クラスが引き渡 されるが、付加情報が有る場合は、付加情報を含むクラスをSystem.EventArgs クラスを継承して作成

した物が引き渡される。例えば、MouseDown イベントや MouseMove イベントや MouseUp イベント の場合、System.Windows.Forms.MouseEventArgs クラスが其れに該当する。 此のクラスは、System.EventArgs クラスを継承して居て、マウスイベントに固有の情報を表現する能 力を有して居り、マウスポインタの座標値を表すX や Y、マウスボタンの状態を表す Button 等が定義 されて居る。 例えば、入力画面でマウスボタンが押し下げられた時の処理を記述したイベントハンドラのメソッド宣 言では、下記の様に定義されて居る。

Private Sub picInput_MouseDown( ByVal sender As Object, _

ByVal e As System.Windows.Forms.MouseEventArgs ) Handles picInput.MouseDown

上記の sender は、イベント発生源のオブジェクト、即ち、picInput を表し、亦、e は、MouseDown

イベントに関連する補足情報(マウスポインタの座標値を表す X や Y、マウスボタンの状態を表す

Button 等)をプロパティと仕て持つオブジェクトを表す。

従って、MouseDown イベントが発生した時のマウスポインタの座標は、e.X と e.Y で知る事が出来、 亦、マウスボタンの状態は、e.Button で知る事が出来る。

参照

関連したドキュメント

その詳細については各報文に譲るとして、何と言っても最大の成果は、植物質の自然・人工遺

血は約60cmの落差により貯血槽に吸引される.数

 当社は、APからの提案やAPとの協議、当社における検討を通じて、前回取引

CIとDIは共通の指標を採用しており、採用系列数は先行指数 11、一致指数 10、遅行指数9 の 30 系列である(2017

特に、その応用として、 Donaldson不変量とSeiberg-Witten不変量が等しいというWittenの予想を代数

交通事故死者数の推移

充電器内のAC系統部と高電圧部を共通設計,車両とのイ

今回の調査に限って言うと、日本手話、手話言語学基礎・専門、手話言語条例、手話 通訳士 養成プ ログ ラム 、合理 的配慮 とし ての 手話通 訳、こ れら