【初心者向け】「単位円筒」から「単位球面」へ

今回の投稿の出発点はこれ。
[【初心者向け】物理学における「単位円筒(Unit Cylinder)」の概念について。](https://qiita.com/ochimusha01/items/ced1c21b4411e79cdcbe)
![20191018074109.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/597772/95e84e50-2532-6b54-6071-32924ea9dc70.gif)
**XY軸**（円弧）
![20191018074133.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/597772/71f29680-3e88-6b54-a125-33cb9d1a60e1.png)
**ZX軸**（Cos波）
![20191101090256 (1).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/597772/6dfc2d1d-4c23-caa1-bd24-cc7f9edfa4be.png)
**ZY軸**（Sin波）
![20191101090408.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/597772/00ed415f-a2fe-54ec-e077-9fee61d43218.png)
**単位円筒(Unit Cylinder)**の概念を**単位球面**に発展させる為には、まずZ軸の空間化、すなわちX軸やY軸と同様に相応の**密度**設定が必要となります。
![image.gif](https://cdn-ak.f.st-hatena.com/images/fotolife/o/ochimusha01/20201130/20201130004326.gif)

```R
libraly(rgl)
radians<-seq(0,120*pi,length=5000)
f0<-function(x){exp(x*(0+1i))}
Real<-Re(f0(radians))
Imaginal<-Im(f0(radians))
Rtime<-seq(0,2,length=3000)
plot3d(Real,Imaginal,Rtime,type="l",xlim=c(-1,1),ylim=c(-1,1),zlim=c(0,2),xlab="",ylab="",zlab="")

movie3d(spin3d(axis=c(0,0,1),rpm=5),duration=10,fps=25,movie="~/Desktop/unit01") 
```
そしてこの円筒に**ピタゴラスの定理**に従って**曲率**を付与するのです。
[【初心者向け】ピタゴラスの定理あるいは三平方の定理からの出発](https://qiita.com/ochimusha01/items/4c7f731b0ef3cc998aa1)
![image.gif](https://cdn-ak.f.st-hatena.com/images/fotolife/o/ochimusha01/20201130/20201130005920.gif)

```R
library(rgl)
radians<-seq(0,60*pi,length=3000)
f0<-function(x){exp(x*(0+1i))}
Real<-Re(f0(radians))
Imaginal<-Im(f0(radians))
Rtime<-seq(0,2,length=3000)
#工夫
f1<-function(x){sqrt(1-x^2)}
c0<-seq(-1,1,length=3000)
c1<-f1(c0)
#> plot(c0,c1,type="l",xlim=c(-1,1),ylim=c(0,1))
Real_c<-Real*c1
Imaginal_c<-Imaginal*c1

plot3d(Real_c,Imaginal_c,Rtime,type="l",xlim=c(-1,1),ylim=c(-1,1),zlim=c(0,2),xlab="",ylab="",zlab="")

movie3d(spin3d(axis=c(0,0,1),rpm=5),duration=10,fps=25,movie="~/Desktop/unit03") 
```
これに「<font color="red">任意の</font>**原蹠**(<font color="blue">Portal</font>)<font color="red">から</font>**対蹠**(<font color="blue">Antipodal</font>)<font color="red">に伸ばした</font>**立方対角線**(<font color="blue">Cubic Diagonal</font>)」なる概念を追加してみます。
![Sphere005.gif](https://cdn-ak.f.st-hatena.com/images/fotolife/o/ochimusha01/20210125/20210125154750.gif)

```R
library(rgl)

radians<-seq(0,60*pi,length=3000)
f0<-function(x){exp(x*(0+1i))}
Real<-Re(f0(radians))
Imaginal<-Im(f0(radians))
Rtime<-seq(-1,1,length=3000)
#工夫
f1<-function(x){sqrt(1-x^2)}
c0<-seq(-1,1,length=3000)
c1<-f1(c0)
#> plot(c0,c1,type="l",xlim=c(-1,1),ylim=c(0,1))
Real_c<-Real*c1
Imaginal_c<-Imaginal*c1

plot3d(Real_c,Imaginal_c,Rtime,type="l",xlim=c(-1,1),ylim=c(-1,1),zlim=c(-1,1),xlab="",ylab="",zlab="",col=c(200,200,200))

#観測原点**(Observation Origin)
texts3d(0,0,0,texts="OO(0,0,0)",col=rgb(0,0,1),adj=1.0)

#原蹠(PorTal)
portal_i<-0
portal_j<-0
portal_k<-1
portal_text=paste0("PT(",portal_i,",",portal_j,",",portal_k,")")

#原蹠表示
texts3d(portal_i,portal_j,portal_k,texts=portal_text,col=rgb(0,0,1),adj=1.0)

#対蹠(AntiPordal)
antipordal_i<-0
antipordal_j<-0
antipordal_k<--1
antipordal_text=paste0("AP(",antipordal_i,",",antipordal_j,",",antipordal_k,")")

#対蹠表示
texts3d(antipordal_i,antipordal_j,antipordal_k,texts=antipordal_text,col=rgb(0,0,1),adj=1.0)

#立方対角線(Cubic Diagonal)
lines3d(c(portal_i,antipordal_i),c(portal_j,antipordal_j),c(portal_k,antipordal_k),col=rgb(0,0,1),lwd=2)

#アニメーション
movie3d(spin3d(axis=c(0,0,1),rpm=5),duration=10,fps=25,movie="~/Desktop/Sphere001")
```
さらに**赤道円**(<font color=blue>Equatorial circle</font>)の概念を追加。
![image.gif](https://cdn-ak.f.st-hatena.com/images/fotolife/o/ochimusha01/20210125/20210125155250.gif)

```R
library(rgl)
#円描写関数
f0<-function(x){exp(x*(0+1i))}

#無限円(Infinity Circle)
radians0<-seq(0,60*pi,length=60)
Real0<-Re(f0(radians))
Imaginal0<-Im(f0(radians))
Rtime0<-numeric(60)

#無限球面(Infinity Sphere)
radians<-seq(0,60*pi,length=3000)
Real<-Re(f0(radians))
Imaginal<-Im(f0(radians))
Rtime<-seq(-1,1,length=3000)

#工夫
f1<-function(x){sqrt(1-x^2)}
c0<-seq(-1,1,length=3000)
c1<-f1(c0)
#> plot(c0,c1,type="l",xlim=c(-1,1),ylim=c(0,1))
Real_c<-Real*c1
Imaginal_c<-Imaginal*c1

#無限球面(Infinity Sphere)の描画
plot3d(Real_c,Imaginal_c,Rtime,type="l",xlim=c(-1,1),ylim=c(-1,1),zlim=c(-1,1),,xlab="",ylab="",zlab="",col=c(200,200,200))

#無限円(Infinity Circle)の描画
lines3d(Real0,Imaginal0,Rtime0,col=rgb(0,0,1),lwd=2)

#観測原点**(Observation Origin)
texts3d(0,0,0,texts="OO(0,0,0)",col=rgb(0,0,1),adj=1.0)

#原蹠表示
texts3d(portal_i,portal_j,portal_k,texts=portal_text,col=rgb(0,0,1),adj=1.0)

#原蹠(PorTal)
portal_i<-0
portal_j<-0
portal_k<-1
portal_text="AP(0,0,Inf)"

#原蹠表示
texts3d(portal_i,portal_j,portal_k,texts=portal_text,col=rgb(0,0,1),adj=1.0)

#対蹠(AntiPordal)
antipordal_i<-0
antipordal_j<-0
antipordal_k<--1
antipordal_text="AP(0,0,-Inf)"

#対蹠表示
texts3d(antipordal_i,antipordal_j,antipordal_k,texts=antipordal_text,col=rgb(0,0,1),adj=1.0)

#立方対角線(Cubic Diagonal)
lines3d(c(portal_i,antipordal_i),c(portal_j,antipordal_j),c(portal_k,antipordal_k),col=rgb(0,0,1),lwd=2)

#アニメーション
movie3d(spin3d(axis=c(0,0,1),rpm=5),duration=10,fps=25,movie="~/Desktop/Sphere02")
```
**半径**(<font color=blue>Radius</font>)で考えるとこうです。
![image.gif](https://cdn-ak.f.st-hatena.com/images/fotolife/o/ochimusha01/20201130/20201130003431.gif)

```R
library(rgl)

radians<-seq(0,60*pi,length=3000)
f0<-function(x){exp(x*(0+1i))}
Real<-Re(f0(radians))
Imaginal<-Im(f0(radians))
Rtime<-seq(-1,1,length=3000)
#工夫
f1<-function(x){sqrt(1-x^2)}
c0<-seq(-1,1,length=3000)
c1<-f1(c0)
#> plot(c0,c1,type="l",xlim=c(-1,1),ylim=c(0,1))
Real_c<-Real*c1
Imaginal_c<-Imaginal*c1

plot3d(Real_c,Imaginal_c,Rtime,type="l",xlim=c(-1,1),ylim=c(-1,1),zlim=c(-1,1),xlab="",ylab="",zlab="",col=c(200,200,200))

#観測原点**(Observation Origin)
texts3d(0,0,0,texts="OO(0,0,0)",col=rgb(0,0,0),adj=1.0)

#原蹠(PorTal)
portal_i<-0
portal_j<-0
portal_k<-1
portal_text=paste0("Rad(",portal_i,",",portal_j,",",portal_k,")")

#原蹠表示
texts3d(portal_i,portal_j,portal_k,texts=portal_text,col=rgb(0,0,1),adj=1.0)

#立方対角線(Cubic Diagonal)
lines3d(c(portal_i,0),c(portal_j,0),c(portal_k,0),col=rgb(0,0,1),lwd=2)

#アニメーション
movie3d(spin3d(axis=c(0,0,1),rpm=5),duration=10,fps=25,movie="~/Desktop/Sphere01f")
```
**赤道概念**の追加。
![image.gif](https://cdn-ak.f.st-hatena.com/images/fotolife/o/ochimusha01/20201202/20201202093758.gif)

```R
library(rgl)
f0<-function(x){exp(x*(0+1i))}

#無限円(Infinity Circle)
radians0<-seq(0,2*pi,length=60)
Real0<-Re(f0(radians0))
Imaginal0<-Im(f0(radians0))
Rtime0<-numeric(60)

#無限球面(Infinity Sphere)
Real<-Re(f0(radians))
Imaginal<-Im(f0(radians))
Rtime<-seq(-1,1,length=3000)
#工夫
f1<-function(x){sqrt(1-x^2)}
c0<-seq(-1,1,length=3000)
c1<-f1(c0)
#> plot(c0,c1,type="l",xlim=c(-1,1),ylim=c(0,1))
Real_c<-Real*c1
Imaginal_c<-Imaginal*c1

#無限球面の描画
plot3d(Real_c,Imaginal_c,Rtime,type="l",xlim=c(-1,1),ylim=c(-1,1),zlim=c(-1,1),xlab="",ylab="",zlab="",col=c(200,200,200))

#無限円(Infinity Circle)の描画
lines3d(Real0,Imaginal0,Rtime0,col=rgb(0,1,0),lwd=2)

#観測原点**(Observation Origin)
texts3d(0,0,0,texts="OO(0,0,0)",col=rgb(0,0,0),adj=1.0)

#原蹠(PorTal)
portal_i<-0
portal_j<-0
portal_k<-1
portal_text=paste0("Rad(",portal_i,",",portal_j,",",portal_k,")")

#原蹠表示
texts3d(portal_i,portal_j,portal_k,texts=portal_text,col=rgb(0,0,1),adj=1.0)

#立方対角線(Cubic Diagonal)
lines3d(c(portal_i,0),c(portal_j,0),c(portal_k,0),col=rgb(0,0,1),lwd=2)

#アニメーション
movie3d(spin3d(axis=c(0,0,1),rpm=5),duration=10,fps=25,movie="~/Desktop/Sphere06")
```
**直径**(<font color=blue>Diameter</font>)で考えるとこうです。
![image.gif](https://cdn-ak.f.st-hatena.com/images/fotolife/o/ochimusha01/20201130/20201130001540.gif)

```R
library(rgl)

radians<-seq(0,60*pi,length=3000)
f0<-function(x){exp(x*(0+1i))}
Real<-Re(f0(radians))
Imaginal<-Im(f0(radians))
Rtime<-seq(-1,1,length=3000)
#工夫
f1<-function(x){sqrt(1-x^2)}
c0<-seq(-1,1,length=3000)
c1<-f1(c0)
#> plot(c0,c1,type="l",xlim=c(-1,1),ylim=c(0,1))
Real_c<-Real*c1
Imaginal_c<-Imaginal*c1

plot3d(Real_c,Imaginal_c,Rtime,type="l",xlim=c(-1,1),ylim=c(-1,1),zlim=c(-1,1),xlab="",ylab="",zlab="",col=c(200,200,200))

#観測原点**(Observation Origin)
texts3d(0,0,0,texts="OO(0,0,0)",col=rgb(0,0,0),adj=1.0)

#原蹠(PorTal)
portal_i<-0
portal_j<-0
portal_k<-1
portal_text=paste0("PT(",portal_i,",",portal_j,",",portal_k,")")

#原蹠表示
texts3d(portal_i,portal_j,portal_k,texts=portal_text,col=rgb(0,0,1),adj=1.0)

#対蹠(AntiPordal)
antipordal_i<-0
antipordal_j<-0
antipordal_k<--1
antipordal_text=paste0("AP(",antipordal_i,",",antipordal_j,",",antipordal_k,")")

#対蹠表示
texts3d(antipordal_i,antipordal_j,antipordal_k,texts=antipordal_text,col=rgb(1,0,0),adj=1.0)

#立方対角線(Cubic Diagonal)
lines3d(c(portal_i,0),c(portal_j,0),c(portal_k,0),col=rgb(0,0,1),lwd=2)
lines3d(c(0,antipordal_i),c(0,antipordal_j),c(0,antipordal_k),col=rgb(1,0,0),lwd=2)

#アニメーション
movie3d(spin3d(axis=c(0,0,1),rpm=5),duration=10,fps=25,movie="~/Desktop/Sphere01d")
```
同じく**赤道概念**を追加。
![image.gif](https://cdn-ak.f.st-hatena.com/images/fotolife/o/ochimusha01/20201202/20201202095654.gif)

```R
library(rgl)
f0<-function(x){exp(x*(0+1i))}

#無限円(Infinity Circle)
radians0<-seq(0,2*pi,length=60)
Real0<-Re(f0(radians0))
Imaginal0<-Im(f0(radians0))
Rtime0<-numeric(60)

#無限球面(Infinity Sphere)
radians<-seq(0,60*pi,length=3000)
Real<-Re(f0(radians))
Imaginal<-Im(f0(radians))
Rtime<-seq(-1,1,length=3000)
#工夫
f1<-function(x){sqrt(1-x^2)}
c0<-seq(-1,1,length=3000)
c1<-f1(c0)
#> plot(c0,c1,type="l",xlim=c(-1,1),ylim=c(0,1))
Real_c<-Real*c1
Imaginal_c<-Imaginal*c1

#無限球面の描画
plot3d(Real_c,Imaginal_c,Rtime,type="l",xlim=c(-1,1),ylim=c(-1,1),zlim=c(-1,1),xlab="",ylab="",zlab="",col=c(200,200,200))

#無限円(Infinity Circle)の描画
lines3d(Real0,Imaginal0,Rtime0,col=rgb(0,1,0),lwd=2)

#観測原点**(Observation Origin)
texts3d(0,0,0,texts="OO(0,0,0)",col=rgb(0,0,0),adj=1.0)

#原蹠(PorTal)
portal_i<-0
portal_j<-0
portal_k<-1
portal_text=paste0("PT(",portal_i,",",portal_j,",",portal_k,")")

#原蹠表示
texts3d(portal_i,portal_j,portal_k,texts=portal_text,col=rgb(0,0,1),adj=1.0)

#対蹠(AntiPordal)
antipordal_i<-0
antipordal_j<-0
antipordal_k<--1
antipordal_text=paste0("AP(",antipordal_i,",",antipordal_j,",",antipordal_k,")")

#対蹠表示
texts3d(antipordal_i,antipordal_j,antipordal_k,texts=antipordal_text,col=rgb(1,0,0),adj=1.0)

#立方対角線(Cubic Diagonal)
lines3d(c(portal_i,0),c(portal_j,0),c(portal_k,0),col=rgb(0,0,1),lwd=2)
lines3d(c(0,antipordal_i),c(0,antipordal_j),c(0,antipordal_k),col=rgb(1,0,0),lwd=2)

#アニメーション
movie3d(spin3d(axis=c(0,0,1),rpm=5),duration=10,fps=25,movie="~/Desktop/Sphere07")
```
そして**リーマン球面**
![image.gif](https://cdn-ak.f.st-hatena.com/images/fotolife/o/ochimusha01/20210129/20210129211754.gif)

```R
library(rgl)
f0<-function(x){exp(x*(0+1i))}

#無限円(Infinity Circle)
radians0<-seq(0,2*pi,length=60)
Real0<-Re(f0(radians0))
Imaginal0<-Im(f0(radians0))
Rtime0<-numeric(60)

#無限球面(Infinity Sphere)
radians<-seq(0,60*pi,length=3000)
Real<-Re(f0(radians))
Imaginal<-Im(f0(radians))
Rtime<-seq(-1,1,length=3000)
#工夫
f1<-function(x){sqrt(1-x^2)}
c0<-seq(-1,1,length=3000)
c1<-f1(c0)
#> plot(c0,c1,type="l",xlim=c(-1,1),ylim=c(0,1))
Real_c<-Real*c1
Imaginal_c<-Imaginal*c1

#無限球面の描画
plot3d(Real_c,Imaginal_c,Rtime,type="l",xlim=c(-1,1),ylim=c(-1,1),zlim=c(-1,1),xlab="",ylab="",zlab="",col=c(200,200,200))

#無限円(Infinity Circle)の描画
lines3d(Real0,Imaginal0,Rtime0,col=rgb(0,1,0),lwd=2)

#観測原点**(Observation Origin)
texts3d(0,0,0,texts="OO(0,0,1)",col=rgb(0,0,0),adj=1.0)

#原蹠(PorTal)
portal_i<-0
portal_j<-0
portal_k<-1
portal_text="Inf(inity)"

#原蹠表示
texts3d(portal_i,portal_j,portal_k,texts=portal_text,col=rgb(0,0,1),adj=1.0)

#対蹠(AntiPordal)
antipordal_i<-0
antipordal_j<-0
antipordal_k<--1
antipordal_text="AP(0,0,0)"

#対蹠表示
texts3d(antipordal_i,antipordal_j,antipordal_k,texts=antipordal_text,col=rgb(1,0,0),adj=1.0)

#立方対角線(Cubic Diagonal)
lines3d(c(portal_i,0),c(portal_j,0),c(portal_k,0),col=rgb(0,0,1),lwd=2)
lines3d(c(0,antipordal_i),c(0,antipordal_j),c(0,antipordal_k),col=rgb(1,0,0),lwd=2)

#アニメーション
movie3d(spin3d(axis=c(0,0,1),rpm=5),duration=10,fps=25,movie="~/Desktop/Sphere08")
```

実は**半径**<font color="green">r</font>をある種の**スカラー**(<font color="blue">Scalar</font>)として扱い、**水平方向の角度**<font color="green">φ</font>と**垂直方向の角度**<font color="green">θ</font>の組み合わせで球表面上の位置を特定する**極座標系**(<font color="blue">Polar Coordinate System</font>)と完全に重なります。何しろ**Z軸の値域**がX軸とX軸の相関関係と完全に無関係に<font color="green">-1<=cos(θ)<=1</font>と定められていますからね。
[極座標系 -Wikipedia-](https://ja.wikipedia.org/wiki/%E6%A5%B5%E5%BA%A7%E6%A8%99%E7%B3%BB)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/597772/c673690f-439b-0392-e08d-68ea34aa4206.png)
**二次元空間**(<font color=blue>円弧</font>)における**デカルト座標系**<font color=green>(x,y)</font>と**極座標系**<font color= green>(r,φ)</font>の相互変換

* **原点**<font color=green>(0,0)</font>からの**距離**<font color=green>r=sqrt(x^2+y^2)</font>
* **φ**=<font color=green>-(atan2(x,y)-pi/2)</font>
* **x**=<font color=green>r×cos(φ)</font>
* **y**=<font color=green>r×sin(φ)</font>

<font color=purple>統計言語Rでの検証例</font>

```R
#関数CtoD_2d(半径,角度φ)={x座標,y座標}
CtoD_2d<-function(Rad,Phi)return(c(Rad*cos(Phi),Rad*sin(Phi))) 
#関数DtoC_2d(x座標,y座標)={半径,角度φ}
DtoC_2d<-function(Xax,Yax)return(c(sqrt(Xax^2+Yax^2),-1*(atan2(Xax,Yax)-pi/2))) 

#π=3.14159,π/2=1.5708 
> round(pi, digits = 5)
[1] 3.14159
> round(pi/2, digits = 5)
[1] 1.5708

#半径1の単位円(Unit Circle)

> #0度(0ラジアン)
> round(CtoD_2d(1,0), digits = 5)
[1] 1 0
> round(DtoC_2d(1,0), digits = 5)
[1] 1 0
> #90度(π/2ラジアン)
> round(CtoD_2d(1,pi/2), digits = 5)
[1] 0 1
> round(DtoC_2d(0,1), digits = 5)
[1] 1.0000 1.5708
> #180度(πラジアン)
> round(CtoD_2d(1,pi), digits = 5)
[1] -1  0
> round(DtoC_2d(-1,0), digits = 5)
[1] 1.00000 3.14159
> #270度(3/2πラジアン)
> round(CtoD_2d(1,3/2*pi), digits = 5)
[1]  0 -1
> round(DtoC_2d(0,-1), digits = 5)
[1]  1.0000 -1.5708
> #360度(2πラジアン)
> round(CtoD_2d(1,2*pi), digits = 5)
[1] 1 0
> round(DtoC_2d(1,0), digits = 5)
[1] 1 0
```

**三次元空間**(<font color=blue>球面</font>)における**デカルト座標系**<font color=green>(x,y,z)</font>の**極座標系**<font color=green>(r,φ,θ)</font>の相互変換

* **原点**<font color=green>(0,0,0)</font>からの**距離**<font color=green>r=sqrt(x^2+y^2+z^2)</font>
* **φ**=<font color=green>-(atan2(x,y)-pi/2)</font>
* **θ**=<font color=green>-(atan2(sqrt(x^2+y^2+z^2),z)-pi/2))</font>
* **x**=<font color=green>r×sin(θ)cos(φ)</font>
* **y**=<font color=green>r×sin(θ)sin(φ)</font>
* **z**=<font color=green>r*cos(θ)</font>

<font color=purple>統計言語Rでの検証例</font>

```R
#関数CtoD_3d(半径,角度φ,角度θ)={x座標,y座標,z座標}
CtoD_3d<-function(Rad,Phi,Theta)return(c(Rad*sin(Theta)*cos(Phi),Rad*sin(Theta)*sin(Phi),Rad*cos(Theta))) 
#関数DtoC_3d(x座標,y座標,z座標)={半径,角度φ,角度θ}
DtoC_3d<-function(Xax,Yax,Zax)return(c(sqrt(Rad<-Xax^2+Yax^2+Zax^2),-1*(atan2(Xax,Yax)-pi/2),-1*(atan2(Rad,Zax)-pi/2))) 

#cos(π/4)=cos(-π/4)=0.70711
#-cos(pi/4)=cos(3/4π)=-0.70711
> cos(pi/4)
[1] 0.7071068
> cos(-pi/4)
[1] 0.7071068
> -cos(pi/4)
[1] -0.7071068
> cos(3/4*pi)
[1] -0.7071068

#半径1の単位球面(Unit Sphere)

#角度φ=0の時の角度θの周回
#対蹠なので角度θの値に拠らず座標(0,0,1)を指す。
> round(CtoD_3d(1,0,0), digits = 5)
[1] 0 0 1
> round(CtoD_3d(1,pi/2,0), digits = 5)
[1] 0 0 1
> round(CtoD_3d(1,pi,0), digits = 5)
[1] 0 0 1
> round(CtoD_3d(1,3/2*pi,0), digits = 5)
[1] 0 0 1
> round(CtoD_3d(1,2*pi,0), digits = 5)
[1] 0 0 1
> 
#角度φ=pi/4の時の角度θの周回
#Z座標cos(pi/4)の断面に半径cos(pi/4)の円を描く。
> round(CtoD_3d(1,0,pi/4), digits = 5)
[1] 0.70711 0.00000 0.70711
> round(CtoD_3d(1,pi/2,pi/4), digits = 5)
[1] 0.00000 0.70711 0.70711
> round(CtoD_3d(1,pi,pi/4), digits = 5)
[1] -0.70711  0.00000  0.70711
> round(CtoD_3d(1,3/2*pi,pi/4), digits = 5)
[1]  0.00000 -0.70711  0.70711
> round(CtoD_3d(1,2*pi,pi/4), digits = 5)
[1] 0.70711 0.00000 0.70711
 
#角度φ=pi/2の時の角度θの周回
#Z座標0の断面に半径1の円を描く。
> round(CtoD_3d(1,0,pi/2), digits = 5)
[1] 1 0 0
> round(CtoD_3d(1,pi/2,pi/2), digits = 5)
[1] 0 1 0
> round(CtoD_3d(1,pi,pi/2), digits = 5)
[1] -1  0  0
> round(CtoD_3d(1,3/2*pi,pi/2), digits = 5)
[1]  0 -1  0
> round(CtoD_3d(1,2*pi,pi/2), digits = 5)
[1] 1 0 0
 
#角度φ=3/4πの時の角度θの周回
#Z座標-cos(pi/4)の断面に半径cos(pi/4)の円を描く。
round(CtoD_3d(cos(pi/4),0,cos(pi/4)), digits = 5)

[1]  0.70711  0.00000 -0.70711
> round(CtoD_3d(1,pi/2,pi*3/4), digits = 5)
[1]  0.00000  0.70711 -0.70711
> round(CtoD_3d(1,pi,pi*3/4), digits = 5)
[1] -0.70711  0.00000 -0.70711
> round(CtoD_3d(1,3/2*pi,pi*3/4), digits = 5)
[1]  0.00000 -0.70711 -0.70711
> round(CtoD_3d(1,2*pi,pi*3/4), digits = 5)
[1]  0.70711  0.00000 -0.70711
 
#角度φ=πの時の角度θの周回
#対蹠なので角度θの値に拠らず座標(0,0,-1)を指す。
> round(CtoD_3d(1,0,pi), digits = 5)
[1]  0  0 -1
> round(CtoD_3d(1,pi/2,pi), digits = 5)
[1]  0  0 -1
> round(CtoD_3d(1,pi,pi), digits = 5)
[1]  0  0 -1
> round(CtoD_3d(1,3/2*pi,pi), digits = 5)
[1]  0  0 -1
> round(CtoD_3d(1,2*pi,pi), digits = 5)
[1]  0  0 -1

#関数DtoC_3d(x座標,y座標,z座標)={半径,角度φ,角度θ}
DtoC_3d<-function(Xax,Yax,Zax)return(c(sqrt(Xax^2+Yax^2+Zax^2),-1*(atan2(Xax,Yax)-pi/2),acos(Zax/sqrt(Xax^2+Yax^2+Zax^2)))) 

#座標(0,0,r)は対蹠なので半径r,角度θ=0と定まる。
#実は角度φは定まらない(ある種の極限状態)。
>round(DtoC_3d(0,0,1), digits = 5)
[1] 1.0000 1.5708 0.0000

#Z座標cos(π/4)の断面上では半径r,角度θ=cos(π/4)と定まる。
#角度φは平面上での検出通り。
> round(DtoC_3d(cos(pi/4),0,cos(pi/4)), digits = 5)
[1] 1.0000 0.0000 0.7854
> round(DtoC_3d(0,cos(pi/4),cos(pi/4)), digits = 5)
[1] 1.0000 1.5708 0.7854
> round(DtoC_3d(-cos(pi/4),0,cos(pi/4)), digits = 5)
[1] 1.00000 3.14159 0.78540
> round(DtoC_3d(0,-cos(pi/4),cos(pi/4)), digits = 5)
[1]  1.0000 -1.5708  0.7854

#Z座標0の断面上では半径r,角度θ=π/2と定まる。
#角度φは平面上での検出通り。
> round(DtoC_3d(1,0,0), digits = 5)
[1] 1.0000 0.0000 1.5708
> round(DtoC_3d(0,1,0), digits = 5)
[1] 1.0000 1.5708 1.5708
> round(DtoC_3d(-1,0,0), digits = 5)
[1] 1.00000 3.14159 1.57080
> round(DtoC_3d(0,-1,0), digits = 5)
[1]  1.0000 -1.5708  1.5708
> round(DtoC_3d(0,0,1), digits = 5)

#Z座標-cos(1/4π)の断面上では半径r,角度θ=-cos(1/4π)と定まる。
#角度φは平面上での検出通り。
> pi*3/4
[1] 2.356194
> round(DtoC_3d(cos(pi/4),0,-cos(pi/4)), digits = 5)
[1] 1.00000 0.00000 2.35619
> round(DtoC_3d(0,cos(pi/4),-cos(pi/4)), digits = 5)
[1] 1.00000 1.57080 2.35619
> round(DtoC_3d(-cos(pi/4),0,-cos(pi/4)), digits = 5)
[1] 1.00000 3.14159 2.35619
> round(DtoC_3d(0,cos(pi*3/4),-cos(pi/4)), digits = 5)
[1]  1.00000 -1.57080  2.35619

#座標(0,0,-r)も対蹠なので半径r,角度θ=πと定まる。
#角度φは定まらない(ある種の極限状態)
>round(DtoC_3d(0,0,-1), digits = 5)
[1] 1.00000 1.57080 3.14159
```
さりげなく**水平角**<font color="green">φ</font>と**垂直角**<font color="green">θ</font>の関係設定に三角関数の**加法定理**(<font color="blue">Trigonometric Addition Formulas</font>)の概念が援用されたりしてます。
[【初心者向け】「加法定理の幾何学的証明」に挑戦。](https://qiita.com/ochimusha01/items/36c0e84c434e6cdd6ec3)
![TR004.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/597772/25081e53-4ab7-3977-e9cd-dd5ccbae74d1.gif)

ここでは詳しくは述べませんが、さりげなく「**円弧上に位置する原蹠と対蹠の間を1回も曲がらず直線で結ぶ1次元処理**」や「**円弧上に位置する原蹠と対蹠の間を1回直角に曲がって結ぶ2次元処理**」といった次元操作概念もこっそり先取りされています（<font color="blue">特に何の説明もなく角度φの範囲が2π、角度θの範囲がπと設定されてる辺り</font>）。
[【Rで球面幾何学】ハミルトンの四元数(Hamilton's Quaternion)は何を表しているのか？](https://qiita.com/ochimusha01/items/aff8d52f20af01d13bed)

①考え方としては「**円柱の側面積の求め方を援用して円の表面積を積分する**」概念と重なってくる様です。そして、どちらも「**メルカトル図法の歪み**」問題に直面する展開に…
[【初心者向け】半径・直径・円周長・円の面積・球の表面積・球の体積の計算上の往復](https://qiita.com/ochimusha01/items/e180451a210227bb19a5)
[メルカトル図法 - Wikipedia](https://ja.wikipedia.org/wiki/%E3%83%A1%E3%83%AB%E3%82%AB%E3%83%88%E3%83%AB%E5%9B%B3%E6%B3%95)
![350px-Mercator-projection.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/597772/edf31f94-710e-959f-00e7-73e050eb7143.png)
![image.gif](https://qiita-user-contents.imgix.net/https%3A%2F%2Fcdn-ak.f.st-hatena.com%2Fimages%2Ffotolife%2Fo%2Fochimusha01%2F20201120%2F20201120185044.gif?ixlib=rb-1.2.2&auto=format&gif-q=60&q=75&w=1400&fit=max&s=8fbf7a04b5430618ed748494ba2298ae)
②一方、単位円筒からの発展のさせ方は「単位球面」ばかりとは限りません。
[【Rで球面幾何学】「単位円筒」から「トーラス構造」へ](https://qiita.com/ochimusha01/items/f6406e768aa24b8aea1a)
![20190915193504.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/597772/b2c0dc27-e8c9-e364-dc4d-a6219b699672.gif)
![20190915193539.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/597772/96689c92-6922-88ae-5cd9-b179a6719383.png)

③一応、**円筒**の場合も試しておきましょう。
![image.gif](https://cdn-ak.f.st-hatena.com/images/fotolife/o/ochimusha01/20201107/20201107202746.gif)

```R
library(rgl)
radians<-seq(0,120*pi,length=5000)
f0<-function(x){exp(x*(0+1i))}
Real<-Re(f0(radians))
Imaginal<-Im(f0(radians))
Rtime<-seq(-1,1,length=3000)
plot3d(Real,Imaginal,Rtime,type="l",xlim=c(-1,1),ylim=c(-1,1),zlim=c(-1,1),col=c(200,200,200))

#無限円(Infinity Circle)の描画
radians0<-seq(0,60*pi,length=60)
Real0<-Re(f0(radians))
Imaginal0<-Im(f0(radians))
Rtime0<-numeric(60)
lines3d(Real0,Imaginal0,Rtime0,col=rgb(1,0,0),lwd=2)

#観測原点**(Observation Origin)
texts3d(0,0,0,texts="OO(0,0,0)",col=rgb(1,0,0),adj=1.0)

#原蹠表示
texts3d(portal_i,portal_j,portal_k,texts=portal_text,col=rgb(1,0,0),adj=1.0)

#原蹠(PorTal)
portal_i<-0
portal_j<-0
portal_k<-1
portal_text="AP(0,0,Inf)"

#原蹠表示
texts3d(portal_i,portal_j,portal_k,texts=portal_text,col=rgb(1,0,0),adj=1.0)

#対蹠(AntiPordal)
antipordal_i<-0
antipordal_j<-0
antipordal_k<--1
antipordal_text="AP(0,0,-Inf)"

#対蹠表示
texts3d(antipordal_i,antipordal_j,antipordal_k,texts=antipordal_text,col=rgb(1,0,0),adj=1.0)

#立方対角線(Cubic Diagonal)
lines3d(c(portal_i,antipordal_i),c(portal_j,antipordal_j),c(portal_k,antipordal_k),col=rgb(1,0,0),lwd=2)

movie3d(spin3d(axis=c(0,0,1),rpm=5),duration=10,fps=25,movie="~/Desktop/test05") 
```
正方向のみの場合。
![image.gif](https://cdn-ak.f.st-hatena.com/images/fotolife/o/ochimusha01/20201202/20201202104819.gif)

```R
library(rgl)
f0<-function(x){exp(x*(0+1i))}

#円筒描画
radians<-seq(0,120*pi,length=5000)
Real<-Re(f0(radians))
Imaginal<-Im(f0(radians))
Rtime<-seq(0,2,length=3000)
plot3d(Real,Imaginal,Rtime,type="l",xlim=c(-1,1),ylim=c(-1,1),zlim=c(0,2),xlab="",ylab="",zlab="",col=c(200,200,200))

#無限円(Infinity Circle)の描画
radians0<-seq(0,2*pi,length=60)
Real0<-Re(f0(radians0))
Imaginal0<-Im(f0(radians0))
Rtime0<-numeric(60)
lines3d(Real0,Imaginal0,Rtime0,col=rgb(0,1,0),lwd=2)
lines3d(Real0,Imaginal0,Rtime0+1,col=rgb(0,1,0),lwd=2)
lines3d(Real0,Imaginal0,Rtime0+2,col=rgb(0,1,0),lwd=2)

#観測原点**(Observation Origin)
texts3d(0,0,0,texts="OO(0,0,0)",col=rgb(0,0,0),adj=1.0)

#座標「1」表示
texts3d(0,0,1,texts="(0,0,1)",col=rgb(0,0,1),adj=1.0)
#座標「2」表示
texts3d(0,0,2,texts="(0,0,2)",col=rgb(0,0,1),adj=1.0)
#数直線(Line)
lines3d(c(0,0),c(0,0),c(0,2),col=rgb(0,0,1),lwd=2)

movie3d(spin3d(axis=c(0,0,1),rpm=5),duration=10,fps=25,movie="~/Desktop/sylinder08") 
```
負方向のみの場合。
![image.gif](https://cdn-ak.f.st-hatena.com/images/fotolife/o/ochimusha01/20201202/20201202105840.gif)

```R
library(rgl)
f0<-function(x){exp(x*(0+1i))}

#円筒描画
radians<-seq(0,120*pi,length=5000)
Real<-Re(f0(radians))
Imaginal<-Im(f0(radians))
Rtime<-seq(-2,0,length=3000)
plot3d(Real,Imaginal,Rtime,type="l",xlim=c(-1,1),ylim=c(-1,1),zlim=c(-2,0),xlab="",ylab="",zlab="",col=c(200,200,200))

#無限円(Infinity Circle)の描画
radians0<-seq(0,2*pi,length=60)
Real0<-Re(f0(radians0))
Imaginal0<-Im(f0(radians0))
Rtime0<-numeric(60)
lines3d(Real0,Imaginal0,Rtime0,col=rgb(0,1,0),lwd=2)
lines3d(Real0,Imaginal0,Rtime0-1,col=rgb(0,1,0),lwd=2)
lines3d(Real0,Imaginal0,Rtime0-2,col=rgb(0,1,0),lwd=2)

#観測原点**(Observation Origin)
texts3d(0,0,0,texts="OO(0,0,0)",col=rgb(0,0,0),adj=1.0)

#座標「1」表示
texts3d(0,0,-1,texts="(0,0,-1)",col=rgb(1,0,0),adj=1.0)
#座標「2」表示
texts3d(0,0,-2,texts="(0,0,-2)",col=rgb(1,0,0),adj=1.0)
#数直線(Line)
lines3d(c(0,0),c(0,0),c(0,-2),col=rgb(1,0,0),lwd=2)

movie3d(spin3d(axis=c(0,0,1),rpm=5),duration=10,fps=25,movie="~/Desktop/sylinder10") 
```
両表示の場合。
![image.gif](https://cdn-ak.f.st-hatena.com/images/fotolife/o/ochimusha01/20201202/20201202110929.gif)

```R
library(rgl)
f0<-function(x){exp(x*(0+1i))}

#円筒描画
radians<-seq(0,120*pi,length=5000)
Real<-Re(f0(radians))
Imaginal<-Im(f0(radians))
Rtime<-seq(-1,1,length=3000)
plot3d(Real,Imaginal,Rtime,type="l",xlim=c(-1,1),ylim=c(-1,1),zlim=c(-1,1),xlab="",ylab="",zlab="",col=c(200,200,200))

#無限円(Infinity Circle)の描画
radians0<-seq(0,2*pi,length=60)
Real0<-Re(f0(radians0))
Imaginal0<-Im(f0(radians0))
Rtime0<-numeric(60)
lines3d(Real0,Imaginal0,Rtime0,col=rgb(0,1,0),lwd=2)
lines3d(Real0,Imaginal0,Rtime0+1,col=rgb(0,1,0),lwd=2)
lines3d(Real0,Imaginal0,Rtime0-1,col=rgb(0,1,0),lwd=2)

#観測原点**(Observation Origin)
texts3d(0,0,0,texts="OO(0,0,0)",col=rgb(0,0,0),adj=1.0)

#座標「1」表示
texts3d(0,0,1,texts="(0,0,1)",col=rgb(0,0,1),adj=1.0)
#座標「2」表示
texts3d(0,0,-1,texts="(0,0,-1)",col=rgb(1,0,0),adj=1.0)
#数直線(Line)
lines3d(c(0,0),c(0,0),c(0,1),col=rgb(0,0,1),lwd=2)
lines3d(c(0,0),c(0,0),c(0,-1),col=rgb(1,0,0),lwd=2)

movie3d(spin3d(axis=c(0,0,1),rpm=5),duration=10,fps=25,movie="~/Desktop/sylinder13") 
```

④そして**Z軸**に**対数尺**を導入すると「<font color=purple>卵形</font>」に。
![image.gif](https://cdn-ak.f.st-hatena.com/images/fotolife/o/ochimusha01/20201106/20201106233928.gif)

```R
library(rgl)
#円描写関数
f0<-function(x){exp(x*(0+1i))}

#無限円(Infinity Circle)
radians0<-seq(0,60*pi,length=60)
Real0<-Re(f0(radians))
Imaginal0<-Im(f0(radians))
Rtime0<-exp(numeric(60))

#無限球面(Infinity Sphere)
radians<-seq(0,60*pi,length=3000)
Real<-Re(f0(radians))
Imaginal<-Im(f0(radians))
Rtime<-seq(-1,1,length=3000)
RtimeZ<-exp(Rtime)

#工夫
f1<-function(x){sqrt(1-x^2)}
c0<-seq(-1,1,length=3000)
c1<-f1(c0)
#> plot(c0,c1,type="l",xlim=c(-1,1),ylim=c(0,1))
Real_c<-Real*c1
Imaginal_c<-Imaginal*c1

#無限球面(Infinity Sphere)の描画
plot3d(Real_c,Imaginal_c,RtimeZ,type="l",xlim=c(-1,1),ylim=c(-1,1),zlim=c(exp(-1),exp(1)),col=c(200,200,200))

#無限円(Infinity Circle)の描画
lines3d(Real0,Imaginal0,Rtime0,col=rgb(1,0,0),lwd=2)

#観測原点**(Observation Origin)
texts3d(0,0,exp(0),texts="OO(0,0,exp(0))",col=rgb(1,0,0),adj=1.0)

#原蹠表示
texts3d(portal_i,portal_j,portal_k,texts=portal_text,col=rgb(1,0,0),adj=1.0)

#原蹠(PorTal)
portal_i<-0
portal_j<-0
portal_k<-exp(1)
portal_text="AP(0,0,exp(1)"

#原蹠表示
texts3d(portal_i,portal_j,portal_k,texts=portal_text,col=rgb(1,0,0),adj=1.0)

#対蹠(AntiPordal)
antipordal_i<-0
antipordal_j<-0
antipordal_k<-exp(-1)
antipordal_text="AP(0,0,exp(-1))"

#対蹠表示
texts3d(antipordal_i,antipordal_j,antipordal_k,texts=antipordal_text,col=rgb(1,0,0),adj=1.0)

#立方対角線(Cubic Diagonal)
lines3d(c(portal_i,antipordal_i),c(portal_j,antipordal_j),c(portal_k,antipordal_k),col=rgb(1,0,0),lwd=2)

#アニメーション
movie3d(spin3d(axis=c(0,0,1),rpm=5),duration=10,fps=25,movie="~/Desktop/Sphere09")
```
以下続報…