从源代码重写项目Laplace-Beltrami Operator的笔记——2

时光毁灭记忆、已成空白 提交于 2020-03-10 08:51:09

今天开始写 计算LB算子的class 的声明,其中阅读源代码时遇到一个问题:

namespace pclbo {

/*从输入的mesh数据中计算Laplace-Beltrami算子 */
#include <vector>
#include <numeric>

#include <Eigen/Sparse>
#include <pcl/common/common_headers.h>
#include <pcl/PolygonMesh.h>
#include <pcl/conversions.h>

class MeshLBOEstimation {
    public:
        /*空的构造函数*/
        MeshLBOEstimation () : input_mesh_(), area(new std::vector<double>()) {}

        /*空的析构函数*/
        virtual ~MeshLBOEstimation () {}

        inline void
        setInputMesh (const pcl::PolygonMeshConstPtr &input)
        { input_mesh_ = input; }

        /*计算LB算子*/
        void compute ();

        /** \brief Surface area */
        double surface_area;

        /** \brief Average edge length. */
        double avg_edge_length;

        /** \brief Input polygonal mesh. */
        pcl::PolygonMeshConstPtr input_mesh_;

        /** \brief Laplace-Beltrami Operator */
        Eigen::SparseMatrix<double> L;
        
        /** \brief Mass matrix. */
        Eigen::SparseMatrix<double> M;

        /** \brief faces area. */
        std::shared_ptr<std::vector<double> > area;

}; // class MeshLBOEstimation

} // namespace pclbo

遇到的问题:

  1. MeshLBOEstimation () : input_mesh_(), area(new std::vector()) {}构造函数冒号后部分的意思:
    此处冒号后面其实是调用某个成员的构造函数以完成初始化,还可以是对父类的初始化,这里应该是属于初始化成员input_mesh和area

  2. 关于pcl::PolygonMeshConstPtr,写在pcl/PolygonMesh.h:
    主要参考该博客pcl::PolygonMesh简析
    PolygonMesh这个类用于描述三角网格,其数据构成主要有三维点的坐标、构成三角面的点的索引以及法向量等。下面是类PolygonMesh的声明。

#include <string>
    5 #include <vector>
    6 #include <ostream>
    7 
    8 // Include the correct Header path here
    9 #include <pcl/PCLHeader.h>
   10 #include <pcl/PCLPointCloud2.h>
   11 #include <pcl/Vertices.h>
   12 
   13 namespace pcl
   14 {
   15   struct PolygonMesh
   16   {
   17     PolygonMesh () : header (), cloud (), polygons ()
   18     {}
   19 
   20     ::pcl::PCLHeader  header;
   21 
   22     ::pcl::PCLPointCloud2 cloud;
   23 
   24     std::vector< ::pcl::Vertices>  polygons;
   25 
   26 
   27   public:
   28     typedef boost::shared_ptr< ::pcl::PolygonMesh> Ptr;
   29     typedef boost::shared_ptr< ::pcl::PolygonMesh const> ConstPtr;
   30   }; // struct PolygonMesh
   31 
   32   typedef boost::shared_ptr< ::pcl::PolygonMesh> PolygonMeshPtr;
   33   typedef boost::shared_ptr< ::pcl::PolygonMesh const> PolygonMeshConstPtr;
   34 
   35   inline std::ostream& operator<<(std::ostream& s, const  ::pcl::PolygonMesh &v)
   36   {
   37     s << "header: " << std::endl;
   38     s << v.header;
   39     s << "cloud: " << std::endl;
   40     s << v.cloud;
   41     s << "polygons[]" << std::endl;
   42     for (size_t i = 0; i < v.polygons.size (); ++i)
   43     {
   44       s << "  polygons[" << i << "]: " << std::endl;
   45       s << v.polygons[i];
   46     }
   47     return (s);
   48   }
   49 
   50 } // namespace pcl

在namespace pcl 中有

typedef boost::shared_ptr< ::pcl::PolygonMesh> PolygonMeshPtr;

PolygonMeshPtr是一个智能指针boost::shared_ptr,学习了这篇博客Boost智能指针——boost::shared_ptr(使用及原理分析),大概是一个用于共享指针的class,使用起来是
boost::shared_ptr<指针类型名> 指针名
在PolygonMesh中不单保存点的xyz信息,还保存点的颜色和法线向量,关于mesh的读取方法博客中也有介绍,pcl是利用VTK的IO接口,可以直接读取stl,ply,obj等格式的三维点云数据。(我也不知道是否是只有这种方式)

  1. Eigen::SparseMatrix是一个用于描述稀疏矩阵的class,见稀疏矩阵快速参考指南

遇到的问题:
对于如何输入mesh我还是比较模糊,仍没解决,而且是否有必要计算法向量,面积等我还是不确定,等最后读完源码改进代码时再来解决。(2020/3/9)

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!