我需要一个算法,它可以给我一个球体周围N个点(可能少于20个)的位置,并模糊地将它们分散开来。不需要“完美”,但我只需要它,这样它们就不会被捆绑在一起。
我遇到的其他一些问题线程谈到了随机化的均匀分布,这增加了我不关心的复杂性。我很抱歉,这是一个愚蠢的问题,但我想表明,我真的很努力地寻找,但仍然没有达到。
所以,我要找的是一个简单的伪代码,在一个单位球面上均匀分布N个点,返回的坐标是球面坐标或笛卡尔坐标。如果它甚至可以随机化地分布,那就更好了(想一想围绕恒星的行星,分布得很好,但有回旋余地)。
发布于 2012-03-07 20:15:01
在this example code中,node[k]
只是第k个节点。您将生成一个数组N点,node[k]
是第k个点(从0到N-1)。如果这就是所有让你困惑的地方,希望你现在就能使用它。
(换句话说,k
是一个大小为N的数组,它是在代码片段开始之前定义的,并且包含一个点的列表)。
或者,在这里构建另一个答案(并使用Python):
> cat ll.py
from math import asin
nx = 4; ny = 5
for x in range(nx):
lon = 360 * ((x+0.5) / nx)
for y in range(ny):
midpt = (y+0.5) / ny
lat = 180 * asin(2*((y+0.5)/ny-0.5))
print lon,lat
> python2.7 ll.py
45.0 -166.91313924
45.0 -74.0730322921
45.0 0.0
45.0 74.0730322921
45.0 166.91313924
135.0 -166.91313924
135.0 -74.0730322921
135.0 0.0
135.0 74.0730322921
135.0 166.91313924
225.0 -166.91313924
225.0 -74.0730322921
225.0 0.0
225.0 74.0730322921
225.0 166.91313924
315.0 -166.91313924
315.0 -74.0730322921
315.0 0.0
315.0 74.0730322921
315.0 166.91313924
如果你绘制这个图,你会发现两极附近的垂直间距更大,所以每个点都位于大约相同的总空间区域内(在两极附近,“水平”的空间更小,所以“垂直”的空间更大)。
这并不是说所有的点到他们的邻居的距离都是一样的(这就是我认为你的链接所说的),但它可能足以满足你的需求,并在简单地制作一个统一的经纬度网格的基础上有所改进。
发布于 2014-10-01 01:51:24
Fibonacci球面算法在这方面很好用。它速度很快,给出的结果看起来很容易迷惑人的眼睛。You can see an example done with processing,它将随着时间的推移将结果显示为添加的点。由@gman制作的Here's another great interactive example。下面是一个简单的python实现。
import math
def fibonacci_sphere(samples=1000):
points = []
phi = math.pi * (3. - math.sqrt(5.)) # golden angle in radians
for i in range(samples):
y = 1 - (i / float(samples - 1)) * 2 # y goes from 1 to -1
radius = math.sqrt(1 - y * y) # radius at y
theta = phi * i # golden angle increment
x = math.cos(theta) * radius
z = math.sin(theta) * radius
points.append((x, y, z))
return points
1000个样本为您提供了以下内容:
发布于 2012-03-08 01:32:59
这就是所谓的球面上的堆积点,没有(已知的)通用的、完美的解决方案。然而,有很多不完美的解决方案。最受欢迎的三个似乎是:
n
)选择其中的样本。您可以跟踪球体周围的缓和曲线,并在缓和曲线周围均匀分布点。由于涉及的数学问题,这些方法比模拟更难理解,但速度要快得多(可能涉及的代码也更少)。最受欢迎的似乎是Saff, et al.有关此问题的更多信息,请访问here
https://stackoverflow.com/questions/9600801
复制相似问题