Algorithm 在球形帽上查找均匀分布的随机点

Algorithm 在球形帽上查找均匀分布的随机点,algorithm,math,geo,Algorithm,Math,Geo,我有一个400米到1000米的纬度、经度和半径,形成一个。我需要在那顶帽子上找到一个随机点。这些点必须均匀分布在整个区域 还有一个与发现有关的问题。我的第一个想法是将cap投影到笛卡尔平面上,并使用圆算法。半径足够小,不应存在重要的误差水平 我不确定投影然后将点转换回lat/lng是否是最简单的解决方案,也不确定wiki页面theta+phi=90中提到的该问题的其他可能解决方案。另一方面,由于帽上所有点的r都是固定的,我们只需要设置theta的值。因此,您可以从0到theta值(与cap相关)

我有一个400米到1000米的纬度、经度和半径,形成一个。我需要在那顶帽子上找到一个随机点。这些点必须均匀分布在整个区域

还有一个与发现有关的问题。我的第一个想法是将cap投影到笛卡尔平面上,并使用圆算法。半径足够小,不应存在重要的误差水平


我不确定投影然后将点转换回lat/lng是否是最简单的解决方案,也不确定wiki页面
theta+phi=90
中提到的该问题的其他可能解决方案。另一方面,由于帽上所有点的
r
都是固定的,我们只需要设置
theta
的值。因此,您可以从
0
theta
值(与cap相关)中选择一个随机值,并通过解释的约束定义该点

您可以使用sqrt分布生成0..360范围内的随机方位角和随机距离,以提供统一分布

d = maxR * Sqrt(random(0..1))
theta = random(0..1) * 2 * Pi
然后使用所述的方位角和距离获取地质点坐标。
(目标点与起点之间给定距离和方位)


对于一个与球体半径相比非常小的圆盘,除非你非常接近极点,否则狭长投影将近似为一个椭圆

首先计算给定纬度处的拉伸:

double k = cos(latitude * PI / 180);
然后以纬度度计算圆盘半径

// A latitude arc-second is 30.87 meters
double R = radius / 30.87 / 3600 * PI / 180;
然后计算圆中的均匀随机点

double a = random() * 2 * PI;
double r = R * sqrt(random());
您在光盘中的随机点将是

double random_lat = (latitude*PI/180 + r*cos(a))/PI*180;
double random_longitude = (longitude*PI/180 + (r/k)*sin(a))/PI*180;

这看起来不错。我只是想了解这一切。所以平方根中的随机变量更有可能选择更高的值来弥补空间更大的事实?是的。环形面积与半径的平方成正比,所以为了提供均匀的填充,我们使用了反函数,得到了这种效果,而且效果很好。唯一让我吃惊的是第二部分接受lat,lng(弧度)。
double random_lat = (latitude*PI/180 + r*cos(a))/PI*180;
double random_longitude = (longitude*PI/180 + (r/k)*sin(a))/PI*180;