Yoshi Nishikawa's Blog

データと知識、その調和平均。

クオータニオンのこと quaternion

Quaternion

Qaternionとは

複素数を拡張した数体系である。
・集合としては、四元数の全体 H は実数体上四次元の数ベクトル空間 R4 に等しい。
四元数は純粋数学のみならず応用数学、特に3Dグラフィクスやコンピュータビジョンにおいて三次元での回転の計算でも用いられる。

package "onion"

# install.package("onion")
library(onion)

DNA molecule (ref 2)をshift & rotateさせる

Shifting

100ずつshift

library(onion)
A <- quaternion(Re=0, i=xyz[,1], j=xyz[,2], k=xyz[,3])
u1 <- c(100, 100, 0) # x, yを100ずつ移動するuを作る
u1_q <- quaternion(Re=0, i=u1[1], j=u1[2], k=u1[3])
A.shift<-A+u1_q
rgl.clear()
spheres3d(t(as.matrix(A)[-1,]), radius=base.size, col="black")
spheres3d(t(as.matrix(A.shift)[-1,]), radius=base.size, col=base.col[col+1])

f:id:yoshi_nishikawa:20160719094754p:plain

ばらばらにshift

#u2<-matrix(runif(100,0,100), 3,100)
#u2_q <- quaternion(Re=0, i=u2[1], j=u2[2], k=u2[3])
n<-1 #それぞれの点を各軸に0-1の範囲で乱数用いてshift
u2_q<-quaternion(Re=0, i=runif(100,0,n),j=runif(100,0,n),k=runif(100,0,n))
A.shift2<-A+u2_q
rgl.clear()
spheres3d(t(as.matrix(A)[-1,]), radius=base.size, col="black")
spheres3d(t(as.matrix(A.shift2)[-1,]), radius=base.size, col="red")
n<-10 #0-10
u2_q<-quaternion(Re=0, i=runif(100,0,n),j=runif(100,0,n),k=runif(100,0,n))
A.shift2<-A+u2_q
rgl.clear()
spheres3d(t(as.matrix(A)[-1,]), radius=base.size, col="black")
spheres3d(t(as.matrix(A.shift2)[-1,]), radius=base.size, col="red")
n<-100 #0-100
u2_q<-quaternion(Re=0, i=runif(100,0,n),j=runif(100,0,n),k=runif(100,0,n))
A.shift2<-A+u2_q
rgl.clear()
spheres3d(t(as.matrix(A)[-1,]), radius=base.size, col="black")
spheres3d(t(as.matrix(A.shift2)[-1,]), radius=base.size, col="red")

f:id:yoshi_nishikawa:20160719094825p:plain

Rotation

pi/6 rotate

library(onion)
theta<-pi/6 #回転角
A <- quaternion(Re=0, i=xyz[,1], j=xyz[,2], k=xyz[,3])
u <- c(1, 1, 1)*sin(theta/2) 
u_q <- quaternion(Re=cos(theta/2), i=u[1], j=u[2], k=u[3])
xyz.rot<-u_q*A*Conj(u_q)
rgl.clear()
spheres3d(t(as.matrix(A)[-1,]), radius=base.size, col="black")
spheres3d(t(as.matrix(xyz.rot)[-1,]), radius=base.size, col=base.col[col+1])

ばらばらにrotate

u3_q <- quaternion(Re=cos(runif(100, 0, pi/2)), i=u[1], j=u[2], k=u[3])
xyz.rot2<-u3_q*A*Conj(u3_q)
rgl.clear()
spheres3d(t(as.matrix(A)[-1,]), radius=base.size, col="black")
spheres3d(t(as.matrix(xyz.rot2)[-1,]), radius=base.size, col="red")

f:id:yoshi_nishikawa:20160719094847p:plain

Comments

とある尊敬する方から、学習においては単語(vocaburary)が大切だと言われた。これは、根本について端的に表していると思う。物事を読み解くとき、特に其の分野に対して未知であればあるほど、まずは徹底的に広く勉強し、其の分野で用いられている単語、用いられるコンテクストを理解することが重要だ。それが分かれば、自分から適切な質問をし、適切に答えていくことが出来るようになるだろう。これには相応の努力と、相応の時間を要するが、現代人が培っていかなければならない知識だと思う。

References

  1. Quaternion (wikipedia). https://en.wikipedia.org/wiki/Quaternion
  2. DNA2重らせん
    http://d.hatena.ne.jp/ryamada22/20131224
  3. rmarkdownとknitrによる文書作成 http://d.hatena.ne.jp/MikuHatsune/20160708/1467984764
  4. http://stla.github.io/stlapblog/posts/rgl_knitr.html
  5. rgl で描いた図の保存 http://cse.naro.affrc.go.jp/takezawa/r-tips/r/57.html