18

我试图在一个球体上分散 n 个点,使每个点都有“围绕”它的“相同”区域。基本上,我试图通过评估 n 点并假设每个区域元素相同(并且等于 4pi r^2/n)来在球体上集成一个函数。

我的问题与这个问题非常相关,但我似乎不同意“已接受”答案中提供的代码按预期工作(见附图,通过选择 R = 1000,nx = ny = 40 生成)。显然,我的观点更加集中在两极,而在赤道沿线非常不集中。

有什么建议么?

编辑:作为参考,我确实找到了一些生成网格的软件,使得每个点在其周围具有相等的“面积”(向下滚动以查看球体上的均匀区域分布),但我没有实现他们的代码,而是使用了一个 less-耗时的方法:我简单地迭代方位角和极角([0,2pi] 和 [0,pi])并计算每个补丁的“无穷小”区域(da = r^2 sin theta dtheta dphi)。这基本上是我在球体上进行集成所需的全部内容,我只是希望均匀区域分布不会那么难以实现。

4

4 回答 4

11

背景资料:

一个球体中有 4 个 pi 球面度,这是球体中的总“度数”,但我仅在相对意义上使用该术语,因为球面度与圆形中的常规弧度非常不同,一方面,它们是 3 维的,因此是坚实的。只需将它们视为球体中的冰淇淋形状的角度。 在此处输入图像描述

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

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

因此,首先找出需要在球体上绘制多少项目。让那个数字成为nsr= 球面度(测量单位)= 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-球体半径和原点

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

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

在此处输入图像描述

哦,看看这篇很棒的文章,它比我更好地解释了球面度和 3 维“度数”。http://mathforum.org/library/drmath/view/55358.html

于 2013-02-11T07:33:50.410 回答
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()

在此处输入图像描述

再次获得 10000 分:

在此处输入图像描述

于 2013-02-11T04:04:21.973 回答
2

可能是错的,但如果

  1. 将两点之间的交互设置为 I(a,b) = (ab) / (|ab|)^3, a,b 作为 3D 空间中的向量受到威胁
  2. 对于第一次迭代,像往常一样放置点(在相等的角度距离,它是如何在 wim 帖子中提到的)
  3. 在算法的每个步骤中,您将根据 I 总和的梯度(从 1 开始)移动每个点,其中 I 仅在直接邻居上计算
  4. 重复 3 直到每个点的梯度变为 0。

该算法将收敛到您需要的配置。这很耗时,但您可以缓存不同数量的点的结果。

于 2013-02-11T08:35:38.673 回答
2

有一个软件可以定义球体的均匀像素化,使得每个点都被相同数量的立体角包围。结帐: http : //healpix.jpl.nasa.gov/ 他们还提供了几个例程来在 fortan、C、C++、python、mathlab 等中进行一些有用的计算......

于 2017-07-28T16:18:47.673 回答