Open3D (C++ API)  0.11.0
Line3D.h
Go to the documentation of this file.
1 // ----------------------------------------------------------------------------
2 // - Open3D: www.open3d.org -
3 // ----------------------------------------------------------------------------
4 // The MIT License (MIT)
5 //
6 // Copyright (c) 2020 www.open3d.org
7 //
8 // Permission is hereby granted, free of charge, to any person obtaining a copy
9 // of this software and associated documentation files (the "Software"), to deal
10 // in the Software without restriction, including without limitation the rights
11 // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
12 // copies of the Software, and to permit persons to whom the Software is
13 // furnished to do so, subject to the following conditions:
14 //
15 // The above copyright notice and this permission notice shall be included in
16 // all copies or substantial portions of the Software.
17 //
18 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
19 // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
20 // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
21 // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
22 // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
23 // FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
24 // IN THE SOFTWARE.
25 // ----------------------------------------------------------------------------
26 
27 #pragma once
28 
29 #include <Eigen/Core>
30 #include <Eigen/Geometry>
31 #include <limits>
32 
36 
37 #pragma once
38 
39 namespace open3d {
40 namespace geometry {
41 
68 class Line3D : protected Eigen::ParametrizedLine<double, 3> {
69 public:
73  static Line3D Through(const Eigen::Vector3d& p0,
74  const Eigen::Vector3d& p1) {
75  return {p0, (p1 - p0).normalized()};
76  }
77 
81  enum class LineType {
83  Line = 0,
84 
87  Ray = 1,
88 
91  Segment = 2,
92  };
93 
95  Line3D(const Eigen::Vector3d& origin, const Eigen::Vector3d& direction);
96 
97  virtual ~Line3D() = default;
98 
100  LineType GetLineType() const { return line_type_; }
101 
103  const Eigen::Vector3d& Origin() const { return m_origin; }
104 
106  const Eigen::Vector3d& Direction() const { return m_direction; }
107 
110  virtual double Length() const {
111  return std::numeric_limits<double>::infinity();
112  }
113 
115  virtual void Transform(
116  const Eigen::Transform<double, 3, Eigen::Affine>& t) {
117  transform(t);
118  }
119 
122  const Eigen::ParametrizedLine<double, 3>& Line() const { return *this; }
123 
129  const Eigen::Hyperplane<double, 3>& plane) const;
130 
141  double ProjectionParameter(const Eigen::Vector3d& point) const;
142 
152  virtual Eigen::Vector3d Projection(const Eigen::Vector3d& point) const;
153 
176  const AxisAlignedBoundingBox& box) const;
177 
201  const AxisAlignedBoundingBox& box) const;
202 
206  std::pair<double, double> ClosestParameters(const Line3D& other) const;
207 
211  std::pair<Eigen::Vector3d, Eigen::Vector3d> ClosestPoints(
212  const Line3D& other) const;
213 
217  double DistanceTo(const Line3D& other) const;
218 
224  virtual double ClampParameter(double parameter) const { return parameter; }
225 
230  virtual bool IsParameterValid(double parameter) const { return true; }
231 
232 protected:
235  Line3D(const Eigen::Vector3d& origin,
236  const Eigen::Vector3d& direction,
237  LineType type);
238 
244  std::pair<double, double> SlabAABBBase(
245  const AxisAlignedBoundingBox& box) const;
246 
247 private:
248  const LineType line_type_ = LineType::Line;
249 
250  // Pre-calculated inverse values for the line's direction used to
251  // accelerate the slab method
252  double x_inv_;
253  double y_inv_;
254  double z_inv_;
255 };
256 
262 class Ray3D : public Line3D {
263 public:
266  static Ray3D Through(const Eigen::Vector3d& p0, const Eigen::Vector3d& p1) {
267  return {p0, (p1 - p0).normalized()};
268  }
269 
271  Ray3D(const Eigen::Vector3d& origin, const Eigen::Vector3d& direction);
272 
275  double Length() const override {
276  return std::numeric_limits<double>::infinity();
277  }
278 
285  const Eigen::Hyperplane<double, 3>& plane) const override;
286 
308  const AxisAlignedBoundingBox& box) const override;
309 
315  double ClampParameter(double parameter) const override {
316  return std::max(parameter, 0.);
317  }
318 
323  bool IsParameterValid(double parameter) const override {
324  return parameter >= 0;
325  }
326 };
327 
342 class Segment3D : public Line3D {
343 public:
347  static Segment3D Through(const Eigen::Vector3d& p0,
348  const Eigen::Vector3d& p1) {
349  return {p0, p1};
350  }
351 
354  Segment3D(const Eigen::Vector3d& start_point,
355  const Eigen::Vector3d& end_point);
356 
359  explicit Segment3D(const std::pair<Eigen::Vector3d, Eigen::Vector3d>& pair);
360 
363  double Length() const override { return length_; }
364 
366  Eigen::Vector3d MidPoint() const { return 0.5 * (origin() + end_point_); }
367 
369  const Eigen::Vector3d& EndPoint() const { return end_point_; }
370 
372  void Transform(
373  const Eigen::Transform<double, 3, Eigen::Affine>& t) override {
374  transform(t);
375  end_point_ = t * end_point_;
376  }
377 
380  AxisAlignedBoundingBox GetBoundingBox() const;
381 
387  const Eigen::Hyperplane<double, 3>& plane) const override;
388 
412  const AxisAlignedBoundingBox& box) const override;
413 
434  const AxisAlignedBoundingBox& box) const override;
435 
441  double ClampParameter(double parameter) const override {
442  return std::max(std::min(parameter, length_), 0.);
443  }
444 
449  bool IsParameterValid(double parameter) const override {
450  return parameter >= 0 && parameter <= length_;
451  }
452 
453 private:
454  Eigen::Vector3d end_point_;
455  double length_;
456 };
457 
458 } // namespace geometry
459 } // namespace open3d
std::pair< double, double > ClosestParameters(const Line3D &other) const
Computes the two corresponding parameters of the closest distance between two Line3D objects...
Definition: Line3D.cpp:160
A ray is a semantic interpretation of Eigen::ParametrizedLine which has an origin and a direction and...
Definition: Line3D.h:262
virtual ~Line3D()=default
virtual Eigen::Vector3d Projection(const Eigen::Vector3d &point) const
Calculates a point projected onto the line, taking into account special semantics.
Definition: Line3D.cpp:152
Lines extend infinitely in both directions.
bool IsParameterValid(double parameter) const override
Verifies that a given parameter value is valid for the semantics of the line object. For lines, any parameter is valid, for rays any positive parameter is valid, and for segments any parameter between 0 and the segment length is valid.
Definition: Line3D.h:323
A bounding box that is aligned along the coordinate axes.
Definition: BoundingVolume.h:149
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:363
std::pair< double, double > SlabAABBBase(const AxisAlignedBoundingBox &box) const
Calculates the common t_min and t_max values of the slab AABB intersection method. These values are computed identically for any semantic interpretation of the line, it&#39;s up to the derived classes to use them in conjunction with other information to determine what the intersection parameter is.
Definition: Line3D.cpp:29
bool IsParameterValid(double parameter) const override
Verifies that a given parameter value is valid for the semantics of the line object. For lines, any parameter is valid, for rays any positive parameter is valid, and for segments any parameter between 0 and the segment length is valid.
Definition: Line3D.h:449
const Eigen::Vector3d & EndPoint() const
Get the end point of the segment.
Definition: Line3D.h:369
virtual 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...
Definition: Line3D.cpp:142
Line3D(const Eigen::Vector3d &origin, const Eigen::Vector3d &direction)
Default user constructor.
Definition: Line3D.cpp:10
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:347
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:73
double DistanceTo(const Line3D &other) const
Gets the closest distance between two Line3D objects, including derived types Ray3D and Segment3D...
Definition: Line3D.cpp:259
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 ...
Definition: Line3D.cpp:249
virtual bool IsParameterValid(double parameter) const
Verifies that a given parameter value is valid for the semantics of the line object. For lines, any parameter is valid, for rays any positive parameter is valid, and for segments any parameter between 0 and the segment length is valid.
Definition: Line3D.h:230
const Eigen::ParametrizedLine< double, 3 > & Line() const
Returns a const reference to the underlying Eigen::ParametrizedLine object.
Definition: Line3D.h:122
virtual double Length() const
Gets the length of the line, which for lines and rays will return positive infinity, but for segments will return a finite positive value.
Definition: Line3D.h:110
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:266
virtual void Transform(const Eigen::Transform< double, 3, Eigen::Affine > &t)
Transform the Line3D by the given matrix.
Definition: Line3D.h:115
double ProjectionParameter(const Eigen::Vector3d &point) const
Calculates the parameter of a point projected onto the line taking into account special semantics...
Definition: Line3D.cpp:156
double Length() const override
Gets the length of the line, which for lines and rays will return positive infinity, but for segments will return a finite positive value.
Definition: Line3D.h:275
const Eigen::Vector3d & Origin() const
Gets the line&#39;s origin point.
Definition: Line3D.h:103
char type
Definition: FilePCD.cpp:60
Definition: Optional.h:64
double ClampParameter(double parameter) const override
Clamps/bounds a parameter value to the closest valid place where the entity exists. On a Line3D, the value will be unchanged, on a Ray3D a negative value will be made 0, and on a Segment3D a negative value will be made 0 and a positive value greater than Length() will take the value of Length()
Definition: Line3D.h:441
Definition: PinholeCameraIntrinsic.cpp:35
LineType
Specifies different semantic interpretations of 3d lines.
Definition: Line3D.h:81
double ClampParameter(double parameter) const override
Clamps/bounds a parameter value to the closest valid place where the entity exists. On a Line3D, the value will be unchanged, on a Ray3D a negative value will be made 0, and on a Segment3D a negative value will be made 0 and a positive value greater than Length() will take the value of Length()
Definition: Line3D.h:315
const Eigen::Vector3d & Direction() const
Gets the line&#39;s direction vector.
Definition: Line3D.h:106
virtual double ClampParameter(double parameter) const
Clamps/bounds a parameter value to the closest valid place where the entity exists. On a Line3D, the value will be unchanged, on a Ray3D a negative value will be made 0, and on a Segment3D a negative value will be made 0 and a positive value greater than Length() will take the value of Length()
Definition: Line3D.h:224
virtual utility::optional< double > SlabAABB(const AxisAlignedBoundingBox &box) const
Returns the lower intersection parameter for a line with an axis aligned bounding box or empty if no ...
Definition: Line3D.cpp:125
LineType GetLineType() const
Gets the semantic type of the line.
Definition: Line3D.h:100
virtual utility::optional< double > ExactAABB(const AxisAlignedBoundingBox &box) const
Returns the lower intersection parameter for a line with an axis aligned bounding box or empty if no ...
Definition: Line3D.cpp:61
Line3D is a class which derives from Eigen::ParametrizedLine<double, 3> in order to capture the seman...
Definition: Line3D.h:68
Eigen::Vector3d MidPoint() const
Calculates the midpoint of the segment.
Definition: Line3D.h:366
void Transform(const Eigen::Transform< double, 3, Eigen::Affine > &t) override
Transform the segment by the given matrix.
Definition: Line3D.h:372
A segment is a semantic interpretation of Eigen::ParametrizedLine which has an origin and an endpoint...
Definition: Line3D.h:342