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

3D回転体プログラム

N/A
N/A
Protected

Academic year: 2021

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

Copied!
10
0
0

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

全文

(1)

プログラムの概要

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

3D回転体プログラム

VB④ □ 単純変数の宣言(Private、Dim) □ 配列変数の宣言(Private) □ 定数の宣言(Public、Const) □ 標準コントロールの利用(Picture、Frame、Option、Label、Text、Command) □ プロパティの値の取得と設定(Visible、Text、Value、Caption、Enabled) □ イベントの利用(Load、Click、MouseDown) □ 組込関数の利用(Sin、Cos、Val、Int、RGB、MsgBox) □ 演算子(代入演算子、算術演算子、比較演算子、結合演算子) □ 制御構造構文(条件分岐、ループ処理) □ サブルーチン(新規プロシージャ、引数) 今回の課題項目 □ マウスイベントに依るマウス座標の取得(MouseDown) □ 描画メソッドに依るグラフィックスの描画(PSet、Line、Cls) 今回の重点項目 □ 視点と物体、物体と表示面の距離を自由に設定出来る様にする。 □ 作成した立体画像をファイルに記録出来る様にする。 今回の応用項目

(2)

■ オブジェクト・プロパティ一覧 ■ コントロールの種類 プロパティ プロパティの設定値 フォーム オブジェクト名 Form1 ScaleMode 3 – ピクセル ピクチャーボックス1 オブジェクト名 picInput BackColor &H00FFFFFF& ScaleMode 3 – ピクセル Height 400 Width 640 ピクチャーボックス2 オブジェクト名 picDisp BackColor &H00FFFFFF& ScaleMode 3 – ピクセル Height 400 Width 640 フレーム1 オブジェクト名 fraBaseDegree Caption、Font 回転の基本角度(MSゴシック,標準,8) フレーム2 オブジェクト名 fraAxisDegree Caption、Font 各軸の回転角度(MSゴシック,標準,8) オプションボタン オブジェクト名 optBaseDegree Caption 10,20,30,40,45,60,90,120 Index 0~7(コントロール配列) ラベル1 ラベル2 コマンドボタン1 コマンドボタン2 フレーム2 チェックボックス コントロール配列 (0~7) ピクチャーボックス1 ピクチャーボックス2 ピクチャーボックスの 1と2は同じ場所に重 ねて貼り付ける。 フレーム1 コマンドボタン3 コマンドボタン4 ラベル3 テキスト1 テキスト2 テキスト3

(3)

コントロールの種類 プロパティ プロパティの設定値 ラベル1 オブジェクト名 lblAxisDegreeX Caption X軸 ラベル2 オブジェクト名 lblAxisDegreeY Caption Y軸 ラベル3 オブジェクト名 lblAxisDegreeZ Caption Z軸 テキストボックス1 オブジェクト名 txtAxisDegreeX Alignment 1 – 右揃え Text 30 テキストボックス2 オブジェクト名 txtAxisDegreeY Alignment 1 – 右揃え Text 0 テキストボックス3 オブジェクト名 txtAxisDegreeZ Alignment 1 – 右揃え Text 0 コマンドボタン1 オブジェクト名 cmdInput Caption 、Font 入力(MSゴシック,太字,14) コマンドボタン2 オブジェクト名 cmdFix Caption 、Font 確定(MSゴシック,太字,14) コマンドボタン3 オブジェクト名 cmdDisp Caption 、Font 表示(MSゴシック,太字,14) コマンドボタン4 オブジェクト名 cmdFinish Caption 、Font 終了(MSゴシック,太字,14) ピクチャーボックス ビットマップ、アイコン、メタファイル、JPEGファイル、GIFフィル等の画像を表示 するコントロール。描画メソッドを用いて、円や直線等のグラフィックを描画する事も出来 る。亦、他のコントロールを内包するコンテナに成る事も出来る。 フレーム 他のコントロールをグループ化するコントロール。通常、チェックボックスやオプションボ タンと共に使用し、フレーム自体は、特定の機能を持たない。 オプションボタン 複数の選択肢の中から1個だけを選択するコントロール。チェックボックスとは異なり、1 個のグループの中で選択出来るオプションボタンは1個だけで有る。 ラベル テキストを表示するコントロール。此のテキストは、ユーザーが直接入力したり変更したり する事は出来ない。 テキストボックス テキストの入力や表示を行うコントロール。此のテキストは、ユーザーが直接入力したり変 更したりする事が出来る。 コマンドボタン ユーザーが選択したコマンド(命令)や操作を実行するコントロール。OKボタンや実行ボ タン等、処理の開始や中断・終了の合図に用いられ、最も良く利用されるコントロールです。

(4)

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

Option Explicit

' コマンドボタン(表示)がクリックされた時の処理 Private Sub cmdDisp_Click()

' 表示画面を表示して初期化する picInput.Visible = False picDisp.Visible = True picDisp.Cls ' 表示ジェネラルサブプロシージャを呼び出す Call Display End Sub ' コマンドボタン(終了)がクリックされた時の処理 Private Sub cmdFinish_Click()

' プログラムをメモリから消去して終了する Unload Me

End End Sub

' コマンドボタン(確定)がクリックされた時の処理 Private Sub cmdFix_Click()

' 計算ジェネラルサブプロシージャを呼び出す Call Calculation ' 使用出来るコマンドボタンを制限する cmdFix.Enabled = False cmdDisp.Enabled = True End Sub ' コマンドボタン(入力)がクリックされた時の処理 Private Sub cmdInput_Click()

' 入力画面を表示して初期化する picDisp.Visible = False picInput.Visible = True picInput.Cls picInput.Line (0, 200)-(639, 200), RGB(0, 0, 255) picInput.Line (320, 0)-(320, 399), RGB(0, 0, 255) Flag = False Cnt = 0 ' 使用出来るコマンドボタンを制限する cmdFix.Enabled = False cmdDisp.Enabled = False End Sub Call は、Sub プロシージャ等 に制御を渡すステートメン ト。此のジェネラルサブプロ シージャは、標準モジュール で定義されて居る。 其の時点で使用出来るコマ ンドボタンを Enabled プロ パティに依り使用可と使用 不可に切り替える事に依り 誤操作を防ぐ事が出来る。 アプリケーションを終了す る場合、正しくプログラムを メモリから消去して終了す る事が望ましい。 ピクチャーボックスには、グ ラフィックスメソッドを利 用して、図形を描画する事が 出来る。 グラフィックスメソッドを 利用して図形を描画する事 が出来るのは、ピクチャーボ ッ クス の他に は、Form と Printer オ ブ ジ ェ ク トが 有 る。 同じ位置に2枚重ねたピク チャーボックスを Visible プ ロパティに依り、表示するピ クチャーボックスを切り替 えて居る。 同じ位置に2枚重ねたピク チャーボックスを Visible プ ロパティに依り、表示するピ クチャーボックスを切り替 えて居る。

(5)

' フォームが読み込まれた時の処理 Private Sub Form_Load()

' 視点~物体~表示面の距離を設定する D2D = 500 D2E = 500 ' 使用出来るコマンドボタンを制限する cmdFix.Enabled = False cmdDisp.Enabled = False End Sub ' 入力画面でマウスボタンが押し下げられた時の処理

Private Sub picInput_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single) ' 左ボタンが押し下げられた場合

If Button = 1 Then If Flag = False Then Xa = X: Ya = Y

picInput.PSet (Xa, Ya), RGB(255, 0, 0) Flag = True

Else

Xb = X: Yb = Y

picInput.Line (Xa, Ya)-(Xb, Yb), RGB(255, 0, 0)

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

Xa = Xb: Ya = Yb

If cmdFix.Enabled = False Then cmdFix.Enabled = True End If

' 右ボタンが押し下げられた場合 ElseIf Button = 2 Then Flag = False End If End Sub 此の値を変更する事に依り 拡大率等を変更する事が出 来る。 左右孰れかのマウスボタン を押すと MouseDown イベ ントが発生する。 左のマウスボタンが押され た場合には、引数 Button に 1が格納されてMouseDown イベントが発生する。 此の時、マウスの当該オブジ ェクト内での座標は、引数X とY に格納されて居る。 右のマウスボタンが押され た場合には、引数 Button に 2が格納されて居る。 描画モードと移動モードを 変数Flag で区別して居る。 変数 Flag はブール型の変数 で、True か False の孰れかの 値を取る。 此処では、マウスイベントに依るマウス座標の取得と描画メソッドに依るグラフィックスの描画を 主題として居る為、平面座標を立体座標に変換する等の部分は、標準モジュール kaitentai.bas に 既に入力された物を組み込んで使用する。 標準モジュールをプロジェクトに追加するには、メニューバーの『プロジェクト』より『標準モジ ュール』の追加を選択し、ダイアログボックスの『既存のファイル』タブから当該ファイルを指定 する。 標準モジュールは、通常、アプリケーションの他のモジュールで共通に使う為の宣言やプロシージ ャを記述する為に使用する。

(6)

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

Option Explicit

' 標準モジュールレベルでグローバルな定数の宣言 Public Const MAX As Integer = 1000

Public Const DEG As Single = 3.14159 / 180

' 標準モジュールレベルでグローバルな変数の宣言 Public X1(MAX) As Single

Public X2(MAX) As Single Public Y1(MAX) As Single Public Y2(MAX) As Single Public Z1(MAX) As Single Public Z2(MAX) As Single Public CosX As Single Public CosY As Single Public CosZ As Single Public SinX As Single Public SinY As Single Public SinZ As Single Public Xa As Integer Public Xb As Integer Public Xn As Integer Public Ya As Integer Public Yb As Integer Public Yn As Integer Public Cnt As Integer Public D2D As Integer Public D2E As Integer Public Flag As Boolean

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

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

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

CosX = Cos(Val(Form1.txtAxisDegreeX.Text) * DEG) CosY = Cos(Val(Form1.txtAxisDegreeY.Text) * DEG) CosZ = Cos(Val(Form1.txtAxisDegreeZ.Text) * DEG) SinX = Sin(Val(Form1.txtAxisDegreeX.Text) * DEG) SinY = Sin(Val(Form1.txtAxisDegreeY.Text) * DEG) SinZ = Sin(Val(Form1.txtAxisDegreeZ.Text) * DEG)

此処で宣言した定数は同じ フォーム内の総てのサブプ ロシージャで参照する事が 出来る。 此処で宣言した変数は同じ フォーム内の総てのサブプ ロシージャで値の参照と設 定を行う事が出来る。 配列の要素数は、将来の変更 に備えて、定数や変数で指定 する事が望ましい。此の場合 定数MAX の値を変更するだ けで、簡単に総ての要素数を 変更する事が出来る。 此処で宣言した変数は宣言 したサブプロシージャ内で しか値の参照と設定を行う 事が出来ない。 何度も使用される値は、其の 都度計算するのではなく、予 め計算した結果を変数に格 納して置くと実行速度を上 げる事が出来る。 特に、ループ内で複雑な計算 を行うと実行速度が下がる ので、注意を要する。

(7)

' 各座標を変換して表示する 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 Form1.picDisp.Line (Xa, Ya)-(Xb, Yb), RGB(0, 0, 255) Next I

End Sub

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

' サブプロシージャレベルでローカルな変数を宣言する Dim C As Single, S As Single

Dim D As Integer, I As Integer Dim J As Integer, K As Integer Dim N As Integer, T As Integer

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

For I = 0 To 7

If Form1.optBaseDegree(I).Value = True Then K = Val(Form1.optBaseDegree(I).Caption) Exit For

End If Next I

For I = 1 To (360 / K - 1)

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

N = T * I + J

If N > MAX Then

MsgBox "データが大き過ぎます!" & vbCrLf & _ "回転の基本角度を変えて遣り直して下さい" 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 If J = T Then X1(N) = X2(T * I + J - 1) Y1(N) = Y2(T * I + J - 1) 標準モジュールからフォー ムのオブジェクトを操作す る場合、必ず所属するフォー ムを指定する。 Call は、Sub プロシージャ等 に制御を渡すステートメン ト。引数が必要なプロシージ ャを呼び出す場合は、引数リ ストを括弧で囲む必要が有 る。 此の様に、変数の宣言は、カ ンマ(,)で区切り,複数並 べて指定する事も出来る。 此処では,どのオプションボ タンが選択されて居るかを 判定して居るが、判定が付け ば、残りの判定は不要なので Exit For でループから強制 脱出して居る。 長いステートメントは、行継 続文字(スペースとアンダー スコアの組み合わせ)を使用 して、複数行に分割して入力 する事が出来る。 此処では2種類の算術演算 子が使用されて居る。 +:加算(足す) *:乗算(掛ける) 優先順位は、数学と同じく乗 算が加算よりも高く、先に計 算される。 此の場合のイコール(=)記 号は、比較演算子で有る。 A=B : AとBは等しい 配列の要素番号(添字)には 変数だけでなく、変数を含む 計算式も指定出来る。

(8)

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(X As Single, Y As Single, 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 此の様に、複数のステートメ ントをコロン(:)で区切り 1行に複数記述する事も出 来る。 此の場合のイコール(=)記 号は、代入演算子で有り、右 辺の値を左辺に代入する働 きをする。 点 P(x,y,z)をX軸の周りに角 度αだけ回転させた時の点 P’(x’,y’,z’)は三角関数を用い て下記の様に表す事が出来 る。 x’ = x

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

(9)

Clsメソッドに依る画面の消去 実行時に作成したグラフィックやテキストをクリアするメソッド Object.Cls 実行時にグラフィックス関連のステートメント、又は、出力関連のステートメントで作成さ れた、フォーム、又は、ピクチャーボックス上のテキストとグラフィックスをクリア(消去) する。 但し、Picture プロパティで設定した背景のビットマップや、デザイン時にフォームに配置したコント ロールは、Cls メソッドではクリアされない。

亦、Cls メソッドを実行する前に AutoRedraw プロパティを偽 (False) に設定すると、AutoRedraw プ ロパティが真 (True) の間にフォーム、又は、ピクチャーボックスコントロールの上に配置したグラフ ィックスやテキストも、Cls メソッドではクリアされない。 此の様に、フォーム、ピクチャーボックスコントロール等のAutoRedraw プロパティを操作して、グラ フィックスやテキストを保持する事が出来る。 Cls メソッドを実行すると、オブジェクトの CurrentX プロパティと CurrentY プロパティが0に再設 定される。 PSetメソッドに依る点の描画 点を描画するメソッド

Object.PSet Step (引数1, 引数2), 引数3

フォーム、ピクチャーボックス、プリンタの各オブジェクトに対して、指定した位置に点を 描く。 引数1には、点が描画されるオブジェクト内のX座標を指定し、必ず指定する。 引数2には、点が描画されるオブジェクト内のY座標を指定し、必ず指定する。 引数3には、描画色を指定し、省略する事が出来る。 Step は、描画位置を相対位置で指定する場合に使用し、省略する事が出来る。 描画色を省略する場合は、前のカンマ(,)も省略する。此の場合,オブジェクトの ForeColor プロパ ティで設定した色で点が描画される。 機 能 書 式 解 説 機 能 書 式 解 説 グラフィックメソッド Cls グラフィックのクリア PSet 点の描画(ピクセル単位での色の設定) Point 色の取得(指定したピクセルの色の値の取得) Line 線の描画(線、矩形、塗り潰し矩形の描画) Circle 円の描画(円、楕円、円弧の描画) PaintPicture 任意位置へのグラフィックの描画)

(10)

Lineメソッドに依る直線の描画 直線、又は,矩形を描画するメソッド

Line Step(引数1, 引数2)- Step(引数3, 引数4), 引数5, 引数6

フォーム,ピクチャーボックス,プリンタの各オブジェクトに対して,指定した2点間を結 ぶ直線、又は,矩形(四角形)を描く。 引数1には、直線/矩形が描画されるオブジェクト内の始点のX座標を指定し、省略する事が出来る。 引数2には、直線/矩形が描画されるオブジェクト内の始点のY座標を指定し、省略する事が出来る。 引数3には、直線/矩形が描画されるオブジェクト内の終点のX座標を指定し、必ず指定する。 引数4には、直線/矩形が描画されるオブジェクト内の終点のY座標を指定し、必ず指定する。 引数6には、描画色を指定し、省略する事が出来る。 引数7には、オプション(矩形:B、塗り潰し矩形:BF)を指定し、省略する事が出来る。 Step は、描画位置を相対位置で指定する場合に使用し、省略する事が出来る。

始点を省略した場合は、CurrentX 及び CurrentY に依り示される位置が描画の開始点に成る。Line メ ソッドが実行されると、CurrentX 及び CurrentY プロパティは、引数に依り指定された終点に設定さ れる。此れを利用して、始点を省略し、連続線を描く事が出来る。 機 能 書 式 解 説 算術演算子 比較演算子 論理演算子 1.^ 冪乗 1.= 等しい 1.Not 否定 2.- 負数 2.<> 等しくない 2.And 論理積 3.*、/ 乗算と除算 3.< より小さい 3.Or 論理和 4.¥ 整数除算 4.> より大きい 4.Xor 排他的論理和 5.Mod 剰余 5.<= 以下 5.Eqv 同値 6.+、- 加算と減算 6.>= 以上 6.Imp 包合 算術演算子と論理演算子では、複数の演算子が使用されて居る場合には、頭に付けた番号の順序で 演算が行われる(上に書かれて居る演算子程優先順位が高い)。 描画用プロパティ DrawWidth グラフィックメソッドで描画する線の太さや点の大きさを設定する DrawStyle グラフィックメソッドで描画する線のパターンを設定する DrawMode グラフィックを重ねる時の描画方法を設定する BorderWidth ラインコントロールやシェイプコントロールの外形線の太さを設定する BorderStyle ラインコントロールやシェイプコントロールの外形線のパターンを設定する

参照

関連したドキュメント

生活介護  2:1  *1   常勤2名、非常勤5名  就労継続支援B型  7.5:1+1  *2  

(1) 学識経験を有する者 9名 (2) 都民及び非営利活動法人等 3名 (3) 関係団体の代表 5名 (4) 区市町村の長の代表

①生活介護 定員 60 名 ②施設入所支援 定員 40 名 ③短期入所 定員10名 ④グループホーム 定員10名 ⑤GH 併設短期入所 定員3名. サービス 定員 延 べ 利

印刷物の VOC排出 抑制設計 + 環境ラベル 印刷物調達の

化学品を危険有害性の種類と程度に より分類、その情報が一目でわかる ようなラベル表示と、 MSDS 提供を実 施するシステム。. GHS

設備種目 設備設置区分 機器及び設備名称 メンテナンス内容 協定書回数

名称発電機 種類-横軸回転界磁三相交流 同期発電機 容量kVA/個8250 力率%80 電圧V6900 相-3 周波数Hz50

名称発電機 種類-横軸回転界磁三相交流 同期発電機 容量kVA/個8250 力率%80 電圧V6900 相-3 周波数Hz50