■高次元の正多胞体(その2)
4面体は4つの頂点と4つの面から構成されるので,頂点数を加えていうと,4点4面体である.5面体には4角錐(5点5面体)と3角柱(6点5面体)がある.6面体には5点6面体が1種類,6点6面体,7点6面体,8点6面体が2種類ずつの合計7種類ある.以下,7面体には34種類,8面体には257種類,9面体には266種類ある.
見方を変えて,凸多面体を頂点数で分類すると,4点多面体は1種類,5点多面体は2種類,6点多面体は7種類,7点多面体は34種類,8点多面体は257種類,9点多面体は266種類,10点多面体は32300種類ある.
両者で同じ数値が出現していることに気づかれたかと思う.ここでは3次元凸多面体についてみてきたが,次に,一般のn次元の凸多面体(凸多胞体)として,どのようなものが存在し得るかについて考えてみることにしよう.
2次元では,
v−e=0,v≧3,e≧3
を満たす凸v角形(凸e角形)が存在する.
3次元凸多面体の頂点,辺,面の数をそれぞれv,e,fとすると,
v−e+f=2 (オイラーの多面体定理)
が成り立つ.これは3次元立体について,0次元の特性数であるv,1次元の特性数であるe,2次元の特性数であるfの関係を述べたものと解釈され,数学の10大定理の1つに挙げられるものである.
3次元では,オイラーの多面体公式
v−e+f=2
以外に
f≦2v−4,v≦2f−4
を満たせばよいことが証明されている(シュタイニッツ,1906年).したがって,これらの式の頂点vと面fの対称性により,f面凸多面体とv点凸多面体は同数になるというわけである.
実は,頂点数が与えられたとき,すべてのn−1次元面数を計算することと,n−1次元面数が与えられたとき,すべての頂点数を計算することは本質的に同値な問題であり,凸包問題として知られている.
n=3の場合,n−1次元面数=fとなるが,3次元における実現個数の漸近公式は
(2(v−1),f+2)(2(f−1),v+2)/972(v−1)(f−1)(v+f−2)
で与えられるという.
それに対して,4次元では
v−e+f−c=0 (シュレーフリ,1852年)
であるが,2次元,3次元の場合と同様の問題は未解決である.
なお,
v−e+f−c+g−h+i−・・・=1−(−1)^n
と一般化したものがオイラー・ポアンカレの定理である.右辺はnが奇数のとき2,偶数のとき0になる.
fiをn次元多面体のi次元面の数とすると,
f0=v,f1=e,f2=f,・・・
ここで,
fn=1(多面体内部のn次元空間),f-1=1(空集合)
と定めると,オイラー・ポアンカレの定理は,
−f-1+f0−f1+f2−・・・+(−1)^(n-1)fn-1+(−1)^nfn=0
で表されることになる.
===================================
【1】輪郭線処理
さて,今回のコラムでは,前回予告したn次元双対立方体とn次元正単体を2次元平面に投影した際の混雑した稜線の中から輪郭線だけを抽出する方法について解説していきたい.
まず最初に,コラム「ロボットアームとn次元直方体(その3)」より,n次元立方体の輪郭線処理の方法を復習しておこう.
a)n次元立方体(正2n胞体)は,
頂点数: 2^n,
稜数: 2^(n-1)n,
四角形数:2^(n-3)n(n−1)
から成っていて,各頂点のまわりにはn本の稜,n(n−1)/2個の正方形が集まっている.また,各稜のまわりにはn−1個の正方形が集まっている.
b)1つの稜のまわりの正方形面上で,いま描こうとしている稜に平行なn−1本の線を求める.
c)これらn本の平行線をそれぞれ2次元平面に投影した際の直線を含む3次元空間内の平面の,稜の始点(あるいは終点)におけるz値を求める.
d)n本の線のなかで,稜のz値が最大値,最小値の場合だけを表示するようにすれば,輪郭線だけを表示することができる.
===================================
n次元双対立方体では
頂点数: 2n,
稜数: 2n(n−1),
三角形数:2n(n−1)^2/3
であるから,各頂点からは2(n−1)本の稜がでる.各頂点のまわりには(n−1)^2個の三角形,また,各稜のまわりにはn−1個の三角形が集まっている.
n次元正単体の場合,
頂点数: n+1,
稜数: (n+1)n/2,
三角形数:n(n^2−1)/6
である.すなわち,各頂点からはn本の稜がでる.各頂点のまわりにはn(n−1)/2個の三角形,また,各稜のまわりにはn−1個の三角形が集まっている.
これらの情報のうち,輪郭線処理にとって本質的なのはどれだろうか? いずれの場合も,各稜のまわりにはn−1個の面が集まっていることが共通しているので,当初は
b)1つの稜のまわりの(n−1)面上で,いま描こうとしている稜に平行なn−1本の線を求める.
に引き続き,c),d)を実行すれば輪郭線だけを描くことができるはずであると思われた.
ところが,それではうまく輪郭線を処理することができなかった.ちょっと考えればわかることなのだが,輪郭線処理にとっては,辺の周りに何面集まっているかではなく,頂点から何本の稜がでるかという点が本質的なのである.
そこで,結論を述べると,
b)各頂点から出るk本の稜上の点を始点として,いま描こうとしている稜に平行なk−1本の線を求める.
と変更すればよいことがわかった.
===================================
【2】単純多面体と単体的多面体
n次元立方体は,各頂点からn本の稜がでる単純多面体であるのに対し,n次元双対立方体は単体的多面体(n−1次元面が単体で,n個の頂点をもっている)であることが知られている.n次元正単体は単純かつ単体的多面体である.
n次元立方体と正単体ではk=nであるが,双対立方体ではk=2(n−1)である.したがって,n次元立方体の輪郭線処理のために作成されたプログラムは,n次元双対立方体の場合には使えないことになる.
そのため,n次元立方体の輪郭線処理のために作成されたプログラムを,n次元双対立方体とn次元正単体の場合にも使えるように書き換えることから始めなければならない.以下に,プログラムを書き換えた部分と描画例を掲載する.
なお,3次元正多面体は正則胞体なので,多面体の1つの頂点に集まる面の形と数をp,qとすると,
pf=2e,qv=2e (握手定理)
が成り立つ.
3次元の単体的多面体ではp=3なので,
2f1=3f2
を得ることができる.同様に,n次元の単体的多面体における握手定理
2fn-2=nfn-1
を導くことができる.
===================================
[1]プログラム
4680 '
4690 ' *** 超立方体 ***
4700 '
4710 *HYPERCUBE:
4720 T=1:' [non-stochastic]
4730 FOR IS=1 TO M:EDGE(IS)=SQR(T*AZ(IS,IS)):NEXT IS
4740 '
4750 FOR IS=0 TO 2^M-1
4760 FOR JS=1 TO M:S(JS)=-1:NEXT JS
4770 FOR JS=1 TO M
4780 IF (IS AND 2^(JS-1))=0 THEN S(JS)=1
4790 NEXT JS
4800 FOR JS=1 TO M:S0(JS)=S(JS):NEXT JS
4810 'GOSUB *VERTEX:GXS=GX:GYS=GY
4820 '
4830 COUNT=0
4840 FOR JS=1 TO M
4850 COUNT=COUNT+1
4860 FOR KS=1 TO M:S(KS)=S0(KS):NEXT KS
4870 S(JS)=-S(JS)
4880 FOR KS=1 TO M:SS(COUNT,KS)=S(KS):NEXT KS
4890 'GOSUB *VERTEX:GXE=GX:GYE=GY
4900 'LINE(GXS,-GYS)-(GXE,-GYE),7
4910 NEXT JS
4920 GOSUB *POLYGON
4930 NEXT IS
4940 RETURN
4950 '
4960 ' *** 頂点 ***
4970 '
4980 *VERTEX:
4990 GX=0:GY=0
5000 FOR GS=1 TO M
5010 GX=GX+BZ(I,GS)*EDGE(GS)*S(GS)
5020 GY=GY+BZ(J,GS)*EDGE(GS)*S(GS)
5030 NEXT GS
5040 GX=GX+VO(I):GY=GY+VO(J)
5050 RETURN
5420 '
5430 ' *** 輪郭抽出 ***
5440 '
5450 *POLYGON:
5460 EPS=.05
5470 FOR JS=1 TO COUNT
5480 FOR LS=1 TO M:S1(LS)=SS(JS,LS):NEXT LS
5490 FOR KS=1 TO COUNT
5500 FOR LS=1 TO M:S2(LS)=SS(KS,LS):NEXT LS
5510 '
5520 FOR LS=1 TO M:S(LS)=S0(LS):NEXT LS
5530 IF KS=JS THEN 5550
5540 FOR LS=1 TO M:S(LS)=S0(LS)+EPS*(S2(LS)-S0(LS)):NEXT LS
5550 GOSUB *VERTEX:GXS(KS)=GX:GYS(KS)=GY
5560 '
5570 FOR LS=1 TO M:S(LS)=S1(LS):NEXT LS
5580 IF KS=JS THEN 5600
5590 FOR LS=1 TO M:S(LS)=S1(LS)+EPS*(S2(LS)-S0(LS)):NEXT LS
5600 GOSUB *VERTEX:GXE(KS)=GX:GYE(KS)=GY
5610 NEXT KS
5620 GOSUB *POLYGON.LINE
5630 NEXT JS
5640 RETURN
5650 '
5660 *POLYGON.LINE:
5670 X=GXS(JS):Y=GYS(JS)
5680 FOR KS=1 TO COUNT
5690 GZ(KS)=(GYE(KS)-GYS(KS))*(X-GXS(KS))-(GXE(KS)-GXS(KS))*(Y-GYS(KS))
5700 NEXT KS
5710 '
5720 ZMAX=GZ(JS):ZMIN=GZ(JS)
5730 FOR KS=1 TO COUNT
5740 IF KS=JS THEN 5770
5750 IF ZMAX<GZ(KS) THEN ZMAX=GZ(KS)
5760 IF ZMIN>GZ(KS) THEN ZMIN=GZ(KS)
5770 NEXT KS
5780 '
5790 SW=0
5800 IF (ZMAX-GZ(JS))*(ZMIN-GZ(JS))=0 THEN SW=1
5810 GXS=GXS(JS):GYS=GYS(JS)
5820 GXE=GXE(JS):GYE=GYE(JS)
5830 IF SW=1 THEN LINE(GXS,-GYS)-(GXE,-GYE),7
5840 RETURN
===================================
[2]双対立方体の輪郭線処理
5850 '
5860 ' *** 双対立方体 ***
5870 '
5880 *DUALCUBE:
5890 T=1:' [non-stochastic]
5900 FOR IS=1 TO M:EDGE(IS)=SQR(T*AZ(IS,IS)):NEXT IS
5910 '
5920 FOR IS=1 TO M
5930 FOR JS=1 TO M:S(JS)=0:NEXT JS
5940 S(IS)=1
5950 FOR JS=1 TO M:S0(JS)=S(JS):NEXT JS
5960 'GOSUB *VERTEX:GXS=GX:GYS=GY
5970 '
5980 COUNT=0
5990 FOR JS=1 TO M
6000 IF JS=IS THEN 6140
6010 COUNT=COUNT+1
6020 FOR KS=1 TO M:S(KS)=0:NEXT KS
6030 S(JS)=1
6040 FOR KS=1 TO M:SS(COUNT,KS)=S(KS):NEXT KS
6050 'GOSUB *VERTEX:GXE=GX:GYE=GY
6060 'LINE(GXS,-GYS)-(GXE,-GYE),7
6070 '
6080 COUNT=COUNT+1
6090 FOR KS=1 TO M:S(KS)=0:NEXT KS
6100 S(JS)=-1
6110 FOR KS=1 TO M:SS(COUNT,KS)=S(KS):NEXT KS
6120 'GOSUB *VERTEX:GXE=GX:GYE=GY
6130 'LINE(GXS,-GYS)-(GXE,-GYE),7
6140 NEXT JS
6150 GOSUB *POLYGON
6160 NEXT IS
6170 '
6180 FOR IS=1 TO M
6190 FOR JS=1 TO M:S(JS)=0:NEXT JS
6200 S(IS)=-1
6210 FOR JS=1 TO M:S0(JS)=S(JS):NEXT JS
6220 'GOSUB *VERTEX:GXS=GX:GYS=GY
6230 '
6240 COUNT=0
6250 FOR JS=1 TO M
6260 IF JS=IS THEN 6400
6270 COUNT=COUNT+1
6280 FOR KS=1 TO M:S(KS)=0:NEXT KS
6290 S(JS)=1
6300 FOR KS=1 TO M:SS(COUNT,KS)=S(KS):NEXT KS
6310 'GOSUB *VERTEX:GXE=GX:GYE=GY
6320 'LINE(GXS,-GYS)-(GXE,-GYE),7
6330 '
6340 COUNT=COUNT+1
6350 FOR KS=1 TO M:S(KS)=0:NEXT KS
6360 S(JS)=-1
6370 FOR KS=1 TO M:SS(COUNT,KS)=S(KS):NEXT KS
6380 'GOSUB *VERTEX:GXE=GX:GYE=GY
6390 'LINE(GXS,-GYS)-(GXE,-GYE),7
6400 NEXT JS
6410 GOSUB *POLYGON
6420 NEXT IS
6430 RETURN
===================================
[3]正単体の輪郭線処理
6440 '
6450 ' *** 正単体 ***
6460 '
6470 *SIMPLEX:
6480 T=1:' [non-stochastic]
6490 FOR IS=1 TO M:EDGE(IS)=SQR(T*AZ(IS,IS)):NEXT IS
6500 '
6510 FOR IS=1 TO M
6520 FOR JS=1 TO M:S(JS)=0:NEXT JS
6530 S(IS)=1
6540 FOR JS=1 TO M:S0(JS)=S(JS):NEXT JS
6550 'GOSUB *VERTEX:GXS=GX:GYS=GY
6560 '
6570 COUNT=0
6580 FOR JS=1 TO M
6590 IF JS=IS THEN 6660
6600 COUNT=COUNT+1
6610 FOR KS=1 TO M:S(KS)=0:NEXT KS
6620 S(JS)=1
6630 FOR KS=1 TO M:SS(COUNT,KS)=S(KS):NEXT KS
6640 'GOSUB *VERTEX:GXE=GX:GYE=GY
6650 'LINE(GXS,-GYS)-(GXE,-GYE),7
6660 NEXT JS
6670 '
6680 COUNT=COUNT+1
6690 FOR KS=1 TO M:S(KS)=(1-SQR(1+M))/M:NEXT KS
6700 FOR KS=1 TO M:SS(COUNT,KS)=S(KS):NEXT KS
6710 'GOSUB *VERTEX:GXE=GX:GYE=GY
6720 'LINE(GXS,-GYS)-(GXE,-GYE),7
6730 GOSUB *POLYGON
6740 NEXT IS
6750 RETURN
===================================
【3】雑感
ロボットの動作制御への応用のために,これまで,超球→超立方体→双対立方体と進んできたのだが,|ω|≦1をn次元球の表現とすると,それに外接するn次元立方体は|ωi|≦1,内接する双対立方体はΣ|ωi|≦1で表される.
n次元立方体の2次元へのアフィン射影は,中心対称な2n角形になる.すなわち,対辺のペアは平行で同じ長さというわけである.また,これを3次元空間に投影したものが平行多面体である.
平行多面体とは,平行移動するだけで3次元空間を埋めつくすことのできる単独の多面体であって,平行多面体は,立方体,6角柱,菱形12面体,長菱形12面体(正6角形4枚と菱形8枚の2種類で作る12面体),切頂8面体の5種類しかない.
このうち,6角柱と菱形12面体は4次元立方体を3次元に投影したもの,長菱形12面体は5次元立方体を,切頂8面体は6次元立方体を3次元に投影したものと一致している.これら5種類の図形は5種類の正多面体(プラトン立体)ほどよく知られていないが,少なくとも同じ程度に重要であると考えられる.
なお,正多面体のような対称性をもたない空間充填凸多面体ではもっと多くの面をもつことができる.n次元空間のタイリング(敷き詰め)の問題は完全には解決されたわけではないのだが,これまでのところ,正多面体のような対称性をもたない空間充填凸多面体の面数の最大値は34面体である(エンゲル,1980年).
再び,2次元平面への投影に戻ろう.n次元多面体の影の幾何学的性質も,まだ完全に理解されているわけではないようであるが,n次元立方体の場合,平行2n角形,正単体の場合n+1角形になることは確かであろう.
それに対して,双対立方体では平行2(n−1)角形になるものと推察される.このことは双対立方体の各頂点から2(n−1)本の稜がでることから直観的にも納得のいくものであろう.また,n次元立方体の影である2n角形の中心を通る線がない分,その方向へ平行な2本の対辺が減ったものと考えれば辻褄が合うものと考えられる.
===================================