首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在球面上均匀分布n个点

在球面上均匀分布n个点
EN

Stack Overflow用户
提问于 2012-03-07 19:39:06
回答 15查看 122.2K关注 0票数 159

我需要一个算法,它可以给我一个球体周围N个点(可能少于20个)的位置,并模糊地将它们分散开来。不需要“完美”,但我只需要它,这样它们就不会被捆绑在一起。

  • This question提供了很好的代码,但我找不到一种方法来使这种一致性,因为这似乎100% randomized.
  • This blog post建议有两种方式允许输入球面上的点数,但Saff and Kuijlaars算法正是我可以转录的伪代码,而我找到的code example包含"nodek",我看不到它解释并破坏了这种可能性。第二个博客例子是黄金分割螺旋,它给了我奇怪的,捆绑的结果,没有明确的方法从this question定义一个常量radius.
  • This algorithm似乎是可能的,但我不能将该页面上的内容拼凑成伪代码或其他东西。

我遇到的其他一些问题线程谈到了随机化的均匀分布,这增加了我不关心的复杂性。我很抱歉,这是一个愚蠢的问题,但我想表明,我真的很努力地寻找,但仍然没有达到。

所以,我要找的是一个简单的伪代码,在一个单位球面上均匀分布N个点,返回的坐标是球面坐标或笛卡尔坐标。如果它甚至可以随机化地分布,那就更好了(想一想围绕恒星的行星,分布得很好,但有回旋余地)。

EN

回答 15

Stack Overflow用户

回答已采纳

发布于 2012-03-07 20:15:01

this example code中,node[k]只是第k个节点。您将生成一个数组N点,node[k]是第k个点(从0到N-1)。如果这就是所有让你困惑的地方,希望你现在就能使用它。

(换句话说,k是一个大小为N的数组,它是在代码片段开始之前定义的,并且包含一个点的列表)。

或者,在这里构建另一个答案(并使用Python):

代码语言:javascript
运行
复制
> 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

如果你绘制这个图,你会发现两极附近的垂直间距更大,所以每个点都位于大约相同的总空间区域内(在两极附近,“水平”的空间更小,所以“垂直”的空间更大)。

这并不是说所有的点到他们的邻居的距离都是一样的(这就是我认为你的链接所说的),但它可能足以满足你的需求,并在简单地制作一个统一的经纬度网格的基础上有所改进。

票数 15
EN

Stack Overflow用户

发布于 2014-10-01 01:51:24

Fibonacci球面算法在这方面很好用。它速度很快,给出的结果看起来很容易迷惑人的眼睛。You can see an example done with processing,它将随着时间的推移将结果显示为添加的点。由@gman制作的Here's another great interactive example。下面是一个简单的python实现。

代码语言:javascript
运行
复制
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个样本为您提供了以下内容:

票数 179
EN

Stack Overflow用户

发布于 2012-03-08 01:32:59

这就是所谓的球面上的堆积点,没有(已知的)通用的、完美的解决方案。然而,有很多不完美的解决方案。最受欢迎的三个似乎是:

  1. Create a simulation。将每个点视为约束在球体上的电子,然后针对一定数量的步骤运行模拟。电子的排斥力自然会使系统趋向于更稳定的状态,在这种状态下,点之间的距离大约与它们可以拒绝的距离一样远。这种听起来很奇特的方法实际上非常简单:在球体周围的立方体内部均匀选择点(比点多得多),然后拒绝球体外部的点。将剩余的点视为矢量,并对其进行规格化。这些是你的“样本”-使用某种方法(随机,贪婪,etc).
  2. Spiral n )选择其中的样本。您可以跟踪球体周围的缓和曲线,并在缓和曲线周围均匀分布点。由于涉及的数学问题,这些方法比模拟更难理解,但速度要快得多(可能涉及的代码也更少)。最受欢迎的似乎是Saff, et al.

有关此问题的更多信息,请访问here

票数 88
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9600801

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档