【幾何学の基礎】「平方眼(Square Grid)と立方眼(Cube Grid)」
正方形(Square)には角度(90度=π/2ラジアン)の和が360度(2πラジアン)となる組み合わせ(4個)がある上、平方数(Square Number)A[N]={1,4,9,16…N^2}個集めて組み合わせると自己相似形となる為、正三角形や正六角形同様に単独で平面充填(Tiling)性を備える正平面充填形 (Regular Tessellation)に分類されます。
平方数個集めて組み合わせると自己相似形となる正方形の特徴は、立方体(Cube)とも呼ばれる正六面体(Regular Hexahedron)も継承。即ち立方数(Cubric Number)a[N]={1,8,1, 8, 27, 64, 125…N^3}集めて組み合わせると自己相似形となります。
この特徴はN次元全般に渡って通用しますが、それは90度=π/2ラジアンなる角度が直交(orthogonal)や線型独立 (linearly independent)といった概念を通じて直交座標系(Rectangular coordinate systemないしはOrthogonal Coordinate System)に関連付けられている事を意味していたりします。
まずは基本中の基本から。正三角形(Reguler Triangle)は三辺の比1:1:sqrt(2)となる直角二等辺三角形(Right Triangle)2つから構成されています。
統計言語Rによる作図例
#分割数Nod(Number of divide)=4
NoD<-4
#円周分割数列(Sequence of Divided Circumference)
SoDC<-seq(0,2*pi,length=NoD+1)
#円周上の三角形の頂点を集める。
cx_nomal=cos(SoDC)
cy_nomal=sin(SoDC)
#グラフ描画
plot(cx_nomal,cy_nomal,col=rgb(0,0,1),type="l",xlim=c(-1,1),ylim=c(-1,1),main="Square and Right Triangles",xlab="Cos(θ)",ylab="Sin(θ)",lwd=1.2)
#背景円の塗り潰し
Circumference<-seq(0,2*pi,length=60)
cx_circle=cos(Circumference)
cy_circle=sin(Circumference)
polygon(cx_circle, #x
cy_circle, #y
density=c(30), #塗りつぶす濃度
angle=c(45), #塗りつぶす斜線の角度
col=c(200,200,200)) #塗りつぶす色#大二等辺三角形の塗り潰し
polygon(c(1,0,0,1), #x
c(0,-1,1,0), #y
density=c(30), #塗りつぶす濃度
angle=c(45), #塗りつぶす斜線の角度
col=rgb(0,0,1)) #塗りつぶす色#大二等辺三角形の塗り潰し
polygon(c(1,0,0,1), #x
c(0,0,1,0), #y
density=c(30), #塗りつぶす濃度
angle=c(-45), #塗りつぶす斜線の角度
col=rgb(0,0,1)) #塗りつぶす色#文字追加
text(cx_nomal,cy_nomal, labels=c("a","b","c","d"),col=rgb(0,0,1))
#補助線と補助文字追加
segments(1,0,-1,0,col=rgb(0,0,1))
segments(0,1,0,-1,col=rgb(0,0,1))
text(0,0,labels="e",col=rgb(0,0,1))
統計言語Rによる作表例
#三角比(Triangle Ratio)一覧
angle_ab<-c("sqrt(2)","1","1")
angle_ae<-c("2","sqrt(2)","sqrt(2)")
angle_be<-c("1","sqrt(2)/2","sqrt(2)/2")library(xtable)
TR01<- data.frame(ab=angle_ab,ae=angle_ae,be=angle_be)
print(xtable(TR01),type="html")
ab | ae | be | |
---|---|---|---|
1 | sqrt(2) | 2 | 1 |
2 | 1 | sqrt(2) | sqrt(2)/2 |
3 | 1 | sqrt(2) | sqrt(2)/2 |
それではいよいよ六面体の作図に取り掛かるとしましょう。
立方体(Square)における平行対角線(6面x2=12)と立方対角線(3次元)
library(rgl)
#頂点座標=8個
texts3d(0,0,0,texts=c("(0,0,0)"),col=rgb(0,0,0),adj=1.0)
texts3d(1,0,0,texts=c("(1,0,0)"),col=rgb(0,0,0),adj=1.0)
texts3d(0,1,0,texts=c("(0,1,0)"),col=rgb(0,0,0),adj=1.0)
texts3d(1,1,0,texts=c("(1,1,0)"),col=rgb(0,0,0),adj=1.0)
texts3d(0,0,1,texts=c("(0,0,1)"),col=rgb(0,0,0),adj=1.0)
texts3d(1,0,1,texts=c("(1,0,1)"),col=rgb(0,0,0),adj=1.0)
texts3d(0,1,1,texts=c("(0,1,1)"),col=rgb(0,0,0),adj=1.0)
texts3d(1,1,1,texts=c("(1,1,1)"),col=rgb(0,0,0),adj=1.0)
#正六面体(Square)本体=6面lines3d(c(0,1,1,0,0),c(0,0,1,1,0),c(0,0,0,0,0),col=rgb(0,0,0),lwd=1)
lines3d(c(0,1,1,0,0),c(0,0,1,1,0),c(1,1,1,1,1),col=rgb(0,0,0),lwd=1)
lines3d(c(0,0),c(0,0),c(0,1),col=rgb(0,0,0),lwd=1)
lines3d(c(1,1),c(0,0),c(0,1),col=rgb(0,0,0),lwd=1)
lines3d(c(0,0),c(1,1),c(0,1),col=rgb(0,0,0),lwd=1)
lines3d(c(1,1),c(1,1),c(0,1),col=rgb(0,0,0),lwd=1)#平方対角線(長さsqrt(2))=6面*2=12本
lines3d(c(0,1),c(0,1),c(0,0),col=rgb(0,1,0),lwd=1)
lines3d(c(0,1),c(1,0),c(0,0),col=rgb(0,1,0),lwd=1)
lines3d(c(0,1),c(0,1),c(1,1),col=rgb(0,1,0),lwd=1)
lines3d(c(0,0),c(0,1),c(0,1),col=rgb(0,1,0),lwd=1)
lines3d(c(0,1),c(1,0),c(1,1),col=rgb(0,1,0),lwd=1)
lines3d(c(0,0),c(0,1),c(1,0),col=rgb(0,1,0),lwd=1)
lines3d(c(0,1),c(0,0),c(0,1),col=rgb(0,1,0),lwd=1)
lines3d(c(0,1),c(0,0),c(1,0),col=rgb(0,1,0),lwd=1)
lines3d(c(1,1),c(0,1),c(1,0),col=rgb(0,1,0),lwd=1)
lines3d(c(1,1),c(0,1),c(0,1),col=rgb(0,1,0),lwd=1)
lines3d(c(0,1),c(1,1),c(1,0),col=rgb(0,1,0),lwd=1)
lines3d(c(0,1),c(1,1),c(0,1),col=rgb(0,1,0),lwd=1)#立方対角線(長さsqrt(3))=3本
lines3d(c(0,1),c(0,1),c(0,1),col=rgb(0,0,1),lwd=1)
lines3d(c(0,1),c(1,0),c(1,0),col=rgb(0,0,1),lwd=1)
lines3d(c(0,1),c(0,1),c(1,0),col=rgb(0,0,1),lwd=1)#アニメーション
movie3d(spin3d(axis=c(0,0,1),rpm=5),duration=10,fps=25,movie="C:/Users/81806/Desktop/Markdown/square001")
おや、もっと分割出来そうです。まずは半分に分割してみましょう。
半分に分割
library(rgl)
#頂点座標=8個
texts3d(0,0,0,texts=c("(0,0,0)"),col=rgb(0,0,0),adj=1.0)
texts3d(1,0,0,texts=c("(1,0,0)"),col=rgb(0,0,0),adj=1.0)
texts3d(0,1,0,texts=c("(0,1,0)"),col=rgb(0,0,0),adj=1.0)
texts3d(1,1,0,texts=c("(1,1,0)"),col=rgb(0,0,0),adj=1.0)
texts3d(0,0,1,texts=c("(0,0,1)"),col=rgb(0,0,0),adj=1.0)
texts3d(1,0,1,texts=c("(1,0,1)"),col=rgb(0,0,0),adj=1.0)
texts3d(0,1,1,texts=c("(0,1,1)"),col=rgb(0,0,0),adj=1.0)
texts3d(1,1,1,texts=c("(1,1,1)"),col=rgb(0,0,0),adj=1.0)
#頂点間中点=1+6+12=19個
texts3d(0.5,0.5,0.5,texts=c("(0.5,0.5,0.5)"),col=c(200,200,200),adj=1.0,cex=0.5)
texts3d(0,0.5,0.5,texts=c("(0,0.5,0.5)"),col=c(200,200,200),adj=1.0,cex=0.5)
texts3d(0.5,0,0.5,texts=c("(0.5,0,0.5)"),col=c(200,200,200),adj=1.0,cex=0.5)
texts3d(0.5,0.5,0,texts=c("(0.5,0.5,0)"),col=c(200,200,200),adj=1.0,cex=0.5)
texts3d(1,0.5,0.5,texts=c("(1,0.5,0.5)"),col=c(200,200,200),adj=1.0,cex=0.5)
texts3d(0.5,1,0.5,texts=c("(0.5,1,0.5)"),col=c(200,200,200),adj=1.0,cex=0.5)
texts3d(0.5,0.5,1,texts=c("(0.5,0.5,1)"),col=c(200,200,200),adj=1.0,cex=0.5)
texts3d(0.5,0,0,texts=c("(0.5,0,0)"),col=c(200,200,200),adj=1.0,cex=0.5)
texts3d(0.5,0,1,texts=c("(0.5,0,1)"),col=c(200,200,200),adj=1.0,cex=0.5)
texts3d(0.5,1,0,texts=c("(0.5,1,0)"),col=c(200,200,200),adj=1.0,cex=0.5)
texts3d(0.5,1,1,texts=c("(0.5,1,1)"),col=c(200,200,200),adj=1.0,cex=0.5)
texts3d(0,0.5,0,texts=c("(0,0.5,0)"),col=c(200,200,200),adj=1.0,cex=0.5)
texts3d(0,0.5,1,texts=c("(0,0.5,1)"),col=c(200,200,200),adj=1.0,cex=0.5)
texts3d(1,0.5,0,texts=c("(0.5,1,0)"),col=c(200,200,200),adj=1.0,cex=0.5)
texts3d(1,0.5,1,texts=c("(0.5,1,1)"),col=c(200,200,200),adj=1.0,cex=0.5)
texts3d(0,0,0.5,texts=c("(0,0,0.5)"),col=c(200,200,200),adj=1.0,cex=0.5)
texts3d(0,1,0.5,texts=c("(0,1,0.5)"),col=c(200,200,200),adj=1.0,cex=0.5)
texts3d(1,0,0.5,texts=c("(1,0,0.5)"),col=c(200,200,200),adj=1.0,cex=0.5)
texts3d(1,1,0.5,texts=c("(1,1,0.5)"),col=c(200,200,200),adj=1.0,cex=0.5)
#正六面体(Square)本体=6面lines3d(c(0,1,1,0,0),c(0,0,1,1,0),c(0,0,0,0,0),col=rgb(0,0,0),lwd=1)
lines3d(c(0,1,1,0,0),c(0,0,1,1,0),c(1,1,1,1,1),col=rgb(0,0,0),lwd=1)
lines3d(c(0,0),c(0,0),c(0,1),col=rgb(0,0,0),lwd=1)
lines3d(c(1,1),c(0,0),c(0,1),col=rgb(0,0,0),lwd=1)
lines3d(c(0,0),c(1,1),c(0,1),col=rgb(0,0,0),lwd=1)
lines3d(c(1,1),c(1,1),c(0,1),col=rgb(0,0,0),lwd=1)
#頂点間中線=3+12=15本
lines3d(c(1,0),c(0.5,0.5),c(0.5,0.5),col=c(200,200,200),lwd=1)
lines3d(c(0.5,0.5),c(1,0),c(0.5,0.5),col=c(200,200,200),lwd=1)
lines3d(c(0.5,0.5),c(0.5,0.5),c(1,0),col=c(200,200,200),lwd=1)
lines3d(c(0,1,1,0,0),c(0,0,1,1,0),c(0.5,0.5,0.5,0.5,0.5),col=c(200,200,200),lwd=1)
lines3d(c(0.5,0.5,0.5,0.5,0.5),c(0,1,1,0,0),c(0,0,1,1,0),col=c(200,200,200),lwd=1)
lines3d(c(0,1,1,0,0),c(0.5,0.5,0.5,0.5,0.5),c(0,0,1,1,0),col=c(200,200,200),lwd=1)#平方対角線(長さsqrt(2))=6面*2=12本
lines3d(c(0,1),c(0,1),c(0,0),col=rgb(0,1,0),lwd=1)
lines3d(c(0,1),c(1,0),c(0,0),col=rgb(0,1,0),lwd=1)
lines3d(c(0,1),c(0,1),c(1,1),col=rgb(0,1,0),lwd=1)
lines3d(c(0,0),c(0,1),c(0,1),col=rgb(0,1,0),lwd=1)
lines3d(c(0,1),c(1,0),c(1,1),col=rgb(0,1,0),lwd=1)
lines3d(c(0,0),c(0,1),c(1,0),col=rgb(0,1,0),lwd=1)
lines3d(c(0,1),c(0,0),c(0,1),col=rgb(0,1,0),lwd=1)
lines3d(c(0,1),c(0,0),c(1,0),col=rgb(0,1,0),lwd=1)
lines3d(c(1,1),c(0,1),c(1,0),col=rgb(0,1,0),lwd=1)
lines3d(c(1,1),c(0,1),c(0,1),col=rgb(0,1,0),lwd=1)
lines3d(c(0,1),c(1,1),c(1,0),col=rgb(0,1,0),lwd=1)
lines3d(c(0,1),c(1,1),c(0,1),col=rgb(0,1,0),lwd=1)#立方対角線(長さsqrt(3))=3個
lines3d(c(0,1),c(0,1),c(0,1),col=rgb(0,0,1),lwd=1)
lines3d(c(0,1),c(1,0),c(1,0),col=rgb(0,0,1),lwd=1)
lines3d(c(0,1),c(0,1),c(1,0),col=rgb(0,0,1),lwd=1)#アニメーション
movie3d(spin3d(axis=c(0,0,1),rpm=5),duration=10,fps=25,movie="C:/Users/81806/Desktop/Markdown/square003")
正六面体は立方数(Cubric Number)a[N]={1,8,1, 8, 27, 64, 125…N^3}集めて組み合わせると自己相似形となります。これを試す為、まず上掲プログラムの数値を抽象化して関数化します。
抽象化と関数化
library(rgl)
#mo(Minus One),cp(Center Point),po(Plus One)
cube_draw01<-function(m,c,p){
#座標(Coordinate)合成関数Cd
cd<-function(a,b,c){paste0("(",a,",",b,",",c,")")}
#頂点座標=8個
texts3d(m,m,m,texts=cd(m,m,m),col=rgb(0,0,0),adj=1.0)
texts3d(p,m,m,texts=cd(p,m,m),col=rgb(0,0,0),adj=1.0)
texts3d(m,p,m,texts=cd(m,p,m),col=rgb(0,0,0),adj=1.0)
texts3d(p,p,m,texts=cd(p,p,m),col=rgb(0,0,0),adj=1.0)
texts3d(m,m,p,texts=cd(m,m,p),col=rgb(0,0,0),adj=1.0)
texts3d(p,m,p,texts=cd(p,m,p),col=rgb(0,0,0),adj=1.0)
texts3d(m,p,p,texts=cd(m,p,p),col=rgb(0,0,0),adj=1.0)
texts3d(p,p,p,texts=cd(p,p,p),col=rgb(0,0,0),adj=1.0)
#頂点間中点=1+6+12=19個
texts3d(c,c,c,texts=cd(c,c,c),col=c(200,200,200),adj=1.0,cex=0.5)
texts3d(m,c,c,texts=cd(m,c,c),col=c(200,200,200),adj=1.0,cex=0.5)
texts3d(c,m,c,texts=cd(c,m,c),col=c(200,200,200),adj=1.0,cex=0.5)
texts3d(c,c,m,texts=cd(c,c,m),col=c(200,200,200),adj=1.0,cex=0.5)
texts3d(p,c,c,texts=cd(p,c,c),col=c(200,200,200),adj=1.0,cex=0.5)
texts3d(c,p,c,texts=cd(c,p,c),col=c(200,200,200),adj=1.0,cex=0.5)
texts3d(c,c,p,texts=cd(c,c,p),col=c(200,200,200),adj=1.0,cex=0.5)
texts3d(c,m,m,texts=cd(c,m,m),col=c(200,200,200),adj=1.0,cex=0.5)
texts3d(c,m,p,texts=cd(c,m,p),col=c(200,200,200),adj=1.0,cex=0.5)
texts3d(c,p,m,texts=cd(c,p,m),col=c(200,200,200),adj=1.0,cex=0.5)
texts3d(c,p,p,texts=cd(c,p,p),col=c(200,200,200),adj=1.0,cex=0.5)
texts3d(m,c,m,texts=cd(m,c,m),col=c(200,200,200),adj=1.0,cex=0.5)
texts3d(m,c,p,texts=cd(m,c,p),col=c(200,200,200),adj=1.0,cex=0.5)
texts3d(p,c,m,texts=cd(p,c,m),col=c(200,200,200),adj=1.0,cex=0.5)
texts3d(p,c,p,texts=cd(p,c,p),col=c(200,200,200),adj=1.0,cex=0.5)
texts3d(m,m,c,texts=cd(m,m,c),col=c(200,200,200),adj=1.0,cex=0.5)
texts3d(m,p,c,texts=cd(m,p,c),col=c(200,200,200),adj=1.0,cex=0.5)
texts3d(p,m,c,texts=cd(p,m,c),col=c(200,200,200),adj=1.0,cex=0.5)
texts3d(p,p,c,texts=cd(p,p,c),col=c(200,200,200),adj=1.0,cex=0.5)
#正六面体(Square)本体=6面lines3d(c(m,p,p,m,m),c(m,m,p,p,m),c(m,m,m,m,m),col=rgb(0,0,0),lwd=1)
lines3d(c(m,p,p,m,m),c(m,m,p,p,m),c(p,p,p,p,p),col=rgb(0,0,0),lwd=1)
lines3d(c(m,m),c(m,m),c(m,p),col=rgb(0,0,0),lwd=1)
lines3d(c(p,p),c(m,m),c(m,p),col=rgb(0,0,0),lwd=1)
lines3d(c(m,m),c(p,p),c(m,p),col=rgb(0,0,0),lwd=1)
lines3d(c(p,p),c(p,p),c(m,p),col=rgb(0,0,0),lwd=1)
#頂点間中線=3+12=15本
lines3d(c(p,m),c(c,c),c(c,c),col=c(200,200,200),lwd=1)
lines3d(c(c,c),c(p,m),c(c,c),col=c(200,200,200),lwd=1)
lines3d(c(c,c),c(c,c),c(p,m),col=c(200,200,200),lwd=1)
lines3d(c(c,c,c,c,c),c(m,p,p,m,m),c(m,m,p,p,m),col=c(200,200,200),lwd=1)
lines3d(c(m,p,p,m,m),c(c,c,c,c,c),c(m,m,p,p,m),col=c(200,200,200),lwd=1)
lines3d(c(m,p,p,m,m),c(m,m,p,p,m),c(c,c,c,c,c),col=c(200,200,200),lwd=1)
#平方対角線(長さsqrt(2))=6面*2=12本
lines3d(c(m,p),c(m,p),c(m,m),col=rgb(0,1,0),lwd=1)
lines3d(c(m,p),c(p,m),c(m,m),col=rgb(0,1,0),lwd=1)
lines3d(c(m,p),c(m,p),c(p,p),col=rgb(0,1,0),lwd=1)
lines3d(c(m,m),c(m,p),c(m,p),col=rgb(0,1,0),lwd=1)
lines3d(c(m,p),c(p,m),c(p,p),col=rgb(0,1,0),lwd=1)
lines3d(c(m,m),c(m,p),c(p,m),col=rgb(0,1,0),lwd=1)
lines3d(c(m,p),c(m,m),c(m,p),col=rgb(0,1,0),lwd=1)
lines3d(c(m,p),c(m,m),c(p,m),col=rgb(0,1,0),lwd=1)
lines3d(c(p,p),c(m,p),c(p,m),col=rgb(0,1,0),lwd=1)
lines3d(c(p,p),c(m,p),c(m,p),col=rgb(0,1,0),lwd=1)
lines3d(c(m,p),c(p,p),c(p,m),col=rgb(0,1,0),lwd=1)
lines3d(c(m,p),c(p,p),c(m,p),col=rgb(0,1,0),lwd=1)#立方対角線(長さsqrt(3))=3個
lines3d(c(m,p),c(m,p),c(m,p),col=rgb(0,0,1),lwd=1)
lines3d(c(m,p),c(p,m),c(p,m),col=rgb(0,0,1),lwd=1)
lines3d(c(m,p),c(m,p),c(p,m),col=rgb(0,0,1),lwd=1)
}
まずは元プログラムの設定で。同じ内容が出力される。
cube_draw01(0,0.5,1)
#アニメーション
movie3d(spin3d(axis=c(0,0,1),rpm=5),duration=10,fps=25,movie="C:/Users/81806/Desktop/Markdown/cube001")
今度は原点を(0,0,0)とし数字を倍に設定してみる。
cube_draw01(-1,0,1)
#アニメーション
movie3d(spin3d(axis=c(0,0,1),rpm=5),duration=10,fps=25,movie="C:/Users/81806/Desktop/Markdown/cube002")
重ねてみる(ゴチャゴチャして見難いが「こんな感じで8個並ぶ」イメージさえ掴めればOK)。
cube_draw01(-1,0,1)
cube_draw01(-1,-0.5,0)
cube_draw01(0,0.5,1)
#アニメーション
movie3d(spin3d(axis=c(0,0,1),rpm=5),duration=10,fps=25,movie="C:/Users/81806/Desktop/Markdown/cube003")
例えば四元数(quaternion)a+bi +cj+dkの世界では、こうした立方眼(Cube Grid)のスケーラビリティー(平方数集めて組み立てると自己相似形となるい)はスカラー(scalar)aに吸収される形となります。