ねこでじ(Nekodigi)

Nekodigi’s diary

学習中の気づきをまとめています。応援よろしくお願いします

【Processing】全ての正多面体を実装し、描画方法を視覚化する。

成果物

www.youtube.com
今回は、Icosphereを作るため正二十面体を作っていたのですが、ついでに全ての正多面体を実装しました。Wikipediaなどで調べてみると、意外な描画方法だったので、内部に描画する時のヒントを表示してみました。

コード

Polyhedronシリーズのリポジトリに追加しました。今後Icosphereも追加する予定です。
github.com

解説

今回は、外接円の半径(r)で大きさを指定できるようにしました。

正四面体

式はこのようになっています。もう少し簡単に計算する方法もありますが。ピラミッドのような角度で見える方が自然なのでこのような式にしました。
 \begin{array}{l}
各頂点の座標\\
0\left(\frac{\sqrt{6}}{3} r,\ r/3,\ -\frac{\sqrt{2}}{3} r\right)\\
1\left( -\frac{\sqrt{6}}{3} r,\ r/3,\ -\frac{\sqrt{2}}{3} r\right)\\
2\left( 0,\ r/3,\ \frac{2\sqrt{2}}{3} r\right)\\
3(0,\ -r,\ 0)\\
接続\\
( 0,1,2)\\
( 0,1,3)\\
( 1,2,3)\\
( 2,0,3)
\end{array}
Wiki
正四面体 - Wikipedia

正六面体

式はこのようになっています。forループをΣで表現しています。
 \begin{array}{l}
各頂点の座標\\
l=\frac{r}{\sqrt{3}}\\
( \pm l,\pm l,\pm l) なので、具体的に描くと。\\
0( -l,-l,-l)\\
1( -l,-l,l)\\
2( -l,l,l)\\
3( -l,l,-l)\\
4( l,-l,-l)\\
5( l,-l,l)\\
6( l,l,l)\\
7( l,l,-l)\\
接続\\
( 3,2,1,0)\\
( 4,5,6,7)\\
Σは繰り返しという意味で利用しています。\\
\sum ^{3}_{i=0}( i,( i+1) \ \bmod 4,( i+1) \ \bmod 4+4,i+4)
\end{array}
Wiki
正六面体 - Wikipedia

正八面体

式はこのようになっています。
 \begin{array}{l}
各頂点の座標\\
0( -r,0,0)\\
1( r,0,0)\\
2( 0,-r,0)\\
3( 0,r,0)\\
4( 0,0,-r)\\
5( 0,0,r)\\
接続\\
( 0,2,4)\\
( 0,2,5)\\
( 0,3,4)\\
( 0,3,5)\\
( 1,2,4)\\
( 1,2,5)\\
( 1,3,4)\\
( 1,3,5)
\end{array}
Wiki
正八面体 - Wikipedia

正十二面体

式はこちらです。正六面体の頂点を全て含んでいます。またφは黄金比です。ただ1/φはそのまま計算すると精度が悪いので別の方法を使っています。
 \begin{array}{l}
各頂点の座標\\
\varphi =r\frac{1+\sqrt{5}}{2}\\
\varphi ^{-1} =\frac{1}{\varphi } =r\frac{-1+\sqrt{5}}{2}\\
0\sim 7、正六面体の頂点の座標と同じ\\
\left( 0,\pm \varphi ^{-1} ,\pm \varphi \right) 全ての偶置換12個なので\\
8\left( 0,-\varphi ,-\varphi ^{-1}\right)\\
9\left( 0,-\varphi ,\varphi ^{-1}\right)\\
10\left( 0,\varphi ,\varphi ^{-1}\right)\\
11\left( 0,\varphi ,-\varphi ^{-1}\right)\\
12\left( 0,-\varphi ,-\varphi ^{-1}\right)\\
13\left( 0,-\varphi ,\varphi ^{-1}\right)\\
14\left( 0,\varphi ,\varphi ^{-1}\right)\\
15\left( 0,\varphi ,-\varphi ^{-1}\right)\\
16\left( 0,-\varphi ,-\varphi ^{-1}\right)\\
17\left( 0,-\varphi ,\varphi ^{-1}\right)\\
18\left( 0,\varphi ,\varphi ^{-1}\right)\\
19\left( 0,\varphi ,-\varphi ^{-1}\right)\\
接続\\
( 0,\ 8,\ 9,\ 1,\ 16)\\
( 4,\ 8,\ 9,\ 5,\ 19)\\
( 1,\ 16,\ 17,\ 2,\ 15)\\
( 5,\ 19,\ 18,\ 6,\ 14)\\
( 2,\ 10,\ 11,\ 3,\ 17)\\
( 6,\ 10,\ 11,\ 7,\ 18)\\
( 3,\ 17,\ 16,\ 0,\ 12)\\
( 7,\ 18,\ 19,\ 4,\ 13)\\
( 0,\ 12,\ 13,\ 4,\ 8)\\
( 3,\ 12,\ 13,\ 7,\ 11)\\
( 1,\ 15,\ 14,\ 5,\ 9)\\
( 2,\ 15,\ 14,\ 6,\ 10)
\end{array}
Wiki
正十二面体 - Wikipedia

正二十面体

直角に交わる黄金比のカードの頂点をつなぎ合わせるようにして描画します。今回は、半径から求めたいのでカードの対角線の長さを求め、半径を割っています。すいません!結局For文使いました…
 \begin{array}{l}
各頂点の座標\\
\varphi =r\frac{1+\sqrt{5}}{2}\\
\mathrm{diagonal} =\sqrt{\frac{5+\sqrt{5}}{2}}\\
s=\frac{r}{\mathrm{diagonal}}\\
( 0,\pm 1,\pm \varphi ) 全ての偶置換12個なので\\
0( 0,s,\varphi )\\
1( 0,-s,\varphi )\\
2( 0,s,-\varphi )\\
3( 0,-s,-\varphi )\\
4( s,\varphi ,0)\\
5( -s,\varphi ,0)\\
6( s,-\varphi ,0)\\
7( -s,-\varphi ,0)\\
8( \varphi ,0,s)\\
9( \varphi ,0,-s)\\
10( \varphi ,0,s)\\
11( \varphi ,0,-s)\\
接続\\
for( i=0;i< 12;i+=4)\{\\
( i,i+1,( i+8)\bmod 12)\\
( i,i+1,( i+10)\bmod 12)\\
( i+2,i+3,( i+9)\bmod 12)\\
( i+2,i+3,( i+11)\bmod 12)\\
\}\\
( 0,4,8)\\
( 0,5,10)\\
( 1,6,8)\\
( 1,7,10)\\
( 2,4,9)\\
( 2,5,11)\\
( 3,6,9)\\
( 3,7,11)
\end{array}
Wiki
正二十面体 - Wikipedia