8#define PI (3.14159265358979323846)
16enum struct CoordinateUnit { Millimeter, Meter };
18enum struct FileFormat {
30 constexpr Range() : min(0), max(0) {}
31 constexpr Range(T min, T max) : min(min), max(max) {}
41 constexpr Size() : width(0), height(0) {}
42 constexpr Size(
size_t width,
size_t height) : width(width), height(height) {}
43 bool operator==(
const Size& other) {
return width == other.width && height == other.height; }
55 constexpr SizeF() : width(0), height(0) {}
56 constexpr SizeF(
double width,
double height) : width(width), height(height) {}
57 bool operator==(
const SizeF& other);
73 bool operator==(
const ROI& other) {
return width == other.width && height == other.height; }
86 constexpr ProfileROI() : xAxisCenter(0), width(0), height(0) {}
87 constexpr ProfileROI(
double xAxisCenter,
double width,
double height)
88 : xAxisCenter(xAxisCenter), width(width), height(height)
117 double translateY,
double translateZ)
122 translate(translateX, translateY, translateZ);
141 enum class Axis { X, Y, Z };
149 void rotate(
double theta, Axis rotationAxis)
151 const double radians{theta * PI / 180.0};
152 const double cosValue{cos(radians)};
153 const double sinValue{sin(radians)};
155 switch (rotationAxis) {
158 double rotationXMatrix[3][3] = {
159 {1, 0, 0}, {0, cosValue, -sinValue}, {0, sinValue, cosValue}};
160 multiMatrix(rotationXMatrix);
164 double rotationYMatrix[3][3] = {
165 {cosValue, 0, sinValue}, {0, 1, 0}, {-sinValue, 0, cosValue}};
166 multiMatrix(rotationYMatrix);
170 double rotationZMatrix[3][3] = {
171 {cosValue, -sinValue, 0}, {sinValue, cosValue, 0}, {0, 0, 1}};
172 multiMatrix(rotationZMatrix);
196 const double EPSILON = 1e-15;
197 double identityRotation[3][3] = {{1, 0, 0}, {0, 1, 0}, {0, 0, 1}};
198 double zeroTranslation[3] = {0, 0, 0};
199 auto isApprox0 = [EPSILON](
double d) {
return std::fabs(d) <= EPSILON; };
201 for (
int row = 0; row < 3; row++) {
202 for (
int col = 0; col < 3; col++) {
203 if (!isApprox0(
rotation[row][col] - identityRotation[row][col])) {
209 for (
int row = 0; row < 3; row++) {
210 if (!isApprox0(
translation[row] - zeroTranslation[row])) {
218 double rotation[3][3] = {{1, 0, 0}, {0, 1, 0}, {0, 0, 1}};
221 void multiMatrix(
const double rotationMatrix[3][3])
223 double tempRotation[3][3];
224 memcpy(&tempRotation, &
rotation, 9 *
sizeof(
double));
226 for (
int row = 0; row < 3; row++) {
227 for (
int col = 0; col < 3; col++) {
228 rotation[row][col] = rotationMatrix[row][0] * tempRotation[0][col] +
229 rotationMatrix[row][1] * tempRotation[1][col] +
230 rotationMatrix[row][2] * tempRotation[2][col];
238enum struct IpAssignmentMethod { Unknown, DHCP = 4, Static, LLA };
243enum struct Platform {
254inline static std::string ipAssignmentMethodToString(IpAssignmentMethod type)
257 case IpAssignmentMethod::Static:
259 case IpAssignmentMethod::DHCP:
261 case IpAssignmentMethod::LLA:
263 case IpAssignmentMethod::Unknown:
Represents a point in UntexturedPointCloud with the coordinate (x, y, z) information.
float z
Z channel, default unit: mm, invalid data: nan.
float y
Y channel, default unit: mm, invalid data: nan.
float x
X channel, default unit: mm, invalid data: nan.
Describes the region of interest (ROI) of a laser profiler.
double height
The Z-axis height (in mm) of the ROI.
double width
The X-axis width (in mm) of the ROI.
double xAxisCenter
The position (in mm) of the ROI's center on the X-axis.
Describes a region of interest (ROI).
unsigned upperLeftY
The row coordinate of the upper-left corner of the ROI.
unsigned upperLeftX
The column coordinate of the upper-left corner of the ROI.
Describes a two-dimensional size with a width and a height using double-precision floating-point numb...
Describes a two-dimensional size with a width and a height.