ACloudViewer  3.9.4
A Modern Library for 3D Data Processing
Line3D.h
Go to the documentation of this file.
1 // ----------------------------------------------------------------------------
2 // - CloudViewer: www.cloudViewer.org -
3 // ----------------------------------------------------------------------------
4 // Copyright (c) 2018-2024 www.cloudViewer.org
5 // SPDX-License-Identifier: MIT
6 // ----------------------------------------------------------------------------
7 
8 #pragma once
9 
10 #include <Optional.h>
11 
12 #include <Eigen/Core>
13 #include <Eigen/Geometry>
14 #include <limits>
15 
16 #include "ecvBBox.h"
17 
18 #pragma once
19 
20 namespace cloudViewer {
21 namespace geometry {
22 
49 class Line3D : protected Eigen::ParametrizedLine<double, 3> {
50 public:
54  static Line3D Through(const Eigen::Vector3d& p0,
55  const Eigen::Vector3d& p1) {
56  return {p0, (p1 - p0).normalized()};
57  }
58 
62  enum class LineType {
64  Line = 0,
65 
68  Ray = 1,
69 
72  Segment = 2,
73  };
74 
76  Line3D(const Eigen::Vector3d& origin, const Eigen::Vector3d& direction);
77 
78  virtual ~Line3D() = default;
79 
81  LineType GetLineType() const { return line_type_; }
82 
84  const Eigen::Vector3d& Origin() const { return m_origin; }
85 
87  const Eigen::Vector3d& Direction() const { return m_direction; }
88 
91  virtual double Length() const {
93  }
94 
96  virtual void Transform(const Eigen::Transform<double, 3, Eigen::Affine>& t);
97 
100  const Eigen::ParametrizedLine<double, 3>& Line() const { return *this; }
101 
107  const Eigen::Hyperplane<double, 3>& plane) const;
108 
119  double ProjectionParameter(const Eigen::Vector3d& point) const;
120 
130  virtual Eigen::Vector3d Projection(const Eigen::Vector3d& point) const;
131 
154  const ccBBox& box) const;
155 
179  const ccBBox& box) const;
180 
184  std::pair<double, double> ClosestParameters(const Line3D& other) const;
185 
189  std::pair<Eigen::Vector3d, Eigen::Vector3d> ClosestPoints(
190  const Line3D& other) const;
191 
195  double DistanceTo(const Line3D& other) const;
196 
202  virtual double ClampParameter(double parameter) const { return parameter; }
203 
208  virtual bool IsParameterValid(double parameter) const { return true; }
209 
210 protected:
213  Line3D(const Eigen::Vector3d& origin,
214  const Eigen::Vector3d& direction,
215  LineType type);
216 
222  std::pair<double, double> SlabAABBBase(const ccBBox& box) const;
223 
224 private:
225  const LineType line_type_ = LineType::Line;
226 
227  // Pre-calculated inverse values for the line's direction used to
228  // accelerate the slab method
229  double x_inv_;
230  double y_inv_;
231  double z_inv_;
232 };
233 
239 class Ray3D : public Line3D {
240 public:
243  static Ray3D Through(const Eigen::Vector3d& p0, const Eigen::Vector3d& p1) {
244  return {p0, (p1 - p0).normalized()};
245  }
246 
248  Ray3D(const Eigen::Vector3d& origin, const Eigen::Vector3d& direction);
249 
252  double Length() const override {
254  }
255 
262  const Eigen::Hyperplane<double, 3>& plane) const override;
263 
285  const ccBBox& box) const override;
286 
292  double ClampParameter(double parameter) const override {
293  return std::max(parameter, 0.);
294  }
295 
300  bool IsParameterValid(double parameter) const override {
301  return parameter >= 0;
302  }
303 };
304 
319 class Segment3D : public Line3D {
320 public:
324  static Segment3D Through(const Eigen::Vector3d& p0,
325  const Eigen::Vector3d& p1) {
326  return {p0, p1};
327  }
328 
331  Segment3D(const Eigen::Vector3d& start_point,
332  const Eigen::Vector3d& end_point);
333 
336  explicit Segment3D(const std::pair<Eigen::Vector3d, Eigen::Vector3d>& pair);
337 
340  double Length() const override { return length_; }
341 
343  Eigen::Vector3d MidPoint() const { return 0.5 * (origin() + end_point_); }
344 
346  const Eigen::Vector3d& EndPoint() const { return end_point_; }
347 
349  void Transform(
350  const Eigen::Transform<double, 3, Eigen::Affine>& t) override;
351 
355 
361  const Eigen::Hyperplane<double, 3>& plane) const override;
362 
386  const ccBBox& box) const override;
387 
408  const ccBBox& box) const override;
409 
415  double ClampParameter(double parameter) const override {
416  return std::max(std::min(parameter, length_), 0.);
417  }
418 
423  bool IsParameterValid(double parameter) const override {
424  return parameter >= 0 && parameter <= length_;
425  }
426 
427 private:
428  Eigen::Vector3d end_point_;
429  double length_;
430 };
431 
432 } // namespace geometry
433 } // namespace cloudViewer
char type
Bounding box structure.
Definition: ecvBBox.h:25
Line3D is a class which derives from Eigen::ParametrizedLine<double, 3> in order to capture the seman...
Definition: Line3D.h:49
std::pair< Eigen::Vector3d, Eigen::Vector3d > ClosestPoints(const Line3D &other) const
Computes the two closest points between this Line3D object and the other, including of derived types ...
virtual cloudViewer::utility::optional< double > SlabAABB(const ccBBox &box) const
Returns the lower intersection parameter for a line with an axis aligned bounding box or empty if no ...
const Eigen::Vector3d & Direction() const
Gets the line's direction vector.
Definition: Line3D.h:87
double DistanceTo(const Line3D &other) const
Gets the closest distance between two Line3D objects, including derived types Ray3D and Segment3D,...
LineType
Specifies different semantic interpretations of 3d lines.
Definition: Line3D.h:62
@ Line
Lines extend infinitely in both directions.
LineType GetLineType() const
Gets the semantic type of the line.
Definition: Line3D.h:81
virtual void Transform(const Eigen::Transform< double, 3, Eigen::Affine > &t)
Transform the Line3D by the given matrix.
virtual double Length() const
Gets the length of the line, which for lines and rays will return positive infinity,...
Definition: Line3D.h:91
std::pair< double, double > ClosestParameters(const Line3D &other) const
Computes the two corresponding parameters of the closest distance between two Line3D objects,...
virtual Eigen::Vector3d Projection(const Eigen::Vector3d &point) const
Calculates a point projected onto the line, taking into account special semantics.
double ProjectionParameter(const Eigen::Vector3d &point) const
Calculates the parameter of a point projected onto the line taking into account special semantics.
const Eigen::ParametrizedLine< double, 3 > & Line() const
Returns a const reference to the underlying Eigen::ParametrizedLine object.
Definition: Line3D.h:100
virtual bool IsParameterValid(double parameter) const
Verifies that a given parameter value is valid for the semantics of the line object....
Definition: Line3D.h:208
virtual cloudViewer::utility::optional< double > IntersectionParameter(const Eigen::Hyperplane< double, 3 > &plane) const
Calculates the intersection parameter between the line and a plane taking into account line semantics...
Line3D(const Eigen::Vector3d &origin, const Eigen::Vector3d &direction, LineType type)
Internal constructor for inherited classes that allows the setting of the LineType.
const Eigen::Vector3d & Origin() const
Gets the line's origin point.
Definition: Line3D.h:84
static Line3D Through(const Eigen::Vector3d &p0, const Eigen::Vector3d &p1)
Creates a line through two points. The line origin will take the value of p0, and the line direction ...
Definition: Line3D.h:54
std::pair< double, double > SlabAABBBase(const ccBBox &box) const
Calculates the common t_min and t_max values of the slab AABB intersection method....
virtual double ClampParameter(double parameter) const
Clamps/bounds a parameter value to the closest valid place where the entity exists....
Definition: Line3D.h:202
Line3D(const Eigen::Vector3d &origin, const Eigen::Vector3d &direction)
Default user constructor.
virtual cloudViewer::utility::optional< double > ExactAABB(const ccBBox &box) const
Returns the lower intersection parameter for a line with an axis aligned bounding box or empty if no ...
A ray is a semantic interpretation of Eigen::ParametrizedLine which has an origin and a direction and...
Definition: Line3D.h:239
static Ray3D Through(const Eigen::Vector3d &p0, const Eigen::Vector3d &p1)
Creates a Ray3D through two points. The ray origin will take the value of p0, and the direction will ...
Definition: Line3D.h:243
cloudViewer::utility::optional< double > IntersectionParameter(const Eigen::Hyperplane< double, 3 > &plane) const override
Calculates the intersection parameter between the line and a plane taking into account ray semantics....
double Length() const override
Gets the length of the line, which for lines and rays will return positive infinity,...
Definition: Line3D.h:252
double ClampParameter(double parameter) const override
Clamps/bounds a parameter value to the closest valid place where the entity exists....
Definition: Line3D.h:292
cloudViewer::utility::optional< double > SlabAABB(const ccBBox &box) const override
Returns the lower intersection parameter for a ray with an axis aligned bounding box or empty if no i...
bool IsParameterValid(double parameter) const override
Verifies that a given parameter value is valid for the semantics of the line object....
Definition: Line3D.h:300
Ray3D(const Eigen::Vector3d &origin, const Eigen::Vector3d &direction)
Default constructor, requires point and direction.
A segment is a semantic interpretation of Eigen::ParametrizedLine which has an origin and an endpoint...
Definition: Line3D.h:319
const Eigen::Vector3d & EndPoint() const
Get the end point of the segment.
Definition: Line3D.h:346
bool IsParameterValid(double parameter) const override
Verifies that a given parameter value is valid for the semantics of the line object....
Definition: Line3D.h:423
double Length() const override
Get the scalar length of the segment as the distance between the start point (origin) and the end poi...
Definition: Line3D.h:340
cloudViewer::utility::optional< double > IntersectionParameter(const Eigen::Hyperplane< double, 3 > &plane) const override
Calculates the intersection parameter between the line and a plane taking into account segment semant...
Segment3D(const Eigen::Vector3d &start_point, const Eigen::Vector3d &end_point)
Default constructor for Segment3D takes the start and end points of the segment.
void Transform(const Eigen::Transform< double, 3, Eigen::Affine > &t) override
Transform the segment by the given matrix.
Segment3D(const std::pair< Eigen::Vector3d, Eigen::Vector3d > &pair)
Takes a std::pair of points, the first to be used as the start point/origin and the second to be the ...
cloudViewer::utility::optional< double > ExactAABB(const ccBBox &box) const override
Returns the lower intersection parameter for a segment with an axis aligned bounding box or empty if ...
static Segment3D Through(const Eigen::Vector3d &p0, const Eigen::Vector3d &p1)
Creates a Segment3D through two points. The origin will take the value of p0, and the endpoint be p1....
Definition: Line3D.h:324
cloudViewer::utility::optional< double > SlabAABB(const ccBBox &box) const override
Returns the lower intersection parameter for a segment with an axis aligned bounding box or empty if ...
double ClampParameter(double parameter) const override
Clamps/bounds a parameter value to the closest valid place where the entity exists....
Definition: Line3D.h:415
ccBBox GetBoundingBox() const
Get an axis-aligned bounding box representing the enclosed volume of the line segment.
Eigen::Vector3d MidPoint() const
Calculates the midpoint of the segment.
Definition: Line3D.h:343
__device__ __forceinline__ float infinity()
Definition: result_set.h:36
int min(int a, int b)
Definition: cutil_math.h:53
int max(int a, int b)
Definition: cutil_math.h:48
Generic file read and write utility for python interface.
Simple Ray structure.
Definition: RayAndBox.h:14
Definition: lsd.c:149