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

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

前言

本篇学习使用numpy生成球面斐波那契网格。

斐波那契网格公式

对于一个球体,要在球体表面上均匀选取N个点,就可以使用斐波那契网格公式:
z n = r ( 2 n − 1 N − 1 ) x n = r 1 − z n 2 ⋅ cos ⁡ ( 2 π n ϕ ) y n = r 1 − z n 2 ⋅ sin ⁡ ( 2 π n ϕ ) ϕ = 5 − 1 2 z_n = r(\frac{2n-1}{N} - 1) \\ \quad \\ x_n = r\sqrt{1-z_n^2}\cdot \cos(2\pi n\phi) \\ \quad \\ y_n = r\sqrt{1-z_n^2}\cdot \sin(2\pi n\phi) \\ \quad \\ \phi = \frac{\sqrt{5} - 1}{2} zn=r(N2n11)xn=r1zn2 cos(2πnϕ)yn=r1zn2 sin(2πnϕ)ϕ=25 1
其中, r r r表示球半径, ϕ \phi ϕ即黄金分割比例。

代码

通过numpy形成斐波那契网格点云,然后通过open3d来可视化点云图:

import open3d as o3d
import cv2
import numpy as np


if __name__ == '__main__':
    vis = o3d.visualization.Visualizer()
    N = 1000
    r = 1
    phi = (np.sqrt(5) - 1) / 2
    n = np.arange(0, N)
    z = ((2*n + 1) / N - 1)
    x = (np.sqrt(1 - z**2)) * np.cos(2 * np.pi * (n + 1) * phi)
    y = (np.sqrt(1 - z**2)) * np.sin(2 * np.pi * (n + 1) * phi)
    print(z.shape, x.shape, y.shape)
    pcd = r * np.stack([x, y, z], axis=-1)
    print(pcd.shape)
    point_cloud = o3d.geometry.PointCloud()
    point_cloud.points = o3d.utility.Vector3dVector(pcd)
    vis.add_geometry(point_cloud)
    o3d.visualization.draw_geometries([point_cloud])

取100个点的效果:
在这里插入图片描述
取1000个点的效果:
在这里插入图片描述

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值