マッピングデータ等に使えるかも知れませんので、算数を使って星形(☆)を描いてみたいと思います。使うのは、Xi-TRACEとOLIVE+で使用可能なmodelaというスクリプト言語です。
まず、フリーハンドで☆を描く時、大抵の方は、一筆書きしやすい、以下のような図形を描くのではないでしょうか?
五芒星(ペンタグラム)と言うそうです。まずは、このペンタグラムから描いてみます。
ペンタグラムを観察してみると、5つの頂点を持ち、頂点を円周上に等間隔で配置すれば良いようです。
半径rの円周上の頂点座標は、角度θを使って以下の式で計算できます。
x = r * cos θ
y = r * sin θ
頂点は円周を5等分していますので、一周で360°であることを考えると、360/5=72°毎に配置します。さらに、線分は頂点1から隣の頂点2ではなく、一つ飛ばした頂点3へ引かれています。頂点3の次も一つ飛ばして頂点5、頂点5→頂点2、頂点2→頂点4、頂点4→頂点1で最初の頂点1へ戻るまで、都合、2周していることになります。よって、ペンタグラムを描くプログラムは以下となります。
idx=0;
while (!(idx>360*2))
{
x2=rr*cos (idx/180.*PI);
y2=rr*sin (idx/180.*PI);
line x1,y1,x2,y2, cp;
x1=x2;
y1=y2;
idx=idx + 360/5;
}
Xi-TRACEデータ名:draw_pentagram.xitr
ペンタグラムという星形が描けましたので、これで終わりで良いのですが、もう一つ別な方法でも試してみます。以下のように、星形の突き出した頂点を通る円と五角形、凹んだ頂点を通る円と五角形を書き込んでみました。
すると、五角形が2つ、ちょうど、上下反転していることがわかります。先ほどのペンタグラムの頂点を計算したのと同じ、三角関数を使う方法で、各頂点の座標は計算できますので、適切な順番で線をつないでいけば、星形を描けそうです。
突き出た頂点は、大きな円周上で、360/5°毎に配置。凹んだ頂点の方は突き出た頂点の真ん中に置くのが良さそうなので、360/5/2°毎に、大きな円周と小さな円周上の頂点を交互に計算して、線分でつなぐと、赤線の星形が描けそうです。以下のようなプログラムになります。
Xi-TRACEデータ:draw_star.xitr
このプログラムでは、小さな円周(半径50)を大きな円周(半径100)の1/2に設定しています。
draw_star cred, fwid/2,fhei/2, 100,50;
この値を変化させると、感じの違った星形が描画できます。また、頂点の数も調整可能となっていますので、お試しください。
// 頂点の数(5で☆)
var nt=5;
折角のレイトレーシングソフトウェアですので、ここまで作ってきた星形を立体にして、レイトレーシングして見ます。先ほどのdraw_star.xitrをほとんど変えず、最小限の追加でレイトレーシングデータにしてみましょう。
draw_star.xitrは、二次元画面へ線分(line命令)で描画していましたが、レイトレーシングデータにするためには、これを三次元空間の物体に変更することが必要となります。二次元の線分を以下図のような円柱面を使って、三次元の物体に変更してみます。
二次曲面の円柱(cylinder)は、中心座標、方向、半径で決まり、無限に先まで続きます。線分にするため、上向きの平面(plane)と下向きの平面で切り取って、有限の長さにします。簡単のため、方向をz軸(0,0,1)とすると、以下のように、cylinderとplane×2のandをとることで実現できます。
and
{
plane 0,0,L, 0,0,1; // 上向き
cylinder 0,0,0, 0,0,1, R;
plane 0,0,0, 0,0,-1; // 下向き
}
L(長さ)とR(半径)がパラメータです。
Xi-TRACEデータ:star_mark.xitr
今度のデータは、レイトレーシング用の記述が入っていますので、計算実行してみてください。元のdraw_star.xitrに対して、視野面や光線源などの設定方法も追加していますが、こちらについては、「Xi-TRACE超入門」をご覧ください。
単なる「板」の様な物体で良い場合には、ポリゴンという形状で表現する方法もあります。
Xi-TRACEでポリゴンを定義するためには、poly {block}のブロック内で、頂点座標をpt命令で指定すればOKです。星形の頂点座標を計算するwhile{block}全体をpoly{block}でくくってやり、計算された頂点座標をpt命令に与えてやればOK。
Xi-TRACEデータ:star_poly.xitr
先ほどの円柱による線分を残してあるので、こんな感じですが、線分を消すと、のっぺりした星形のポリゴンだけが残ります。データを加工して試してみてください。