PCL中常用的point有 pcl::PointXYZ,pcl::PointXYZI
这些point的定义在PCL库的 point_types.hpp中完成,下面是总结。
pcl::PointXYZ
定义
struct _PointXYZ
{
PCL_ADD_POINT4D; // This adds the members x,y,z which can also be accessed using the point (which is float[4])
PCL_MAKE_ALIGNED_OPERATOR_NEW
};
struct EIGEN_ALIGN16 PointXYZ : public _PointXYZ
{
inline PointXYZ (const _PointXYZ &p): PointXYZ(p.x, p.y, p.z) {}
inline PointXYZ (): PointXYZ(0.f, 0.f, 0.f) {}
inline PointXYZ (float _x, float _y, float _z)
{
x = _x; y = _y; z = _z;
data[3] = 1.0f;
}
friend std::ostream& operator << (std::ostream& os, const PointXYZ& p);
PCL_MAKE_ALIGNED_OPERATOR_NEW
};
PointXYZ是_PointXYZ的公有继承, _PointXYZ结构体中,包含PCL_ADD_POINT4D,这是一个宏,定义如下:
#define PCL_ADD_POINT4D \
PCL_ADD_UNION_POINT4D \
PCL_ADD_EIGEN_MAPS_POINT4D
其中 PCL_ADD_UNION_POINT4D、PCL_ADD_EIGEN_MAPS_POINT4D 也同样为宏,如下
#define PCL_ADD_UNION_POINT4D
union EIGEN_ALIGN16 {
float data[4];
struct {
float x;
float y;
float z;
};
};
#define PCL_ADD_EIGEN_MAPS_POINT4D
inline pcl::Vector3fMap getVector3fMap () { return (pcl::Vector3fMap (data)); }
inline pcl::Vector3fMapConst getVector3fMap () const { return (pcl::Vector3fMapConst (data)); }
inline pcl::Vector4fMap getVector4fMap () { return (pcl::Vector4fMap (data)); }
inline pcl::Vector4fMapConst getVector4fMap () const { return (pcl::Vector4fMapConst (data)); }
inline pcl::Array3fMap getArray3fMap () { return (pcl::Array3fMap (data)); }
inline pcl::Array3fMapConst getArray3fMap () const { return (pcl::Array3fMapConst (data)); }
inline pcl::Array4fMap getArray4fMap () { return (pcl::Array4fMap (data)); }
inline pcl::Array4fMapConst getArray4fMap () const { return (pcl::Array4fMapConst (data)); }
PCL_ADD_UNION_POINT4D表示一个union,PCL_ADD_EIGEN_MAPS_POINT4D则代表一堆内联函数。
可以看出,PointXYZ的储存主体就是 union EIGEN_ALIGN16 了,声明成union的好处是,数组data和struct共占用同一个储存空间,这样PointXYZ的值就即可以用data数组表示也可以用x,y,z表示,union的储存结构:
在PointXYZ的构造函数中,设置x,y,z的值,再把数组 data[3],这样data数组就表示一个齐次坐标了,可以方便变换矩阵T的运算。
inline PointXYZ (float _x, float _y, float _z)
{
x = _x; y = _y; z = _z;
data[3] = 1.0f;
}
同时也可以运用 getVector3fMap ()、getVector4fMap等获取data数组的值。
pcl::PointXYZI
struct EIGEN_ALIGN16 _PointXYZI
{
PCL_ADD_POINT4D; // This adds the members x,y,z which can also be accessed using the point (which is float[4])
union
{
struct
{
float intensity;
};
float data_c[4];
};
PCL_MAKE_ALIGNED_OPERATOR_NEW
};
struct PointXYZI : public _PointXYZI
{
inline PointXYZI (const _PointXYZI &p)
{
x = p.x; y = p.y; z = p.z; data[3] = 1.0f;
intensity = p.intensity;
}
inline PointXYZI (float _intensity = 0.f): PointXYZI(0.f, 0.f, 0.f, _intensity) {}
inline PointXYZI (float _x, float _y, float _z, float _intensity = 0.f)
{
x = _x; y = _y; z = _z;
data[3] = 1.0f;
intensity = _intensity;
}
friend std::ostream& operator << (std::ostream& os, const PointXYZI& p);
};
PointXYZI相比于PointXYZ多出了一个union:
union
{
struct
{
float intensity;
};
float data_c[4];
};
该union表示point的强度 intensity 。整个PointXYZI的储存结构为: