テキスト
TMLib のインストール
この演習では「TMLib」というグラフィックス用のライブラリを使用します.
受講生は予め以下のURLを参照してTMLibを正しくインストールしておいてください.
[URL] http://www.teu.ac.jp/media/~earth/TMLib/
また,「TMLib」は「Java」を前提としますので,こちらも正しくインストールしておいてください.
[URL] http://www.media.teu.ac.jp/student/JDK/
プログラムのソースコード
また,プログラムのソースコードは, ここ から取得できるので,予習をする方は利用してください.
なお,受講生には,学籍番号などを記入したものを演習時間内に配布する予定です.
画像の保存
作成した画像は,プログラムを実行し,画面に画像が表示されたときに,自動的に保存されるようになっています.
従って受講生は改めて画像を保存する必要はありません.
また,メニューの「File」→「Save」は別の形式で画像が保存されるため,絶対に使用しないでください.
数式で使える数学関数とその使用例
- 絶対値: Math.abs(double a)
- 色情報にマイナスの値を指定することができないため,数式の計算結果がマイナスになった場合には絶対値を使用してプラスの数値に変換する必要がある.
例: Z1 = Math.abs(X*X - Y*Y);
- 指数関数: Math.exp(double n), Math.pow(double a, double n)
- 自然底数(Math.E)のn乗,aのn乗を計算する.
例: Z1 = Math.exp(X*X + Y*Y); Z2 = Math.pow(X*X + Y*Y, 2.5);
- 対数関数: Math.log(double a)
- 自然底数(Math.E)を底とする対数を計算する.
例: Z1 = Math.log(X*Y);
- 平方根: Math.sqrt(double a)
- 例: Z1 = Math.sqrt(X*Y);
- 三角関数: Math.sin(double a), Math.cos(double a), Math.tan(double a)
- 弧度法(180度がπ(Math.PI)という数値で表現される)によって与えられた角度に対する,正弦,余弦,正接を計算する.正弦と余弦の値は-1〜1で変化する.
例: Z1 = 100.0 * Math.sin(X*Math.PI/180.0) + 127.0;
- 三角逆関数: Math.asin(double a), Math.acos(double a), Math.atan(double a)
- 正弦,余弦,正接の逆計算をする.
例: Z1 = 80.0 * Math.asin(X/200.0);
注意: 数式を作る際には,変数が変化した時に,0で割り算をするという事態が発生しないように気をつけてください.
ヴューポート変換
スクリーン座標系の指定領域に,対象となる画像を表示するための処理をヴューポート変換という.
ディスプレイ画面上の指定された矩形領域をヴューポートといい,原図形のうち表示したい部分を指定する矩形領域をウィンドウという.
ヴューポート変換を行うため,コンピュータの画面(スクリーン座標系)における1ピクセルが,数式の世界(ワールド座標系)のどんな値に対応するのかを計算しておく必要がある.
コンピュータの画面(スクリーン座標系)の座標(x)に対応する数式の世界(ワールド座標系)の座標(X)は,始点(sX)に,1ピクセルあたりの長さ(dX)と座標値(x)を掛けたものを足し合わせることによって計算することができる(Yも同様).
型変換
なお,括弧書きの変数名「(double)」はキャスティング(型変換)というもので,
もともと整数型(int)で定義された「vsize」や「x」や「y」を臨時に実数型(double)として扱うためのもので,
音楽でいうところの臨時記号のようなものである.
コンピュータでは型の違う変数同士の演算は直接行えないため,このようにして型を合わせてから計算をする必要がある.
剰余パターン
計算結果を色情報に変換する計算をしている.
ここでは,例として「R = (int)Z1 % 256」という数式を適用している.
まず,実数の変数Z1を整数に型変換している.
この段階で小数点以下は四捨五入されて「Z1 = 40141」と値が多少変化する.
これを丸め誤差という.
次に,256で割った余りを計算する.この値は0〜255の範囲を繰り返すパターンを形成する.
CGによる画像生成
コンピュータが扱う図形や画像の情報は数値化されたディジタルデータであり,そのデータが,対応するコンピュータディスプレイ上に図形や画像となって表示される.数値データをもつ画素とその集合であるこのような画像をディジタル画像という(ディジタル画像の詳細は,本テキスト「ディジタル画像処理の基礎」を参照).2次元の図形を作成するためのソフトウェアは数多く市販されており,目的に応じて線や面の情報をそれらの関係で扱うドロー系や画素単位で扱うペイント系などを使って容易に画像の作成や変換を行なうことが出来る.しかし,本演習ではこのような既成のソフトウェアは用いないで,ディジタル画像の最小単位である画素の色を決定するプログラムを考えながら,画像作成の基礎を学ぶ.作業は描画領域の画素の位置情報(座標値)を使って何らかのルールや数式に当てはめ,割り出された数値を色の値にするといった単純なものだが,生成される画像は既成のソフトウェアでは作りにくい,あるいは不可能なパターンとなる.
座標と座標系
2次元平面上の点の位置は直交座標系(xy座標系)のx値とy値で表し,3次元の場合はx軸およびy軸に直交するもう1本の軸であるz軸が加わる.CGの場合,扱う図形の特質や表現の条件によって,さまざまな座標系が用いられている.特に3次元図形の場合は個々の立体固有の座標系であるローカル座標系,それらを配置するワールド座標系,さらに3次元データを2次元データに投影変換する視野参照座標系,ディスプレイに表示するときのスクリーン座標系などがある.2次元図形を対象とする本演習では,ディスプレイの左上を原点とするスクリーン座標系を基本とし,y軸は下方に向かって正となるものとする.
数式がつくるかたち
画像の作成には何らかのかたちで数学的処理がなされるため,数式はつきものだが,ここでは数式は直接かたちを作すための道具として利用する例を体験する.方程式と聞くと直線や曲線が描かれたグラフを思い出すが,これは式の値を座標値として平面上に表現したものであり,数式がつくるかたちのひとつである.ここでは式の値を座標値ではなく色情報として用い平面を彩色してみる.課題2のプログラムはZ1 = X2 + Y2を用いて作成したものだが,画面中央を中心とした同心円が波紋のように広がり,周囲にはいくつもの小さな波紋が見られる.このように何らかのプロセスで求めた値を色に置き換えて表示する手法は,フラクタル・パターンとして知られるマンデルブロ集合やジュリア集合を可視化する際に用いられている.数式がつくりだすパターンは,数式を適用する座標系(ワールド座標系)上にあり,スクリーン座標系とは一致していない場合が多い.課題2のプログラムのパターンも図の中心が原点(0, 0)であり,画面の左上を原点とするスクリーン座標系とは一致していない.この場合,表示したい画像をスクリーン座標系に変換する必要がある.
アルゴリズム (プログラム2の場合)
- X: 描画領域のX座標値(変数)
- Y: 描画領域のY座標値(変数)
- Z1: 計算結果
- 数式を決める.ここではZ1 = X2 + Y2を使用.
- 数式を適用する平面を設定する.課題2のプログラムの場合は網掛け表示した矩形で,(sX, sY)を始点とし,(-100, -100)が(X, Y)それぞれの初期値になる.数式に座標値を代入すると,Z1 = (-100)2 + (-100)2 = 20000となる.
- Z1の値を色データとするが,0〜255の範囲におさめるため256で除算し,その剰余を色データとする.この剰余値が画素(X, Y)の色になる.
- ビューポート内の全ての画素について2および3の処理を繰り返す.
剰余を用いているため,0〜255までの数値が規則的に繰り返される.したがって生成されるパターンも規則性を帯びたものになる.
|