正五角錐を回転させるアニメーションを製作しましょう。
/* 3.4.1m.mac */ load(draw)$ xyz2polar(v) := block([r : sqrt(v[1]^2 + v[2]^2 + v[3]^2)], [r, acos(v[3]/r), mod(atan2(v[2], v[1]), 2*%pi)])$ t : makelist(ev([cos(a), sin(a), 0], a = 2*%pi*j/5), j, 0, 5)$ apex : [0, 0, 1.5]$ pentapyramid : makelist(triangle(t[n], t[mod(n, 5) + 1], apex), n, 1, 5)$ N : 30$ for j : 0 thru N - 1 do block([p : xyz2polar([10, -30*sin(2*%pi*j/N), -30*cos(2*%pi*j/N)]), k : 0], while k < 10000 do k : k + 1, draw3d(axis_3d = false, xtics = false, ytics = false, ztics = false, view = [360/(2*%pi)*p[2], 360/(2*%pi)*p[3]], pentapyramid))$
使用した機能
3次元での表面を描画する時にはplot3d、それ以外の描画にはdraw(3d)を使います。
正n角錐を生成する関数を用意して、同様のことをしてみましょう。例は正七角錐。
/* 3.4.2m */ Shape(n) := block( [j, pts, sides, apex : [0, 0, 0.1]], pts : makelist([cos(2*%pi*j/n), sin(2*%pi*j/n), 0], j, 0, n), sides : makelist(triangle(apex, pts[i], pts[i + 1]), i, 1, n) )$ for j : 0 thru N - 1 do ([p : xyz2polar([10, -30*sin(2*%pi*j/N), -30*cos(2*%pi*j/N)]), k : 0], while k < 10000 do k : k + 1, draw3d(axis_3d = false, xtics = false, ytics = false, ztics = false, view = [360/(2*%pi)*p[2], 360/(2*%pi)*p[3]], Shape(7)))$
参考文献
- Crandall, Mathematica―理工系ツールとしての (アジソン ウェスレイ・トッパン情報科学シリーズ) p.24-p.26