「数理演算の基礎」

2019年より着手した「数理再勉強」用の倉庫。

【幾何学の基礎】「平方眼(Square Grid)と立方眼(Cube Grid)」

f:id:ochimusha01:20190918061420g:plain

正方形(Square)には角度(90度=π/2ラジアン)の和が360度(ラジアン)となる組み合わせ(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つから構成されています。

f:id:ochimusha01:20200208055954p:plain

統計言語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次元

f:id:ochimusha01:20200210060711g:plain

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") 

おや、もっと分割出来そうです。まずは半分に分割してみましょう。

半分に分割

f:id:ochimusha01:20200211083924g:plain

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)
}

まずは元プログラムの設定で。同じ内容が出力される。

f:id:ochimusha01:20200211103818g:plain

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)とし数字を倍に設定してみる。

f:id:ochimusha01:20200211103956g:plain

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)。

f:id:ochimusha01:20200211105505g:plain

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")

例えば四元数quaterniona+bi +cj+dkの世界では、こうした立方眼(Cube Grid)のスケーラビリティー平方数集めて組み立てると自己相似形となるい)はスカラー(scalar)aに吸収される形となります。