立体角を変数とする関数 by RY
こちらから
- t+s=pi/2 AND f(t)^2+f(s)^2=1の2条件だけだと,f(x)=sqrt(x/(pi/2))とかが満足する。
ので追加条件が必要で
- (1)"あとは連続性の仮定など、cosの一意性の条件"となるわけですが。
- 作者: 中内伸光
- 出版社/メーカー: 共立出版
- 発売日: 2005/09/15
- メディア: 単行本
- 購入: 2人 クリック: 29回
- この商品を含むブログ (15件) を見る
- 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]))