引用元:https://www.ioccc.org/2013/endoh4/endoh4.c
審査員・作者による説明:https://www.ioccc.org/2013/endoh4/hint.html
動作
3次元の凸包のビューア。
cube.txtは次の通り、立方体の頂点だけが並んでいるデータ。
$ cat cube.txt
1,1,1
1,1,-1
1,-1,1
1,-1,-1
-1,1,1
-1,1,-1
-1,-1,1
-1,-1,-1
$ gcc -o endoh4 endoh4.c
$ ./endoh4 < cube.txt
最初は頂点だけが表示される。
,
,
'
, ''
,
,
'
しばらくしたら、凸包として表示されるようになる。
,,,,,,,,,,,,
;', ''''''''''''',
,' ; ',
; ; ',
; ', ',
; ; ',
,' ; ;
; ', ;
; ', ;
,' ; ;
; ;,,,,,,,,,,,,,,,,,,,,,,,,,;
; ,' ,'
', ,' ,'
; ,' ,'
; ; ;
; ; ;
; ; ;
', ; ;
; ,' ;
;;,,,,,,,,,,,,,,,,,,,,,,,;
立体はくるくる回り続ける。
隠面消去も行っている。
サッカーボールの例。
$ ./endoh4 < solids/archimedian-solid/a11-truncated-icosahedron.txt
,,,,'''''''''',,,,
,,'; ;'',,
,' ,;, ,; '',,
,' ,' '''',,,,,''''' ', ',
,' ,' ; ', ;
,' ,' ; ', ',
,',,', ; ;''''',
,'' ', ; ; ;
; ', ,,,''', ; ;
; ',,''' ', ; ;
; ; ', ,,,; ;
; ; ',,,'''' ', ;
; ; ; ; ,'
; ,' ,' ; ;
; ,; ; ;,,,,;
',,'' '', ; ; ;
', ', ,;, ,' ;
', ', ,,,'''' '',, ,' ;'
; ,' '';' ,'
;, ; ; ,'
''';,, ; ; ,'
'';,, ,,,;''''
'';,,,;'''
なお、ソースコード自体を入力として与えると正四面体になる。
$ ./endoh4 < endoh4.c
,,';
,,,'' ,';
,,'' ,' ;
,,,'' ,' ;
,,'' ,' ,'
,,''' ; ;
,,,'' ,' ;
';',,,,,,,,,,,,,,,,,,,; ;
',, ', ;
', ', ;
'', ; ;
'', ; ;
',, ; ;
',, ; ,'
', ', ;
'', ', ;
',, ; ;
',;;
'
解説
コード形状は三角形が4つ並んでいるもの。
これは正四面体の展開図を表現している。
したがって、ソースコードを入力データとして使ったときは正四面体になるようになっている。
凸包の計算はギフト包装法で行う。
単純にやると面が三角形に分割されてしまうので、ほぼ並行でくっついている面はマージすることも行っている。
また、多少データが微妙でも堅牢に動くように、ランダム摂動を加える。
3Dレンダリングは隠面処理付きの透視投影・サブキャラクターレンダリング・カメラの螺旋軌道などを行っている。
なお、math.hは利用せず、sin/cosは自力で計算する。
マクロを与えてコンパイルすると描画サイズを変更できるとのこと。
$ gcc -DS=120,40 -o endoh4 endoh4.c
賞名の”solid”は、形容詞では「堅実」だが、名詞の「立体」の意味をかけている。
[[1998/chaos]]とかなりかぶっているような気がする。
差分は凸包の計算をする程度か。
同年の大会で同一の作者が4つ入賞するのは初。