经纬度网格和斐波那契网格

转载自https://zhuanlan.zhihu.com/p/25988652?group_id=828963677192491008

1.问题

怎样在球面上「均匀」地排列许多点呢?
这是一个很有实际意义的问题。比如我要测量地球上陆地的总面积。如果能在地球表面均匀地取 n 个点,那么我只要简单地数一下其中落在陆地上的点的个数 m,就可以知道陆地面积约占地球总表面积的 m/n 了。注意,按照一定的经纬度间隔,取经纬线的交点是不行的,因为这样取出的点不均匀:两极附近的点比赤道处更密集,如下图所示。

2.解决方法

要严格解决这个问题,首先要把直观感觉上的「均匀」用数学语言定义出来。一种定义方法是:让各点之间距离的最小值最大。这样定义出来的问题叫 Tammes problem,是密铺问题(Packing problems)的一个特例。很不幸的是,密铺问题往往没有很优雅的解。另一种定义方法是:把各个点看成同种电荷,让整个系统的电势能最小。这个问题可以通过模拟电荷的运动来解决,但计算复杂度非常高,而且只能得到数值解。

经过一番搜索,我在 StackOverflow 上找到了一种令我惊艳的近似解法:Evenly distributing n points on a sphere。这种解法只用几个简单的公式,就给出了每个点的坐标。设球面半径为 1,一共要取 N 个点,则第 n 个点的坐标[公式]由下列公式给出:
其中常数[公式]正是黄金分割比。

用这套公式生成 1000 个点的效果如下,它惊人地符合我们对均匀的预期:

公式 (1~3) 生成的点阵,称为「菲波那契网格」(Fibonacci lattice 或 Fibonacci grid)。至于为什么叫菲波那契网格,目前可以简单地用「黄金分割比也出现在菲波那契数列中」来解释,在下文中你还会见到菲波那契数的出现。这篇文章(Measurement of areas on a sphere using Fibonacci and latitude–longitude lattices)说明,使用菲波那契网格测量球面上不规则图形的面积,与用经纬网格(并加权)相比,误差可以减小 40%。

仔细观察上图中点的分布,可以发现它其实有好几条特点:

    均匀:宏观上看,各处点的密度都差不多;密集:各点之间没有较大的缝隙,以容纳更多的点而不减小点的间距;混乱:点的排列似乎有规律,但具体是什么规律又说不出来。

我们在说「均匀」的时候,其实是暗含了这三条性质的。

公式 (1~3) 对于[公式]的值非常敏感。哪怕[公式]稍微偏离黄金分割比一丁点儿,作出的图效果就不好。例如,下面三个图分别是[公式]取 0.616、0.617 和 0.619 时得到的点阵。可以看到,[公式]时点阵在两极处形成螺旋,在赤道附近形成条纹,不满足「混乱」;而左、右图两中的点不仅形成螺旋或条纹,而且间距还很大,连「密集」都不满足。
  一个很自然的问题就是:为什么公式 (1~3) 有这么神奇的效果呢?我们先来看看它到底做了什么。

第一条公式[公式],说明各个点的竖坐标成等差数列。这相当于把球面切成相同厚度的 N 层,并在每一层的厚度中点处的表面上取一个点。注意,各层的厚度相同,但纬度的跨度是不同的:两极处纬度的跨度更大。这样切出来的各层有一个性质:侧面积都相等。这是因为各层的侧面可以近似看成环面,在纬度为[公式]处,环面的半径为[公式],而环面的宽度为[公式](思考:为什么要除以[公式]?),故各环面的面积均为[公式]。这个性质保证了点阵分布在宏观上的均匀性:不管在什么纬度,都是每[公式]面积上有一个点。

第二、三条公式[公式],实际上就是指明了各个点的经度成等差数列。也可以这样形象地理解:从每一个点到下一个点,首先沿着经线向上爬,使得竖坐标增加[公式];然后沿着纬线转[公式]圈。当然,[公式]比半圈大,只绕[公式]圈也是可以的,如下图所示。这两个值对应的角度分别为 222.5 度和 137.5 度,它们是把 360 度黄金分割后的两部分,称为「黄金角」(Golden angle)。
  正是[公式]这个常数让产生的点阵具有「密集」和「混乱」两条性质。这是为什么呢?我们观察前文中[公式]时的点阵,它明显形成几乎沿经线方向的条纹,仔细数一下的话,这样的条纹共有 21 条。原来,0.619 十分接近于分数 13/21(注意啦,13 和 21 都是菲波那契数哦),后者的精确值为[公式]。若每产生一个点转 0.619 圈,那么产生 21 个点一共就转过了差不多正好 13 圈。第 n 个点和第 n + 21 个点的经度十分接近,这就是条纹的来源。再看[公式]时的点阵,它形成 13 条螺旋。这是因为[公式](注意,8 和 13 也是菲波那契数),但误差比 0.619 和 13/21 大一些,所以条纹旋转了起来。从这两个例子我们可以发现,当[公式]接近分数 p/q 时,就会形成 q 条条纹或螺旋。要满足「密集」和「混乱」,就要选取不接近任何有理数的[公式]值。

网上有许多科普资料,说明「黄金分割比是最难用有理数逼近的无理数」,或称「最无理的无理数」,所以黄金角是能使得点阵最密集、最混乱的转角。说明方法一般是把黄金分割比[公式]写成连分式(Continued fraction):

要用有理数逼近,可以在连分式的任意一层截断,比如舍弃上式中省略号的部分。如果某一层分母的整数部分比较大,那么在这一层舍弃小数部分,误差就比较小。而黄金分割比的连分式中,每一层的分母都是 1,截断误差相对就比较大,故最难用有理数逼近。

但这种解释,我总觉得不够直接。比如,我还想弄清下列问题:

    当连分式中出现较大的项时,点阵会呈现怎样的分布?为什么当[公式]时,点阵在两极和赤道处呈现出不同的有规律分布,而[公式]取黄金分割比时则呈现一片混乱?[公式]真的是最优值吗?我在试探的过程中发现[公式]也不错(见下图对比),它比黄金分割比差在哪里?

斐波那契网格采样(在球面上均匀排列许多点)相关推荐

  1. Python numpy使用记录5.生成球面斐波那契网格

    Python numpy使用记录5.生成球面斐波那契网格 前言 斐波那契网格公式 代码 前言 本篇学习使用numpy生成球面斐波那契网格. 斐波那契网格公式 对于一个球体,要在球体表面上均匀选取N个点 ...

  2. 从正多面体到斐波拉契网格

    正多面体 正四面体 顶点坐标{A=(0,0,0)B=(0,a,0)C=(32a,12a,0)D=(36a,12a,63a)\begin{cases} A=(0,0,0)\\ B=(0,a,0)\\ C ...

  3. 我居然从一只猫身上学到了斐波那契数列

    猫的数学这么好 是有原因的 斐波那契数列(Fibonacci sequence) 是由数学家列昂纳多·斐波那契定义的 把它写成数列的形式是这样的: 1,1,2,3,5,8,13,21,34,55,89 ...

  4. 吴昊品游戏核心算法(新年特别篇)——另类取石子游戏(斐波那契博弈)

    吴昊继续,我再也不想搬一堆石头放在这里了,取而代之的是<编程之美>中的关于游戏章节的一个插图,这本书中也有对<取石子游戏>的较为完备的讨论. 这次的游戏是神马? 1堆石子有n个 ...

  5. Python数学计算工具3、Python 斐波那契数列-前500项列表

    百度解析: 斐波那契数列(Fibonacci sequence),又称黄金分割数列,因数学家莱昂纳多·斐波那契(Leonardo Fibonacci)以兔子繁殖为例子而引入,故又称为"兔子数 ...

  6. 斐波那契回调线怎么画_自动绘制斐波那契回调线的指标

    斐波那契回调线是根据斐波那契数列(也称为黄金分割数列)所对应的点画出来的一组线,它的作用主要是用来分析行情的回调力度及相应的回撤点上存在的支撑或阻力作用.黄金分割在外汇黄金交易市场上是一个被广泛应用的 ...

  7. python利用递归函数实现斐波那契数列_Python使用while循环输出斐波那契数列(Fibonacci)...

    斐波那契数列又称费波那契数列(意大利语:Successione di Fibonacci),又译为费波拿契数.斐波那契数列.费氏数列.黄金分割数列.在西方,首先研究这个数列的是比萨的列奥那多(意大利人 ...

  8. 利用递归、迭代解决斐波那契数列问题与汉诺塔难题

    有人说,"普通程序员使用迭代,天才程序员使用递归",真是这样吗? 1.浅谈递归与迭代 <1>递归的基本概念: 程序调用自身的编程技巧称为递归,是函数自己调用自己. 一个 ...

  9. 斐波那契数列不用数组_兔子数列——斐波那契数列

    相信人们都对斐波那契数列有或多或少的了解,如果没有,那你一定听过黄金分割比或是见过下面这种图片: 斐波那契生活在十三世纪的意大利,原名列奥纳多·皮萨诺(Leonardo Pisano),他出生在意大利 ...

最新文章

  1. oracle 从dbf恢复,oracle 误删 dbf 恢复
  2. 快速排序及优化(Java实现)
  3. maven-source 1.3 中不支持注释请使用 -source 5 或更高版本以启用注释
  4. sklearn中的Pipline(流水线学习器)
  5. MVC 登陆注册页面
  6. android photopicker怎么修改状态栏,有没有办法阻止UIImagePickerController更改状态栏样式?...
  7. boot sprint 项目结构_完美起航-【知识】SpringBoot项目结构目录
  8. 论高校计算机信息管理能力的提升,论高校计算机信息管理能力的提升
  9. 2016中国地理信息产业百强企业公示名单(转)
  10. redis java 存储对象_安装redis 并把java对象存放在redis中
  11. 【Linux】系统移植篇一--linux系统移植导学
  12. Java第32课——求数组元素最大值
  13. Nodejs: redis客户端通过mset方法一次性批量写入多个key的值
  14. 惠普服务器装centos 系统安装,hp 服务器安装linux系统安装
  15. 使用表格制作流量查询表
  16. LINUX 无法输入密码 或者数字键不能使用
  17. 时钟抖动(Jitter)和时钟偏斜(Skew)
  18. SAPBP_SAP刘梦_新浪博客
  19. 工具-Eclipse怎么离线安装JD-Eclipse反编译插件
  20. Burp Suite 工具 目录

热门文章

  1. 基准测试 计算机,用于 Windows、安卓和 iOS 系统的 3DMark 基准测试
  2. Gitee使用时TimeOut问题解决
  3. 大龄焦虑?如何看待程序员35岁职业危机?
  4. 基于IP的设计学习1:ug896.一些基本概念
  5. 软银拟出售价值72亿美元阿里股权:接近清仓 将推动Arm上市
  6. Setting学习(一)-静态界面
  7. 一篇博文带你0基础 Html和css入门
  8. Linux基础学习——用户权限管理
  9. springboot+视频网站 毕业设计-附源码240925
  10. 运营笔记:微信推广运营的这些中肯建议,请收藏!