(4.3)初期化
メインモジュールで、スクリーン上のドット座標(KS_image.get_xy)を取得し、シミュレーション(mirror_set.simulation)に渡します。初期化は、このドットとピンホールを通る光線(Appendix A)を決めることです。
![図6(初期化)](http://cz-cdn.shoeisha.jp/static/images/article/7447/7447_06_s.gif)
(4.4)反復処理(鏡面での反射)
ピンホールを通った光線は、万華鏡の鏡面で反射を繰り返し、最終的にオブジェクトに到達します(mirror_set.simulation)。この反射過程は、2つのステップに分けられます:
(4.4.1)光線が到達する鏡点の決定
直進した光線ベクトルが、鏡面に到達する点を求めます。技術的には、空間内の直線と平面の交点を求める問題になります(交点は、連立一次方程式の解になる→Appendix C、*2)。
シミュレーション上では、それぞれの鏡は(無限に広がった)平面として定義されます。光線と3つの鏡の間で(形式的に求められた)交点のうち、光源から最も近い点が、実際に光の到達する点になります。
![図7(光線と鏡面との交点)](http://cz-cdn.shoeisha.jp/static/images/article/7447/7447_07_s.gif)
(4.4.2)反射方向の決定
光線は、鏡面に到達した点で反射し、別の方向に進んでいきます。反射方向は、入射方向と鏡の法線ベクトルによって決まります(反射方向は、入射方向を線形変換することで求められる→Appendix D)。
![図8(反射方向の決定)](http://cz-cdn.shoeisha.jp/static/images/article/7447/7447_08_s.gif)
プログラム上は、(4.4)と次の(4.5)がループになっています(反射点/反射方向が、新たな出発点/光線方向に置き換えられる)。このループは、(4.5)で光がオブジェクトに到達したと判定されるまで繰り返されます。
(4.5)停止条件(オブジェクトに達したかどうか)、停止時の座標取得
プログラム上、オブジェクトはxy平面(z=0)に配置しました。光線は、z軸を下に向かって降りていき、z=0になったところで停止条件が満たされます(*3)。
プログラム上は、(4.4.1)の要領で、光線と鏡の交点を(形式的に)求めていき、得られた点のz座標の正負によって、停止条件を判定しています(z≤0ならオブジェクトに達した/z>0なら達していない)。オブジェクト上の到達点は、光源と(形式的に得られた)鏡面上の交点を按分することにより得られます。
![図9(停止条件)](http://cz-cdn.shoeisha.jp/static/images/article/7447/7447_09_s.gif)
(4.6)色の取得(オブジェクト)
オブジェクト上の色は、KS_object.get_colorで取得しています。到達点のRGB値と、透過率αによって色が決定されます。
![図10(オブジェクト上の到達点(万華鏡を下からみた図))](http://cz-cdn.shoeisha.jp/static/images/article/7447/7447_10_s.gif)
(4.7)色のセット(スクリーン)
(4.6)で得られた色をKS_imageに渡し、スクリーン上の出発点の色を決めます(KS_image.set_color)。
以上の初期化(4.3)から色のセット(4.7)までの処理を、スクリーン上のすべての点について行えば、万華鏡を通してみえる像が得られます。
一つ一つのステップは単純ですが、万華鏡を通してみえる像を頭でイメージすることは難しく、そんな場合にシミュレーションが効果を発揮します。
以下では応用として、万華鏡の形によって像がどのようにみえるか、いくつかの例を紹介します。