2000.4.26 KPC 情報技術科 関谷
レポートには、結果の図をどのように作図したかを説明して欲しい。(プログラム名やその内容、実行でのデータなどです。前回のプログラムについては、プログラム名やパラメータを図の上部に表示するように変更したので、再度、コピーして実行してみること。)
Wordなどに直接に画面のPrintScreen(クリップボード)を貼り付けると、印刷時に背景が真っ黒になってしまう。描画した線などが分かりにくい。
そのため、一度ペイントに貼り付けた後で、色の反転をしてそれを再度コピーして、Wordに貼り付けることをした。
しかし、これは面倒である。slsの長方形を排他的論理和で塗りつぶす関数rectfillXOR()を最後に呼べば、色の反転をすることが出来る。そこで、ファイル・サーバのslsを使ったC言語のプログラムは、すべて、この方法に変更したものをコピーしている。
2次元座標変換(対称移動、平行移動、回転移動、拡大・縮小)式は、河西の8.2節に解説がある。
これらの変換式については、変換前のある点(x0,y0)を原点からのベクトルの成分表示と考えると、変換後の成分(x、y)は、前のそれぞれの成分ごとの回転による座標を加えることで求まる。これは、三角関数の加法定理を使うものよりも分かりやすい。なお、2Dでの回転は、3Dでのz軸回りの回転に相当する。
2次元座標変換は、Glibwv.hをもとに、河西の8.2節-C言語での関数mirror(),rotate(),multi()などを自作する-で実現できた。
これに対して、Java2Dでは、AffineTransformクラスとして、準備されており、単にそれらのメソッドを指定するだけで使えるようになっている。
(中山茂著、Java2グラフィックスプログラミング入門、技術評論社、1999.3、pp.228-236)
小生の移植では、図8.4での仮想物理座標系(原点をスクリーン左下)を使わず、原点は左上隅として、ビューポートの左下隅と右上隅を指定するようにしている。
ビューポートを変えることで、同じ図形データでの描画処理をしても、表示される大きさを変えることが出来る。(例題57での実行例を参照のこと。)今回の3次元処理での例のように、違った処理結果の表示も並べて表示できる。
このように、Glibwv.h自体が、2次元座標変換を利用している。これらの自作関数を準備しておけば、それを使うことで、図形処理が相当に便利になる。
3次元空間にある物体を紙やCRTという2次元平面に作画するには、透視図法や軸測投影などを使う。
回転角の正方向は、各軸の正方向に向かって右ねじを回す向きとし、x軸、y軸、z軸回りの回転角をそれぞれ、α、β、γとする。回転の順序をy軸→x軸→z軸の順に行うものとすると、点(x、y、z)は、次のように変換される。 (これも、3次元空間のベクトルの成分表示と考えて、それぞれの成分の計算を加えることで求まる。) y軸回りにβ回転 -> x1=xcos(β)+zsin(β) y1=y z1=−xsin(β)+zcos(β) x軸回りにα回転 -> x2=x1 y2=y1cos(α)−z1sin(α) z2=y1sin(α)+z1cos(α) z軸回りにγ回転 -> x3=x2cos(γ)−y2sin(γ) y3=x2sin(γ)+y2cos(γ) z3=z2
これは、上の結果の(x3、y3、z3)のうち、z3を無視すること。 したがって、上の示した式のz2、z3は不用となる。
家のデータは、構造体配列に格納している。 3つの回転量は、角度でキーインする。 3種のパラメータの投影図を、スクリーンでは、横に並べて表示する。
例題59 家のデータを軸測投影で表示(3 View)
この一番右の図では、家を床下から見ているのであるが、最初は、そのようには見えないであろう。ワイヤーフレーム表示でなく、光を当てて、壁面を考慮した陰線消去などをしないと、なかなかに、正確には見れないことが分かる。
軸測投影では、投影面に対し平行光線を当てて投影した。透視では、ある点に向かって収束する光を当てる。この点を投影中心(消失点)と呼び、z軸上にとることにする。これの絶対値が大きければ、遠近感が小さくなる。 逆に、立体に近ければ、遠近感が強調される。 透視では、投影中心に対する立体の位置が異なると、立体の見え方が変わる。立体が投影中心より上方にあれば、立体を見上げるように透視される。 透視では、立体の回転に加え、平行移動の操作が加わる。 y軸回りのβ回転と、x、y、z方向の平行移動量をl、m、nとし、投影中心をz=−vpとする。また,変換後の点は、z=0平面(x−y平面)に透視するものとする。 変換式は、つぎのようになる。 まず、回転と平行移動により、 x1=xcos(β) + zsin(β) +l y1=y+m z1=−xsin(β) + zcos(β) +n が得られ、これをz=0平面に透視すると、つぎのようになる。 px=x1/h py=y1/h ただし、h=(z1+vp )/ vp =−xsin(β)/vp+zcos(β)/vp+n/vp+1.0 この透視は2点透視といわれ、最も使われる方法である。β=0のときは単点透視となる。
練習問題59 家のデータを透視で表示(3 View)
例題を参考に、皆さんの描きたい図形データなどを用意して、プログラムを改造し、作品を作りなさい。
1)WordあるいはFrontPageExpressに、考察、ソースリスト、実行グラフィックス画面を貼り付けたものを「Webページ」の形式(拡張子はhtml)で、各自のMyHomeに、cg_03などの名前をつけて保存する。
2)情報系Webサーバが、Turbolinuxで再構築されたので、そのWebページにindex.htmlからのハイパーリンクを作って、登録する。(注を参照のこと。概略は以下のとおり。))
htmlファイルは、Wordなどで、Webページとして保存する(前述)。そして、ホームページindex.htmlから、今回のレポートページへのリンクを張る。それらを各自のWebサーバのホームディレクトリの直ぐ下のpublic_htmlフォルダ(サブディレクトリ)にftpすること。
注) Webページの作り方については、関谷のWebページの「個人ホームページの作成と更新」のページを参照のこと。(Webサーバの再構築が完了した。)
(なお、ローカルのホームページフォルダは、c:\でなく、各自のサーバのホーム(H:)ドライブに作ること。)
作業としては、public_htmlフォルダの作成とそこでのindex_htmlファイルの変更−名前を表示したり、今回のページに対するリンクを作る−が必要になる。