Comments
Transcript
メディア処理演習 CG: 課題 3:Excel によるコンピュータグラフィクス 1
メディア処理演習 CG: 課題 3:Excel によるコンピュータグラフィクス 1 1. Excel 操作の基本 ① 本演習では,Excel2010 の利用を前提としま す.Excel2010 を起動すると図 1.1 のような画面が表 ③ 示されます. タブとリボン ② 数式バー ④ セル 図 1.2 Excel ファイルの作成 名前ボックス (2) 行列 A, B を定義する(図 1.3) ①セル A1 を選択し「A」と入力する ②セル A2 に「1」,セル A3 に「3」,セル B2 に「2」, ワークシート セル B3 に「4」を入力する. ③セル C1 を選択し「B」と入力する シート見出し ④セル C2 に「5」,セル C3に「6」と入力する. 図 1.1 Excel の起動画面 コンピュータグラフィクス技術を学ぶにあたり, 行列演算は必要不可欠です.ここでは,Excel に組み 込まれている行列演算関数を使って見ましょう. 図 1.3 行列AとBの定義 1.1 行列積 MMULT 関数を使って行列積を計算することがで きます.以下の行列 A, B の行列積を MMUL 関数を (3) 行列積 AB を計算する 利用して計算しましょう. " " ! ! 1 2 5 , B= . A= 3 4 6 ①セル D1 を選択し,「AB」と入力する ②行列積 AB を出力するセルの範囲 D2:D3 をマウス ドラッグにより指定する (1) Excel ファイルを作成する(図 1.2) ①ファイルタブを選択 ②「新規作成」を選択 ③「空白のブック」を選択 ③数式バーに「=MMULT(」と入力し,ドラッグによ ④「作成」ボタンをクリック り行列Aを指定する 1 ④続いて「,」と入力し,ドラッグにより行列Bを指 定する. 1.3 行列の名前を使った計算 セル範囲に名前をつけることにより,行列計算を 行うときの数式バーへの計算式の入力が容易になる. 例として 1.1 で示し行列 A, B の積を考えよう. ⑤最後に「)」と入力し,Ctrl キーと Shift キーとを押 (1) Excel ファイルを新規作成し,1.1 と同様に A, B を しながら Enter キーを押す. 定義する 1.2 転置行列 (2)行列 A, B にそれぞれ名前「A」と「B」をつける. 転置行列の計算には TRANSPOSE 関数を利用する. 行列 A の転置を計算してみよう. ①セル範囲 A2:B3 を選択し,名前ボックスに「A」と 入力する. (1)前節と同様にして Excel ファイルを作成する (2)前節と同様にして行列Aを定義する ②セル範囲 C2:C3 を選択し,名前ボックスに「B」と 入力する. (3) 転置行列 AT を計算する ①セル C1 を選択し,「A transpose」と入力する. ②転置行列 AT を出力するセルの範囲 C2:D3 をマウス ドラッグにより指定する. (2) 行列積 AB を計算する. ①セル範囲 D2:D3 を選択する. ②数式バーに「=MMULT(A,B)」と入力し,Ctrl キー と Shift キーとを押しながら Enter キーを押す. ③数式バーに「=TRANSPOSE(」と入力し,ドラッグ により行列Aを指定する. (演習 1.1)1.2 で計算した行列 A の逆行列と基の行 ④続いて「)」と入力し,Ctrl キーと Shift キーとを押 列 A の積を,MMULT 関数を用いて計算し,その結 しながら Enter キーを押す. 果が単位行列となることを確認しよう. 2 2. VBA プログラミング VBA とは Visual Basic Application の略であり,Excel など Microsoft Office の各アプリケーションの処理を 自動化するためのプログラミング言語です.VBA を 使ってプログラミングすることにより, Excel の標 準機能ではない処理や標準機能だけでは実現できな コードウィンドウ い複雑な処理をユーザの機能として実装することが できます. 2.1 Visual Basic Editor の起動 (4)プログラムを実行する Excel 上で VBA プログラミングをするために,Visual ①「表示」から「Microsoft Excel」をクリックし, Basic Editor(VBE)を使用します.VBE を使ってプ Excel の画面に切り替える. ログラムを記述し,実行する手順は以下の様になる. ②「開発」タブを選択し, 「マクロ」をクリックする. (1) VBE を起動する ③VBE で作成したプログラム名(Test)を選択し, 「実 ①「開発」タブを選択し, 「Visual Basic」をクリック 行」ボタンをクリックする.実行すると,以下の様 する. な画面が表示されます. 「開発タブ」が無い場合はファイルタブのオプショ 2.2 プロシージャ ンをクリックし, 「リボンのユーザ設定」内にある「開 Excel で VBA を使ってプログラミングを行う際に 発」にチェックを入れて下さい. は,プロジェクトという単位でアプリケーションが (2)標準モジュールを追加する 管理されます.プロジェクト内では複数のモジュー ①挿入をクリックし「標準モジュール」をクリック ルを定義することができます.前節で使用した「標 する. 準モジュール」もその 1 つです.モジュールは更に 複数のプロシージャから構成されます(図 2.1).VBA プログラミングでは,複数のプロシージャを連携さ せ,モジュールとして適切に分類・管理することで 管理が簡易になり,理解しやすくなります.VBA に は役割によって Sub プロシージャ,Function プロシー (3) コードを記述する ジャなどがあります. ①コードウィンドウ内に以下のコードを記述する. Sub Test() MsgBox "Hello" End Sub 3 MsgBox "a + b = " & c End Sub プロジェクト モジュール ' Function プロシージャの例 Function Sum(a, b) c=a+b Sum = c End Function モジュール プロシージャ プロシージャ プロシージャ プロシージャ 2.3 変数とデータ 2.3.1 変数 VBA では, Dim を用いて数値や文字列などの変 数を以下の様に定義できます. 図 2.1 プロジェクトとモジュールとプロシージャの Dim 変数名 関係. value という名前の変数を定義し,その変数に①を代 2.2.1 入する場合は以下の様になります. Sub プロシージャ Dim value value = 1 Sub と End Sub で囲まれた命令を実行するプロシ ージャです.以下に Sub プロシージャの例を示す. MsgBox はダイアログボックスに文字を表示する関 さらに,変数に対してデータ型を指定して定義する 数であり,「'」で始まる行はコメント行です. 場合は,以下の様になります. ' sub プロシージャの例 Sub Test() a=1 b=2 Dim 変数名 As データ型 整数型(Integer 型)の value という名前の変数を定 義する場合には以下の様になります. ' a と b の和を計算しmその結果を c に代入する c=a+b Dim value As Integer '加算結果 c を表示する MsgBox "a + b = " & c End Sub 表 2.1 おもなデータ型 2.2.2 Function プロシージャ Function と End Function で囲まれた命令を実行 するプロシージャであり,実行した後の結果を返し ます.以下に Function プロシージャを李使用した例 を示します. ' Function プロシージャの利用例 Sub Test() a=1 b=2 データ型 名称(値の範囲など) Boolean ブール型(True または False) Byte バイト型(0 ~ 255) Integer 整数型 Long 長整数型 Single 単精度浮動小数点型 Double 倍精度浮動小数点型 String 文字列型 Variant バリアント型(あらゆるデータを格納 する) ' Sum プロシージャを呼び出し a と b の和を計算 する Object c = Sum(a, b) オブジェクト型(ワークシートやセル などのオブジェクトを格納する.) ' 加算結果 c を表示する 4 2.4.2 Select 文 VBA プログラミングで用いられる主な型を表 2.1 に 示します.データ型指定を省略した場合は,全ての Select 文を利用して処理を分岐することができる. データ型に対応した Variant 型とみなされます. If 文とは違い,条件判断を行う 1 つの変数に対して, 複数の条件を指定した場合に以下の様に記述する事 2.3.2 配列 ができます. Select Case 変数 Case 条件1 処理1 Case 条件2 処理2 Case Else 処理3(何れの条件も満たさなかった場合) End Select 配列を定義する場合,要素を指定して以下の様に 宣言します. Dim 変数名(要素数) As データ型 要素③の整数型の配列 values を定義する場合には以 下の様になります. Dim values (3) As Integer value が 90 以上なら「よくできる」,60 以上なら「ふ また,配列にデータを代入する場合,以下の様に つう」,それ以外では「がんばろう」と表実場合,以 「values(要素番号)」として要素ごとに値を指定する 下の様に記述します. ことができます. Select Case value Case Is >= 90 MsgBox "よくできる" Case Is >= 60 MsgBox "ふつう" Case Else MsgBox "がんばろう" End Select Dim values (3) As Integer values (1) = 1 values (2) = 3 values (3) = 5 2.4 制御文 2.4.1 If 分 2.4.3 For 文 If 分を利用することによって,処理を分岐するこ 指定した回数だけ処理を繰り返すことができます. とができる.処理を満たすときと見たさないときで 書き方は以下の様になります. 別の処理を行う場合は以下の様に記述する. For カウンタ変数 = 初期値 To 最終値(Step 加算数) 繰り返し実行する処理 Next (カウンタ変) If 条件 Then 処理1 Else 処理2 End If 1 から 10 までの奇数和(sum)を計算する場合は以 下の様になります. 複数の条件でそれぞれ別の処理をする場合は以下の sum = 0 For i=1 To 10 Step 2 sum 0 sum + i Next i MsgBox "sum = " & sum 様に記述する. If 条件1 Then 処理1 ElseIf 条件2 Then 処理2 Else 処理3 End If 2.4.4 Do 文 処理を繰り返すことができます.For 文と異なり, 条件式によって処理を繰り返すかどうかを判断しま 5 す.Do 文には,条件を満たす間繰り返し実行する Do 2.5.2 セルの操作 While 文: Do while 条件 繰り返し実行する処理 Loop Range プロパティまたは Cell プロパティを使って 参照することができます. と条件を満たさない間繰り返し処理を実行する Do Worksheets(ワークシート名).Range(セル) Until 文: Worksheets(ワークシート名).Range(セル範囲) Do Until 条件 繰り返す実行する処理 Loop Worksheets(ワークシート名).Cells(行番号,列番号) があります. また,参照したセルの Value を読み込み・書き出し することによってセルに指定された値の読み込み, 2.4.5 Exit 文 セルへの値の代入ができます.以下に使用例を示し 処理を途中で終了することができます.終了する ます. 'ワークシート Sheet1 のセル A1 に 10 を代入 Worksheets("Sheet 1").Range("A1").Value = 10 処理に応じて次の様にして Exit 文を利用します. Exit Do Exit For Exit Sub Exit Function Do 文を終了する For 文を終了する Sub プロシージャを終了する Function プロシージャを終了する 'ワークシート Sheet1 のセル A1:B2 に 10 を代入 Worksheets("Sheet 1").Range("A1:B2").Value = 10 'ワークシート Sheet1 のセル C2 に 10 を代入 Worksheets("Sheet 1").Cells(2, 3).Value = 10 'ワークシート Sheet1 のセル C2 に 10 を代入 Worksheets("Sheet 1").Cells(2, "C").Value = 10 2.5 VBA によるワークシートおよびセルの操作 2.5.1 ワークシートの操作 ワークシート名またはインデックス番号を指定し 'ワークシート Sheet1 のセル A1 の値を読み込む X = Worksheets("Sheet 1"). Range("A1").Value て,以下の様にワークシートを参照することができ る. 参照したセルの Interior.Color に数値(RGB 値)を指 Worksheets(ワークシート名) 定することで,セルの色を変更することができます. Worksheets(インデックス番号) RGB 値は赤,青,緑それぞれ 0 ~ 255 の範囲の値を もちます. また,ワークシートの選択は,Select メソッドを利 RGB 値 = RGB(Red, 用します.Select メソッドは True, False を引数とし, True を指定したときは,現在のワークシートを解除 Green, Blue) 使用例は以下の様になります. して指定したワークシートを選択し,False を指定し 'ワークシート Sheet1 のセル A1 の色を赤(255,0,0) Worksheets("Sheet 1").Cells(1, 1).Interior.Color = RGB( 255, 0, 0) たときは,選択を解除せず指定したワークシートを 選択します.指定しない場合は,True とみなされま す.以下に使用例を示します. RowHight(行高)および ColummWidth(列幅)を指定す 'ワークシート Sheet 2 を選択 Worksheets("Sheet 2").Select ることによって,セルのサイズを変更することが記 できます.特に,ワークシートの 1 行目および 1 列 'ワークシート Sheet 1 を選択し,その選択を解除せず Sheet 2 を選択する Worksheets("Sheet 1").Select Worksheets("Sheet 2").Select False 目を変更することで,ワークシート内の行高,列幅 を一度に変更することができます. 6 行高に指定する値は文字の大きさ(ポイント),列幅 下の様に記述できます. s x 0 0 s y S = 0 0 0 0 に指定する値は標準フォントの数字の文字数です. 3 次元空間での回転には様々な表現方法があるが,こ 以下に例を示します. こでは最も簡単な軸まわりの回転について考える.x 'ワークシート Sheet 1 の列幅を 5(数字 5 文字文) Worksheets("Sheet 1"). Rows(1).ColumnWidth = 5 軸まわりの回転行列 Rx, y 軸まわりの回転行列 Ry, z 軸 Worksheets(ワークシート名).Rows(1).ColumnWidth Worksheets(ワークシート名).Columns(1).RowHeight 0 0 sz 0 0 0 0 1 , (3.2) まわりの回転行列 Rz はそれぞれ回転角を θ x , θy , θz と 'ワークシート Sheet 1 の行高を 18(18 ポイントの文 字高) Worksheets("Sheet 1"). Columns(1).RowHeight = 18 すると以下の通りになります. 0 0 1 0 cos θ − sin θ x x R x = 0 sin θ x cos θ x 0 0 0 0 0 0 1 , く塗りつぶす.「3.1.xls」を完成させなさい. cos θy 0 Ry = − sin θy 0 0 0 0 1 , 3. 幾何変換 cos θz sin θ z Rz = 0 0 0 0 0 1 . (演習 1-1)セル範囲 A1:A20 に 1 から 20 までの自 然数を入力し,3 の倍数又は3のつく数値のセルを赤 表示対象となるデータのスケーリング(拡大・縮 0 sin θy 0 0 0 cos θy 0 0 − sin θz cos θz 0 0 0 0 1 0 (3.3) 小),平行移動,回転操作は幾何変換と呼ばれ,行列 演算をもとに計算されます. 3.2 Excel による幾何変換 3.1 合成変換 1 章で述べた行列演算を用いて3次元空間上の点 スケーリング,平行移動,回転を統一的に扱うこ の幾何変換について確認しよう.新規ファイルを作 とによって,スケーリングと平行移動,回転と平行 成した後,以下の手順に従って幾何変換用のワーク 移動といった複数の変換をまとめて計算することが シートを作成します. できます.これを合成変換と言います.スケーリン (1) ワークシートを準備する グや回転は行列の積で表される一方で平行移動はベ ①シート見出しをダブルクリックする クトルの和として計算されるため,点の座標に1次 ②ワークシート名を「Transformation」とする. 元加えた( x, y, z, 1 )という座標(同次座標)を考えま す.(x, y, z) を x 軸方向に tx, y 軸方向に ty, z 軸方向に tz 傾向移動するための平行移動行列 T は以下の様に表 すことができます. 1 0 T = 0 0 0 1 0 0 0 0 1 0 tx ty tz 1 . (2) 幾何変換パラメタを定義する (3.1) ①セル B2 に「After transformation」と入力する. ②セル B3 に「scaling」と入力し,セル C3, D3, E3 に 同様にして,x 軸方向の倍率 sx, y 軸方向の倍率 sy, z スケーリングパラメータ sx, sy, sz の初期値 1, 1, 1 を 軸方向の倍率 sz,を用いて,スケーリング行列 S は以 入力する. 7 ③セル B4 に「transformation」と入力し,セル C4, D4, E4 に平行移動パラメタの初期値 0, 0, 0 を入力する. ④セル B5 に「rotation」と入力し,セル C5, D5, E5 に 回転パラメタ θ x , θy , θz の初期値 0, 0, 0 を入力する. ただし,指定する角度の単位は度とする. (3) パラメタの定義領域を編集する ①セル範囲 B2:E5 を選択する. ②「ホーム」タブの「フォント」から「罫線」アイ コン横の小三角形をクリックする. ③表示されている罫線の中から「外枠太罫線」を選 (4) スケーリング行列 S を定義する 択する. ①セル L2 を選択し,「S」と入力する. ②下表のようにセル範囲 L3:O6 に値を入力する. L M N O 3 =C3 0 0 0 4 0 =D3 0 0 5 0 0 =E3 0 6 0 0 0 1 ③セル範囲 L2:O6 および L2:O2 に「外枠太罫線」を かける ④セル範囲 L3:O6 に対し, 「灰色(白,背景1,黒+ 基本色 25%)」をつける ④同様にして,セル範囲 B2:E2 および C3:E5 を選択 し,「外枠太罫線」をかける ⑤セル範囲 C3:E5 を選択し, 「フォント」から「塗り つぶし色」アイコン横の小三角形をクリックし, 「黄」 を選択する. (5)平行移動行列 T を定義する ①セル P2 を選択し,「T」と入力する. ②セル範囲 P3:S6 に下表のように値を入力する. 8 P Q R S 3 1 0 0 =C4 4 0 1 0 =D4 5 0 0 1 5 0 0 0 表 3.1 回転行列 Rx AB AC AD AE 2 =COS(RADIANS(E5)) =-SIN(RADIANS(E5)) 0 0 =E4 3 =SIN(RADIANS(E5)) =COS(RADIANS(E5)) 0 0 1 4 0 0 1 0 5 0 0 0 1 ③S と同様に,罫線,色をつける. (7) 各行列に名前をつける ①スケーリング行列 S(セル範 L3:O6)に名前「S_xyz」 をつける ②同様にして平行移動行列 T(セル範囲 P3:S6)に名 (6) 回転行列 Rx, Ry, Rz を定義する 前「T_xyz」,回転行列 Rx(セル範囲 T3:W6),回転 ①セル T2, X2, AB2 に対して,それぞれ「R_x」「 ,R_y」, 行列 Ry(セル範囲 X3:AA6)回転行列 Rz(セル範囲 「R_z」と入力する. AB3:AE6)にそれぞれ名前「R_x」,「R_y」,「R_z」 ②下表の表に従って値を入力する.ただし,COS お をつける. よび SIN は,引数で指定される角度(ラジアン)の (8)合成変換行列 M を定義する コサインおよびサインの値を返す関数である.また, ①セル G2 を選択し,「M」と入力する. RADIANS は引数で指定される数値(度)をラジアン ②行列 S, T, Rx, Ry, Rz を組み合わせて合成変換行列 に変換する関数である. M を作成する.ここでは,Rx と Ry の積を合成変換 ③S と同様に,罫線,色をつける. として計算する.セル G3:J6 を選択し,数式バーに 表 3.1 回転行列 Rx 「=MMULT(R_x, R_y)」と入力し,Ctrl キーと Shift T U V W キーとを押しながら Enter キーを押す. 2 1 0 0 0 ③セル範囲 G2:J6 および G2:J2 に「外枠太罫線」をか 3 0 =COS(RADIANS(C5)) =-SIN(RADIANS(C5)) 0 け,G3:J6 に対して「薄い青」を色つけて名前に「M」 4 0 =SIN(RADIANS(C5)) =COS(RADIANS(C5)) 0 と入力する. 5 0 0 0 1 (9) 点 P を幾何変換する ①点 P を定義する.ここでは,点 P の座標を(8, 3, 0) 表 3.2 回転行列 Ry とする.セル B8 を選択し, 「P」と入力する.続いて セル B9~12 にそれぞれ「8」「3」「0」「1」と入力す X Y Z AA 2 =COS(RADIANS(D5)) 0 =SIN(RADIANS(D5)) 0 る. 3 0 1 0 0 ②セル範囲 B9:B12 を選択し,名前「P」をつける. 4 =-SIN(RADIANS(D5)) 0 =COS(RADIANS(D5)) 0 ③幾何変換後の点 P'の座標を計算する.セル C8 を選 5 0 0 0 1 択し,「P'」と入力する.続いてセル範囲 C9:C12 を 選択し,数式バーに「=MMULT(M,P)」と入力し,Ctrl キーと Shift キーとを押しながら Enter キーを押す. 9