球体表⾯随机均匀采样⽅法shell 程序(awk )
⼀个简单的均匀采样⽅法是:三维笛卡尔坐标系中⽣成随机点,并投影到球⾯上,这样⽣成的点才会均匀。即⽣成三个⾼斯随机变量,x , y ,和z ,那么以下变量在三维球⾯上均匀分布的(Muller 1959, Marsaglia 1972):
在shell脚本中写⼀个awk函数即可实现,以下代码实现随机选取两个点,输出它们的经纬度和⼤圆弧距离,输出五列单位均为度。shell程序的编写流程
备注:
seed代表最终⽣成⽂件⼤致⾏数
norma代表A点到球⼼距离
normb代表B点到球⼼距离
dis代表AB点之间弦长
arc代表AB点之间⼤圆弧长(度为单位)
References
Marsaglia, G. "Choosing a Point from the Surface of a Sphere." Ann. Math. Stat. 43, 645-646, 1972.Muller, M. E. "A Note on a Method for Generating Points Uniformly on N
-Dimensional Spheres." Comm. Assoc. Comput. Mach. 2, 19-20, Apr. 1959.
,弧
noun: 弧, 弧形, 弧光 1 seed=10000
2 sum =$(echo $seed*36/3.1416/3.1416 | bc)
3 awk 'BEGIN{srand();
4 for ( i=0; i<='"$sum"'; i++ ){
5 xa=2*rand()-1;
6 ya=2*rand()-1;
7 za=2*rand()-1;
8 xb=2*rand()-1;
9 yb=2*rand()-1;
10 zb=2*rand()-1;
11 norma=sqrt(xa*xa+ya*ya+za*za)
12 normb=sqrt(xb*xb+yb*yb+zb*zb)
13 if (norma<0.00001 || normb<0.00001) continue
14 if (xa*xa+ya*ya+za*za<1.0 && xb*xb+yb*yb+zb*zb<1.0){
15 xa=xa/norma
16 ya=ya/norma
17 za=za/norma
18 xb=xb/normb
19 yb=yb/normb
20 zb=zb/normb
21 dis=sqrt((xb-xa)^2+(yb-ya)^2+(zb-za)^2)
22 lona=atan2(ya,xa)/0.017453
23 lonb=atan2(yb,xb)/0.017453
24 lata=90-atan2(sqrt(xa*xa+ya*ya),za)/0.017453
25 latb=90-atan2(sqrt(xb*xb+yb*yb),zb)/0.017453
26 arc=2*atan2(dis/2,sqrt(1-dis*dis/4))/0.017453
27 printf("%8.2f %7.2f %8.2f %7.2f %8.3f\n",
28 lona,lata,lonb,latb,arc)
29 }
30 }
31 }' > sphere_
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论