在球体上均匀分散n个点

ale*_*vas 18 algorithm math geometry integrate

我试图在球体上分散n个点,使得每个点在其周围具有"相同"区域.基本上,我试图通过评估n个点并假设每个区域元素是相同的(并且等于4pi r ^ 2/n)来在球体上集成函数.

我的问题与问题非常相关,但我似乎无法同意"接受"答案中提供的代码按预期工作(参见附图,通过选择R = 1000,nx = ny = 40生成).显然,我的观点更加集中在两极并且非常集中在赤道上.

有什么建议?

编辑:作为参考,我确实找到了一些生成网格的软件,使得每个点周围都有相等的"区域"(向下滚动以查看球体上的均匀区域分布),但是不是实现它们的代码,而是使用较少的 -耗时的方法:我简单地迭代方位角和极角([0,2pi]和[0,pi])并计算每个补片的''无穷小''区域(da = r ^ 2 sin theta dtheta dphi).这基本上是我在整个领域进行整合所需要的,我只是希望统一区域分布不会那么难实现.

Kli*_*lik 10

背景资料:

球体中有4个pi球面度,这是球体中的总"度数",但我仅在相对意义上使用该术语,因为球面度与圆形中的常规弧度非常不同,因为它们是3维的,因此很坚固 只要将它们视为球体中的冰淇淋形角度即可. 在此输入图像描述

http://en.wikipedia.org/wiki/Steradian提供了一个很好的例子.

它们与半径有直接关系,就像圆圈中的弧度一样.1个球面度= 1个半径的平方.

因此,首先要找出需要在球体上绘制多少项目.让这个数字n. sr=球面度(测量单位)= r^2(半径平方)

4 pi / n sr = x

x 是指每个点分配了多少立体圈.

让我们说4分.

4 pi / 4 sr = x

pi sr = x 所以每个点都会得到一个分配的空间pi sr.

现在考虑一下......因为你正在绘制点,我们将考虑每个点将被放置在分配空间的中间......也就是说,在锥形区域的中间是什么sr.现在你需要考虑一下,是否可以用圆圈完全填充一个区域?说真的,想一想......不是吗?在某些位置,实心圆圈总会留出空间.想一下足球.它由可以组合在一起以提供均匀分布的形状构成.这个想法的要点是让你意识到所有的点都不能完全相隔一定距离 - 就像一个圆的半径一样.然而,足球方块的中心非常接近并且是均匀的.

如果我是你,我会做的就是尝试编写一种算法,以确定最有效的"形状",将这些"块"分配给球形空间......就像足球一样.否则,我认为这可能是你将得到的最佳答案...... 4 pi / n sr = x...,没有办法对每个点进行绘制,因此彼此之间的距离完全相同(除了在某些配置中,即它可以使用特殊数量的点),可能有一个算法可以找到所有特殊情况.

我正在编辑这个答案以详细说明特殊情况,我认为这里有一些额外的信息.点等距离的特殊情况是它们可能形成柏拉图固体的顶点.只有5种基本的柏拉图固体形状,其他都是由这些形状制成的.

阅读此页面以获取更多信息和此https://www.uwgb.edu/dutchs/symmetry/platonic.htm的证明

现在我不能信任,我做了一些快速研究,发现了类似的帖子 https://math.stackexchange.com/questions/279544/return-an-array-of-evenly-distributed-points-on-a-球给半径和原产地

使用Euler的多面体公式 http://plus.maths.org/content/eulers-polyhedron-formula

事实上,在多面体上只存在三个基本形状,"三角形,正方形和六边形",您可以创建一个算法来将要绘制的点数舍入到最近的多面体形状并均匀地绘制每个形状.

在此输入图像描述

哦,看看这篇伟大的文章,它解释了steradians和3维'度'比我好得多.http://mathforum.org/library/drmath/view/55358.html


wim*_*wim 5

这是我刚刚在python中编写的一个示例算法:

from numpy import random, cos, sin, sqrt, pi
from mpl_toolkits.mplot3d import Axes3D
import matplotlib.pyplot as plt

def rand_sphere(n):
  """n points distributed evenly on the surface of a unit sphere""" 
  z = 2 * random.rand(n) - 1   # uniform in -1, 1
  t = 2 * pi * random.rand(n)   # uniform in 0, 2*pi
  x = sqrt(1 - z**2) * cos(t)
  y = sqrt(1 - z**2) * sin(t)
  return x, y, z

x, y, z = rand_sphere(200)
fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')
ax.scatter(x, y, z)
plt.show()
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

再次得到10000分:

在此输入图像描述

  • 对 - 这使用随机分布点.我希望有一个结构化的分发算法.从统计学上讲,这(大部分)都是为此目的而工作,但有没有办法保证统一的区域分布? (4认同)