我试图在球体上分散n个点,使得每个点在其周围具有“相同”区域。基本上,我试图通过评估n个点并假设每个区域元素相同(并且等于4pi r ^ 2 / n)来在球体上集成函数。
我的问题与this one非常相关,但我似乎无法同意“已接受”答案中提供的代码按预期工作(请参阅附图,通过选择R = 1000生成,nx = ny = 40)。显然,我的观点更集中在两极,并且非常不集中在赤道上。
有什么建议吗?
编辑:作为参考,我确实发现some software生成一个网格,使得每个点周围都有相等的“区域”(向下滚动以查看球体上的均匀区域分布),而不是实现它们的代码我采用了一种耗时较少的方法:我简单地迭代了方位角和极角([0,2pi]和[0,pi])并计算了每个补丁的''无穷小''区域(da = r ^ 2) sin theta dtheta dphi)。这基本上是我在整个领域进行整合所需要的,我只是希望统一区域分布不会那么难实现。
答案 0 :(得分:10)
背景资料:
一个球体中有4个π球面度,这是球体中的总“度”,但我仅在相对意义上使用该术语,因为球面度与圆周中的常规弧度非常不同,一个,它们是3尺寸因此是坚实的。只要将它们视为球体中的冰淇淋形角度即可。
http://en.wikipedia.org/wiki/Steradian提供了一个很好的例子。
它们与半径有直接关系,就像圆圈中的弧度一样。 1个球面度= 1个半径的平方。
因此,首先要了解需要在球体上绘制多少项目。让这个数字为n
。
sr
= steradians(度量单位)= 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-sphere-give-radius-and-origin
使用Euler的多面体公式 http://plus.maths.org/content/eulers-polyhedron-formula
并且在多面体上只存在三个基本形状的事实,'三角形,正方形和六边形',您可以创建一个算法来将要绘制的点数舍入到最近的多面体形状并均匀地绘制每个形状。
哦,看看这篇伟大的文章,它解释了比我更好的立体人和三维'度'。http://mathforum.org/library/drmath/view/55358.html
答案 1 :(得分: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分:
答案 2 :(得分:2)
可能是错的,但是如果
算法将汇聚到您需要的配置。这是时间消耗,但你可以缓存不同点数的结果。
答案 3 :(得分:1)
有一种软件可以定义球体的均匀像素化,使得每个点都被相同数量的立体角包围。查看: http://healpix.jpl.nasa.gov/ 他们还提供了几个例程来在fortan,C,C ++,python,mathlab等中进行一些有用的计算......