図形ファイルの記述−3.図形の宣言
胞の宣言
<name "立方体"> <copy perm4 * XYZW> cell { [#1, #1, #1, -1] //頂点の宣言 length(2) //辺の宣言 polygon(4) //面の宣言 }
冒頭での解説通り、胞はcellブロックを使って宣言します。
cellブロックの中には、頂点・辺・面を順に宣言していきます。
また、cellブロックにcopyタグをつけることで、一回の宣言で複数の胞を作成することができます。
(コピーの詳細は変換形式によるコピーを参照して下さい。)
<nonDirectional> cell { <perm4> [0, 0, 0, #2] [#1, #1, #1, #1] <perm12> [0, #1, #(t - 1), #t] length(2 / t) polygon(3) }
名前こそ「cellブロック」ですが、図形が3次元空間に収まらなくても一向に構いません。
(ただし、「超裏面」処理が使えなくなります。例では、超裏面処理を無効にするnonDirectionalタグを付けています。)
複雑な図形のひとつひとつの胞を宣言するのが面倒なときは、全ての頂点座標を1つのcellブロックに収めてしまえば、
たった数行で4次元図形を生成することができます。
頂点の宣言
cell { [ 0, 0, 0, 2] [#1, #1, #1, 1] …… }
cellブロック内に書かれた(演算の項や引数などでない)座標ベクトルは全て頂点の宣言と見なされます。
頂点は、宣言した順に0,1,2……と番号が振られます(この番号は辺や面を自分で宣言する際に必要になります)。
cell { <normal> [0, 0, 0, 2] v1 = [0, 0, 1, 2] …… }
例外として、座標ベクトルが変数に代入される場合や、 normalタグ(座標ベクトルが法線ベクトルであることを表すタグ)が付けられている場合は頂点の宣言にはなりません。
v1 = [0, 0, 1, 2] cell { v1 [0, 0, 1, 1] * 1.5 …… }
定数として宣言した座標ベクトルを頂点に使用する場合は、定数名を書くことで頂点の宣言となります。
また、宣言される座標ベクトルは演算結果でも構いません。
この例の場合、(0, 0, 1, 2)と(0, 0, 1.5, 1.5)が胞の頂点に追加されます。
cell { [0, 0, #1, 2] <copy prem3 * XYZw> [0, 0, 0, 2] …… }
#演算子によって複数のベクトルを同時に宣言することができます。
その他、変換形式によるコピーによって複雑な組み合わせの頂点を同時に定義することもできます。
この場合は、一定の規則に従って番号が振られます。詳しくは変換形式によるコピーを参照して下さい。
辺の宣言
cell { …… length(2) }
胞内の全ての辺の長さが同じである場合、通常の辺宣言よりもlength関数を使用して辺を宣言するほうが簡潔です。
length関数は辺の長さを引数として取り、宣言されている頂点から、指定した長さになる全ての辺を生成して返します。
cell { …… length(2, 2.5) }
length関数は一度に複数の引数を取ることが出来ます。この場合、長さが2または2.5になるような辺が生成されます。
cell { …… edge { 0 1 2, 3 4 5 6 } }
length関数を使わずに辺を宣言する場合、edgeブロックを宣言し、辺を繋ぐ頂点の番号をスペースで区切って並べます。
「,」で区切った部分は繋がりません。上の例のような宣言では、下図のように辺が繋がります。

面の宣言
cell { …… polygon(3) }
polygon関数は、辺で繋がった全ての頂点から、指定した辺数になる面を生成して返す関数です。
通常、面はpolygon関数を使用して宣言します。
polygon関数は一度に複数の引数を取ることができます。polygon(3,5)と指定した場合、全ての三角形と五角形が生成されます。
polygon関数の亜種として、凸多角形だけを返すconvex関数と、星型多角形だけを返すstar関数があります。
どちらも引数の指定は同じです。
cell { …… face { 0 1 2, 0 1 3, 0 2 3, 0 3 4, 1 2 3 4 } }
polygon系関数ではどうしても要件を満たせない場合は、faceブロックを宣言します。
faceブロック内では、辺が繋がる順番に頂点番号を並べて面を宣言します。面と面の境界はコンマを入れます。
上の例は、四角錐の面を自力で宣言したもので、4つの三角形と1つの四角形を宣言しています。
なお、宣言できる面は30角形までです。この上限はpolygon系関数でも共通です。