3D回転体プログラム

Similar documents
3D回転体プログラム

3D回転体プログラム

ルーレットプログラム

ブロック崩し風テニス

パラパラ漫画

ブロック パニック

グラフィックス

アプリケーション

パラパラ漫画

回文作成支援プログラム

神経衰弱ゲーム

VB.NET解説

相性占いプログラム

インベーダープログラム

回文作成支援プログラム

万年暦プログラム

Userコントロール

ListViewコントロール

VB実用⑦ エクセル操作Ⅰ

ファイル操作-インターネットキャッシュ

データアダプタ概要

画像閲覧プログラム

チャットプログラム

ICONファイルフォーマット

回文作成支援プログラム

占領双六ゲーム

NotifyIconコントロール

倉庫番

バスケットボール

相性占いプログラム

Visual Basic 資料 電脳梁山泊烏賊塾 コレクション初期化子 コレクション初期化子 初めに.NET 版の Visual Basic では 其れ迄の Visual Basic 6.0 とは異なり 下記の例の様に変数宣言の構文に 初期値を代入する式が書ける様に成った 其の際 1 の様に単一の値

ファイル操作

通信対戦プログラム

神経衰弱ゲーム

ウィンドウ操作 応用

データベースⅠ

VB 資料 電脳梁山泊烏賊塾 音声認識 System.Speech の利用 System.Speech に依るディクテーション ( 音声を文字列化 ).NetFramework3.0 以上 (Visual Studio 2010 以降 ) では 標準で System.Speech が用意されて居るの

画像閲覧プログラム

ドライブは安全運転で in 滋賀♪

平成 30 年度 プログラミング研修講座 岩手県立総合教育センター

プロシード

正規表現応用

わにわにパニックプログラム

プロセス間通信

Prog2_12th

回文作成支援プログラム

回文作成支援プログラム

通信対戦プログラム

万年暦プログラム

構造体

データベース1

チア ダンス

PowerPoint プレゼンテーション

.NETプログラマー早期育成ドリル ~VB編 付録 文法早見表~

何時何処で誰が

ファイル監視

万年暦プログラム

sinfI2005_VBA.doc

Prog2_15th

ドッグファイト

PowerPoint プレゼンテーション

モグラ叩きプログラム

LogisticaTRUCKServer-Ⅱ距離計算サーバ/Active-Xコントロール/クライアント 概略   

Microsoft Word - VB.doc

ランボール

かべうちテニス

LogisticaTRUCKServer-Ⅱ距離計算サーバ/Active-Xコントロール/クライアント 概略   

PYTHON 資料 電脳梁山泊烏賊塾 PYTHON 入門 関数とメソッド 関数とメソッド Python には関数 (function) とメソッド (method) が有る モジュール内に def で定義されて居る物が関数 クラス内に def で定義されて居る物がメソッドに成る ( 正確にはクラスが

マルチメディア・音声

データベース1

GUIプログラムⅣ

通信対戦プログラム

Microsoft Word _VBAProg1.docx

草競馬プログラム

プレポスト【問題】

VB実用⑧ エクセル操作Ⅱ

Visual Studio2008 C# で JAN13 バーコードイメージを作成 xbase 言語をご利用の現場でバーコードの出力が必要なことが多々あります xbase 言語製品によっては 標準でバーコード描画機能が付加されているものもあるようで す C# では バーコードフォントを利用したりバー

グラフィックトレーニング 概要.NET のグラフィック描画は どんなことができるのでしょうか? グラフィックオブジェクトやグラフィック環境 概念を理解するためには クラスを使って馴れることが近道です 本 書に記載されているコードをカットアンドペーストして 一つ一つの機能を体験してください 前提 グラ

(Microsoft Word \203v\203\215\203O\203\211\203~\203\223\203O)

スロットプログラム

ファイル操作-バイナリファイル

1. 入力画面

(1) プログラムの開始場所はいつでも main( ) メソッドから始まる 順番に実行され add( a,b) が実行される これは メソッドを呼び出す ともいう (2)add( ) メソッドに実行が移る この際 add( ) メソッド呼び出し時の a と b の値がそれぞれ add( ) メソッド

VB実用⑩ エクセル操作Ⅳ

PowerPoint プレゼンテーション

DAOの利用

Microsoft PowerPoint - VBA解説1.ppt [互換モード]


C#の基本

エクセル詳細 アドイン

プラグイン

データベース1

VB実用⑬ 印刷Ⅲ(PrintFormメソッド)

データベースⅡ

相性占いプログラム

CodeGear Developer Camp

スライド 1

PowerPoint プレゼンテーション

ExcelVBA

万年暦プログラム

Transcription:

3D 回転体プログラム VB 2005 4 プログラムの概要 入力画面で マウスを用いて 側面より見た平面図を描きます マウスの左ボタンをクリックする事で連続線を描き 右ボタンをクリックすると新しい線を描く事が出来る 側面図が完成すると 回転の基本角度を設定して 確定ボタンをクリックすると 平面図を立体図に座標変換する 各軸の回転角度を設定して 表示ボタンをクリックすると 立体図が表示される 各軸の回転角度を変更して 表示ボタンをクリックすると色々な角度から立体図を見る事が出来る 今回の課題項目 単純変数の宣言 (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) 今回の応用項目 視点と物体 物体と表示面の距離を自由に設定出来る様にする 作成した立体画像をファイルに記録出来る様にする -1-

オブジェクト プロパティ一覧 ピクチャーボックスの 1 と 2 は同じ場所に重 ねて貼り付ける ピクチャーボックス 1 ピクチャーボックス 2 グループ 1 グループ 2 ラジオボタン 1~8 ボタン 1 ボタン 2 ボタン 3 ボタン 4 ラベル 1 テキスト 1 ラベル 2 テキスト 2 ラベル 3 テキスト 3 コントロールの種類 プロパティ プロパティの設定値 フォーム 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 -2-

コントロールの種類 プロパティ プロパティの設定値 ラジオボタン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) -3-

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

プログラムリスト ( フォームモジュール部分 ) 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 ) 此の値を変更する事に依り拡大率等を変更する事が出来る ピクチャボックスの Imege プロパティに 描画を行うキャンバスの役目をする Bitmap オブジェクトを生成して居る 実際に描画を行う Graphics オブジェクトをピクチャボックスの Image から生成して居る ' ボタン ( 入力 ) がクリックされた時の処理 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 同じ位置に2 枚重ねたピクチャーボックスを BringToFront メソッドに依り 表示するピクチャーボックスを切り替えて居る 入力画面のクリアとX 軸 Y 軸の描画を行う Enabled プロパティを False に設定する事に依り 使用出来るボタンを制限して居る ' ボタン ( 終了 ) がクリックされた時の処理 Private Sub btnfinish_click( ByVal sender As Object, ByVal e As System.EventArgs ) _ Handles btnfinish.click アプリケーションを終了する場 Me.Dispose( ) End -5- 合 Dispose メソッドに依り 正 しくプログラムをメモリから消去 して終了する事が望ましい

' ボタン ( 確定 ) がクリックされた時の処理 Private Sub btnfix_click( ByVal sender As Object, ByVal e As System.EventArgs ) _ Handles btnfix.click Call は Sub プロシージャ等に制 ' 計算ジェネラルプロシージャの呼出 Call Calculation( ) ' 使用可能なボタンの制限 btnfix.enabled = False btndisp.enabled = True 御を渡すステートメントで有る 其の時点で使用出来るボタンを Enabled プロパティに依り 使用 可と使用不可に切り替える事で誤 操作を防ぐ事が出来る ' ボタン ( 表示 ) がクリックされた時の処理 Private Sub btndisp_click( ByVal sender As Object, ByVal e As System.EventArgs ) _ Handles btndisp.click ' 表示画面の表示 picdisp.bringtofront( ) ' 表示ジェネラルプロシージャの呼出 Call Display( ) 同じ位置に2 枚重ねたピクチャーボックスを BringToFront メソッドに依り 表示するピクチャーボックスを切り替えて居る ' 入力画面でマウスボタンが押し下げられた時の処理 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 picinput.refresh( ) ElseIf e.button = Windows.Forms.MouseButtons.Right Then ' 右ボタンが押し下げられた場合 Flag = False End Class 引数の e には マウスイベントに 関する情報 ( マウスボタンの種類 やマウスポインタの位置 ) が格納 されて居る 赤いペンで直線を描画して居る 描画後は Refresh メソッドで再 描画しないと 描画結果が反映さ れない マウスの右ボタンがクリックされ た場合は 描画フラグを False に 設定し 非描画モードにする 此処では マウスイベントに依るマウス座標の取得と描画メソッドに依るグラフィックスの描画を主題として居る為 平面座標を立体座標に変換する等の部分は 標準モジュール kaitentai_mod.vb に既に入力された物を組み込んで使用する 標準モジュールは 通常 アプリケーションの他のモジュールで共通に使う為の宣言やプロシージャを記述する為に使用する -6-

プログラムリスト ( 標準モジュール部分 ) Module kaitentai_mod ' グローバルな定数の宣言 Public Const MAX As Integer = 1000 Public Const DEG As Single = 3.14159 / 180 此処で Public 宣言した定数は 総 てのクラスの総てのプロシージャ で参照する事が出来る ' グローバルな変数の宣言 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 望ましい 此の場合定数 MAX の 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 此処で Public 宣言した変数は総てのクラスの総てのプロシージャで値の参照と設定を行う事が出来る 此処で宣言した変数は宣言したプロシージャ内でしか値の参照と設定を行う事が出来ない 標準モジュールからフォームモジュールを操作する為の変数を設定して居る 回転体を描画する為のピクチャボックスを基に Graphics オブジェクトを生成して居る 何度も使用される値は 其の都度計算するのではなく 予め計算した結果を変数に格納して置くと実行速度を上げる事が出来る 特に ループ内で複雑な計算を行うと実行速度が下がるので 注意を要する Call は Sub プロシージャ等に制御を渡すステートメント 引数が必要なプロシージャを呼び出す場合は 引数リストを括弧で囲む必要が有る -7-

' 平面座標を立体座標に変換するジェネラルサブプロシージャ 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 不要なので Exit For でループか ら強制脱出して居る 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 ) Sin や Cos 等の算術関数は Math N = T * I + J クラスで定義されて居る If N > MAX Then MsgBox( " データが大き過ぎます!" & vbnewline & _ " 回転の基本角度を変えて遣り直して下さい " ) Exit Sub X1( N ) = Z1( J ) * S + X1( J ) * C 此処では2 種類の算術演算子が使 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 -8-

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 ) 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 ) Next J Next I Cnt = N ' 座標を変換するジェネラルサブプロシージャ Public Sub Convert( ByVal X As Single, ByVal Y As Single, ByVal Z As Single ) ' サブプロシージャレベルでローカルな変数の宣言 Dim X3 As Single 点 P(x,y,z) をX 軸の周りに角度 α Dim X4 As Single だけ回転させた時の点 P (x,y,z ) Dim Y3 As Single は三角関数を用いて下記の様に表 Dim Y4 As Single す事が出来る Dim Z3 As Single x = x Dim Z4 As Single y = ycosα - zsinα Dim TT As Single z = ysinα + zcosα ' 各座標の変換 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 Module Int 関数は 引数を超えない最大の整数を返す関数で有るが 正の値を指定する時には 単に整数部分を返す関数と考えて差し支え無い -9-

イベントハンドラの 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 で知る事が出来る -10-