open3D源码分析第六篇

本文详细介绍了八叉树(Octree)数据结构,包括其节点类、内部节点、叶节点的实现,以及如何从点云转换为八叉树。八叉树在三维空间数据组织、遍历和查询中具有高效性,适用于三维场景的存储和检索。文章还涵盖了八叉树与VoxelGrid之间的转换,并提供了插入点、遍历和定位叶节点的方法。
摘要由CSDN通过智能技术生成

2021SC@SDUSC

Octree.h

注释中文部分是源码解读,分析和问题在源码之后

#include <cstddef>
#include <memory>
#include <vector>

#include "open3d/geometry/Geometry3D.h"
#include "open3d/utility/IJsonConvertible.h"

namespace open3d {
   
namespace geometry {
   

class PointCloud;
class VoxelGrid;

// OctreeNode信息类class OctreeNodeInfo
// 简要的OctreeNode信息。
// OctreeNodeInfo即时计算,不与节点一起存储。
class OctreeNodeInfo {
   
public:
    // 默认构造函数
    // 所有值初始化为0.
    OctreeNodeInfo() : origin_(0, 0, 0), size_(0), depth_(0), child_index_(0) {
   }

    // 参数化构造函数。
    OctreeNodeInfo(const Eigen::Vector3d& origin,// 节点的原点坐标
                   const double& size,// 节点的大小
                   const size_t& depth,// 节点到根的深度。根是深度0。
                   const size_t& child_index)// 子节点索引
        : origin_(origin),
          size_(size),
          depth_(depth),
          child_index_(child_index) {
   }
    ~OctreeNodeInfo() {
   }

public:
    // 节点的原点坐标
    Eigen::Vector3d origin_;
    // 节点的大小
    double size_;
    // 节点到根的深度。根是深度0。
    size_t depth_;
    // 子节点索引
    size_t child_index_;
};

// 八叉树类class OctreeNode
// 八叉树节点的基础类。
//设计决策:不要存储节点的来源和大小
//-好:空间效率更高。
//-差:遍历时需要重新计算原点和大小。
class OctreeNode : public utility::IJsonConvertible {
   
public:
    // 默认构造函数
    OctreeNode() {
   }
    virtual ~OctreeNode() {
   }

    // 工厂函数通过解析json值来构建OctreeNode。
    static std::shared_ptr<OctreeNode> ConstructFromJsonValue(
            const Json::Value& value);
};

//OctreeInternalNode类,包含OctreeNode子节点。
//子节点排序约定如下。
//为了说明,假设,
// - root_node: origin == (0, 0, 0), size == 2
// - children_[0]: origin == (0, 0, 0), size == 1
// - children_[1]: origin == (1, 0, 0), size == 1, along X-axis next to child 0
// - children_[2]: origin == (0, 1, 0), size == 1, along Y-axis next to child 0
// - children_[3]: origin == (1, 1, 0), size == 1, in X-Y plane
// - children_[4]: origin == (0, 0, 1), size == 1, along Z-axis next to child 0
// - children_[5]: origin == (1, 0, 1), size == 1, in X-Z plane
// - children_[6]: origin == (0, 1, 1), size == 1, in Y-Z plane
// - children_[7]: origin == (1, 1, 1), size == 1, furthest from child 0
class OctreeInternalNode : public OctreeNode {
   
public:
    // 默认构造函数
    OctreeInternalNode() : children_(8) {
   }
    static std::shared_ptr<OctreeNodeInfo> GetInsertionNodeInfo(
            const std::shared_ptr<OctreeNodeInfo>& node_info,
            const Eigen::Vector3d& point);

	//获取lambda函数
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值