立体角を変数とする関数 by RY

こちらから

  • t+s=pi/2 AND f(t)^2+f(s)^2=1の2条件だけだと,f(x)=sqrt(x/(pi/2))とかが満足する。

ので追加条件が必要で

  • (1)"あとは連続性の仮定など、cosの一意性の条件"となるわけですが。
    • それは微分の条件なのではないかと思います。どうやるかはきちんと考えていないです。
    • 連続性条件は「象限の辺縁でその辺縁を作る線・面に直交する」
    • それ以外の場所では、どの方向への偏微分も等しく、また、それは、場所によって変わらない(曲率一定) (Wiki)
    • ラボの本棚:(東京出張中なので僕も読めませんが)

じっくり学ぶ曲線と曲面―微分幾何学初歩

じっくり学ぶ曲線と曲面―微分幾何学初歩

  • Rを使って見る
#3D第一象限にある3点が作る立体角を求める
KyuumenSankaku<-function(v1,v2,v3){
 t12<-acos(sum(v1*v2))
 t23<-acos(sum(v2*v3))
 t31<-acos(sum(v3*v1))

 s1<-acos((cos(t23)-cos(t31)*cos(t12))/(sin(t12)*sin(t31)))
 s2<-acos((cos(t31)-cos(t12)*cos(t23))/(sin(t12)*sin(t23)))
 s3<-acos((cos(t12)-cos(t31)*cos(t23))/(sin(t31)*sin(t23)))

 area<-s1+s2+s3-pi

# 返り値のarea2は1のときに立体角がpi/2
 list(vs=matrix(c(v1,v2,v3),ncol=3,byrow=TRUE),t=c(t12,t23,t31),s=c(s1,s2,s3),area=area,area2=area/(pi/2))

}
#3D第一象限にある点が(1,0,0),(0,1,0),(0,0,1)と作る立体角(KyuumenSankaku()の返り値のarea2を返す
Rittaikaku3<-function(x){
 v1<-c(1,0,0)
 v2<-c(0,1,0)
 v3<-c(0,0,1)
 a12<-KyuumenSankaku(x,v1,v2)$area2
 a23<-KyuumenSankaku(x,v2,v3)$area2
 a31<-KyuumenSankaku(x,v3,v1)$area2
 c(a23,a31,a12)
}

# df 次元の半径rの球面上の点をランダムに均等にn個発生させる関数
RandomSphere<-
function (df = 3, r = 1, n = 100) 
{
    rs <- matrix(rnorm(df * n), nrow = n) # 多次元正規乱数を用いる
    rs/sqrt(apply(rs^2, 1, sum)) * r # 半径rにする
}
# 第一象限ランダム点の発生
Npoints<-10000
xs<-abs(RandomSphere(df=3,r=1,n=Npoints)) # 3成分の絶対値を取って第一象限化
thetas<-xs # 3立体角を格納する
for(i in 1:Npoints){
 thetas[i,]<-Rittaikaku3(xs[i,]) # 発生させた点について逐一、立体角を計算し格納
}

# xs と thetasとのコプロット
plot(as.data.frame(cbind(xs,thetas)))


par(mfcol=c(1,2)) # 描図領域を1行2列に分割
# 第一図
# thetaとxとの関係は、三角関数に似た形
# ただし、三角関数によって、下限が作られている
plot(thetas[,1],xs[,1]) 
par(new=TRUE) # 重ねて描図
plot(thetas[,1],sin(thetas[,1]*pi/2),col="red") #三角関数

# 第二図
# theta 3成分から、ディリクレ正三角形を作り、そこに、x第一成分の値でグラデーションをしてプロット
# 緩い曲線の等高線が見える
plot(thetas[,1],sqrt(3)/2*(thetas[,2]-thetas[,3]),col=gray(xs[,1]))