引用元:https://www.ioccc.org/2005/persano/persano.c
審査員・作者による説明:https://www.ioccc.org/2005/persano/hint.text
動作
トーラス結び目のアニメGIFを生成する。
$ gcc -o persano persano.c -lm
$ ./persano 5 2 > knot5-2.gif
........................................
解説
./persano p q
で(p,q)型トーラス結び目の画像を生成する。
(p,q)型トーラス結び目とは、ドーナツ形状(トーラス)の穴の周りをp周しつつ、ドーナツの断面方向にq周して元の位置に戻るときの軌跡のような形。
生成されるGIFはLZW圧縮をしていないとのこと。
無圧縮GIFのようなフォーマットになっていると思われる。
コード形状は”S^3”。4次元空間における3次元球面のこと。
typedef double V[3],U[4]
で、3次元と4次元のベクトルの型を定義している(詳細な計算方法は解読していない)。
バイナリを標準出力に吐き出すので、テキストモードがあるシステムでは動かない。
作者は「今日にそんな環境を使っている人はいないので些細な問題 ;)」と言っているが、Windowsのことを指している。
読者の演習問題が3つある。
- ポリゴンを増やしてスムーズにせよ(1点)
- チューブの断面の半径を変える方法を示せ(2点)
- 有名な超越数の定数、πの位置を示せ(5点)
問1の答え:#define H 20
の数字を変えれば良い。
審査員が冒頭で./persano 3 16 > knot3-16.gif
を例にあげているが、これはデフォルトのH
では小さすぎておかしくなる。
#define H 100
とした結果がこちら。
問2の答え:sr = 15
をsr = 5
などとすれば細くなる。./persano 5 2
の例。
問3の答え:pow(25/log(36),4)/377
が2πの近似値になっている。