00001
00002
00003
00004
00005
00006
00007
00008
00010
00011
00012 #ifndef __LIDAR_POINT_DATA_H__
00013 #define __LIDAR_POINT_DATA_H__
00014
00015 #include "lidar/Base.h"
00016
00017 LT_BEGIN_LIDAR_NAMESPACE
00018 class ChannelData;
00019 class PointData;
00020
00026 enum DataType
00027 {
00028
00029
00030
00031 DATATYPE_INVALID = 0x0000,
00032
00033 DATATYPE_UINT8 = 0x0100,
00034 DATATYPE_SINT8 = 0x0101,
00035 DATATYPE_UINT16 = 0x0200,
00036 DATATYPE_SINT16 = 0x0201,
00037 DATATYPE_UINT32 = 0x0400,
00038 DATATYPE_SINT32 = 0x0401,
00039 DATATYPE_UINT64 = 0x0800,
00040 DATATYPE_SINT64 = 0x0801,
00041
00042 DATATYPE_FLOAT32 = 0x0403,
00043 DATATYPE_FLOAT64 = 0x0803
00044 };
00045
00049 struct DataTypeUtils
00050 {
00058 static inline bool isSigned(DataType dt) { return (dt & 0x1) == 0x1; }
00059
00067 static inline bool isFloat(DataType dt) { return (dt & 0x2) == 0x2; }
00068
00077 static inline int byteWidth(DataType dt) { return (dt >> 8) & 0xFF; }
00078
00087 static const char *toString(DataType dt);
00088 };
00089
00093 #define CHANNEL_NAME_X "X"
00094 #define CHANNEL_NAME_Y "Y"
00095 #define CHANNEL_NAME_Z "Z"
00096 #define CHANNEL_NAME_Intensity "Intensity"
00097 #define CHANNEL_NAME_ReturnNum "ReturnNum"
00098 #define CHANNEL_NAME_NumReturns "NumReturns"
00099 #define CHANNEL_NAME_ScanDir "ScanDir"
00100 #define CHANNEL_NAME_EdgeFlightLine "EdgeFlightLine"
00101 #define CHANNEL_NAME_ClassId "ClassId"
00102 #define CHANNEL_NAME_ScanAngle "ScanAngle"
00103 #define CHANNEL_NAME_UserData "UserData"
00104 #define CHANNEL_NAME_SourceId "SourceId"
00105 #define CHANNEL_NAME_GPSTime "GPSTime"
00106 #define CHANNEL_NAME_Red "Red"
00107 #define CHANNEL_NAME_Green "Green"
00108 #define CHANNEL_NAME_Blue "Blue"
00109
00110
00111 #define CHANNEL_NAME_Skip "@Skip"
00112
00113
00114
00121 class ChannelInfo
00122 {
00123 SIMPLE_OBJECT(ChannelInfo);
00124 public:
00125 ~ChannelInfo(void);
00126 ChannelInfo(void);
00127
00128 void init(const char *name, DataType datatype, int bits);
00129 void init(const ChannelInfo &info);
00130
00136 const char *getName(void) const;
00137
00143 DataType getDataType(void) const;
00144
00152 size_t getBits(void) const;
00153
00154 bool operator==(const ChannelInfo &rhs) const;
00155 bool operator!=(const ChannelInfo &rhs) const { return !operator==(rhs); }
00156
00157 protected:
00158 char *m_name;
00159 DataType m_datatype;
00160 int m_bits;
00161 };
00162
00171 class PointInfo
00172 {
00173 SIMPLE_OBJECT(PointInfo);
00174 public:
00175 ~PointInfo(void);
00176 PointInfo(void);
00177
00178 void init(size_t numChannels);
00179 void init(const PointInfo &pointInfo);
00180 void init(const PointData &pointData);
00181
00187 size_t getNumChannels(void) const;
00188
00197 const ChannelInfo &getChannel(size_t idx) const;
00198
00207 ChannelInfo &getChannel(size_t idx);
00208
00217 bool hasChannel(const char *name) const;
00218
00227 const ChannelInfo *getChannel(const char *name) const;
00228
00237 ChannelInfo *getChannel(const char *name);
00238
00247 size_t getChannelIndex(const char *name) const;
00248
00255 bool hasValidXYZ(void) const;
00256
00257 protected:
00258 size_t m_numChannels;
00259 ChannelInfo *m_channel;
00260 };
00261
00265 class ChannelData : public ChannelInfo
00266 {
00267 DISABLE_COPY(ChannelData);
00268 public:
00269 ~ChannelData(void);
00270 ChannelData(void);
00271
00272 void init(const ChannelInfo &info, size_t numSamples);
00273
00280 size_t getNumSamples(void) const;
00281
00290 const void *getData(void) const;
00291
00300 void *getData(void);
00301
00315 static void copy(ChannelData &dst, size_t dstOffset,
00316 const ChannelData &src, size_t srcOffset,
00317 size_t length);
00318
00334 static void convert(ChannelData &dst, size_t dstOffset,
00335 const ChannelData &src, size_t srcOffset,
00336 size_t length);
00337
00357 static void convert(ChannelData &dst, size_t dstOffset,
00358 const ChannelData &src, size_t srcOffset,
00359 double offset, double scale,
00360 size_t length);
00361
00371 void setDataType(DataType datatype);
00372
00379 void resize(size_t newNumSamples);
00380
00382 void setOffset(size_t offset);
00383 protected:
00384 size_t m_numSamples;
00385 size_t m_offset;
00386 void *m_data;
00387 };
00388
00397 class PointData
00398 {
00399 SIMPLE_OBJECT(PointData);
00400 public:
00401 ~PointData(void);
00402 PointData(void);
00403
00404 void init(const PointInfo &pointInfo, size_t numSamples);
00405
00411 size_t getNumChannels(void) const;
00412
00419 size_t getNumSamples(void) const;
00420
00429 const ChannelData &getChannel(size_t idx) const;
00430
00439 ChannelData &getChannel(size_t idx);
00440
00449 bool hasChannel(const char *name) const;
00450
00459 const ChannelData *getChannel(const char *name) const;
00460
00469 ChannelData *getChannel(const char *name);
00470
00476 const double *getX(void) const;
00477
00483 double *getX(void);
00484
00490 const double *getY(void) const;
00491
00497 double *getY(void);
00498
00504 const double *getZ(void) const;
00505
00511 double *getZ(void);
00512
00526 static void copy(PointData &dst, size_t dstOffset,
00527 const PointData &src, size_t srcOffset,
00528 size_t length);
00529
00543 static void merge(PointData &dst, size_t dstNumPoints,
00544 const PointData &src, size_t srcNumPoints);
00545
00552 void resize(size_t newNumSamples);
00553
00555 void setOffset(size_t offset);
00556 protected:
00557 size_t m_numChannels;
00558 ChannelData *m_channel;
00559 size_t m_numSamples;
00560 size_t m_offset;
00561
00562
00563 double *m_x;
00564 double *m_y;
00565 double *m_z;
00566 };
00567
00568 LT_END_LIDAR_NAMESPACE
00569 #endif