Open3D (C++ API)  0.19.0
Loading...
Searching...
No Matches
Line3D.h
Go to the documentation of this file.
1// ----------------------------------------------------------------------------
2// - Open3D: www.open3d.org -
3// ----------------------------------------------------------------------------
4// Copyright (c) 2018-2024 www.open3d.org
5// SPDX-License-Identifier: MIT
6// ----------------------------------------------------------------------------
7
8#pragma once
9
10#include <Eigen/Core>
11#include <Eigen/Geometry>
12#include <limits>
13
17
18#pragma once
19
20namespace open3d {
21namespace geometry {
22
49class Line3D : protected Eigen::ParametrizedLine<double, 3> {
50public:
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 {
92 return std::numeric_limits<double>::infinity();
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
106 virtual utility::optional<double> IntersectionParameter(
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
153 virtual utility::optional<double> SlabAABB(
154 const AxisAlignedBoundingBox& box) const;
155
178 virtual utility::optional<double> ExactAABB(
179 const AxisAlignedBoundingBox& 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
210protected:
213 Line3D(const Eigen::Vector3d& origin,
214 const Eigen::Vector3d& direction,
215 LineType type);
216
222 std::pair<double, double> SlabAABBBase(
223 const AxisAlignedBoundingBox& box) const;
224
225private:
226 const LineType line_type_ = LineType::Line;
227
228 // Pre-calculated inverse values for the line's direction used to
229 // accelerate the slab method
230 double x_inv_;
231 double y_inv_;
232 double z_inv_;
233};
234
240class Ray3D : public Line3D {
241public:
244 static Ray3D Through(const Eigen::Vector3d& p0, const Eigen::Vector3d& p1) {
245 return {p0, (p1 - p0).normalized()};
246 }
247
249 Ray3D(const Eigen::Vector3d& origin, const Eigen::Vector3d& direction);
250
253 double Length() const override {
254 return std::numeric_limits<double>::infinity();
255 }
256
262 utility::optional<double> IntersectionParameter(
263 const Eigen::Hyperplane<double, 3>& plane) const override;
264
285 utility::optional<double> SlabAABB(
286 const AxisAlignedBoundingBox& box) const override;
287
293 double ClampParameter(double parameter) const override {
294 return std::max(parameter, 0.);
295 }
296
301 bool IsParameterValid(double parameter) const override {
302 return parameter >= 0;
303 }
304};
305
320class Segment3D : public Line3D {
321public:
325 static Segment3D Through(const Eigen::Vector3d& p0,
326 const Eigen::Vector3d& p1) {
327 return {p0, p1};
328 }
329
332 Segment3D(const Eigen::Vector3d& start_point,
333 const Eigen::Vector3d& end_point);
334
337 explicit Segment3D(const std::pair<Eigen::Vector3d, Eigen::Vector3d>& pair);
338
341 double Length() const override { return length_; }
342
344 Eigen::Vector3d MidPoint() const { return 0.5 * (origin() + end_point_); }
345
347 const Eigen::Vector3d& EndPoint() const { return end_point_; }
348
350 void Transform(
351 const Eigen::Transform<double, 3, Eigen::Affine>& t) override;
352
355 AxisAlignedBoundingBox GetBoundingBox() const;
356
361 utility::optional<double> IntersectionParameter(
362 const Eigen::Hyperplane<double, 3>& plane) const override;
363
386 utility::optional<double> SlabAABB(
387 const AxisAlignedBoundingBox& box) const override;
388
408 utility::optional<double> ExactAABB(
409 const AxisAlignedBoundingBox& box) const override;
410
416 double ClampParameter(double parameter) const override {
417 return std::max(std::min(parameter, length_), 0.);
418 }
419
424 bool IsParameterValid(double parameter) const override {
425 return parameter >= 0 && parameter <= length_;
426 }
427
428private:
429 Eigen::Vector3d end_point_;
430 double length_;
431};
432
433} // namespace geometry
434} // namespace open3d
Definition BoundingVolume.cpp:19
Definition PinholeCameraIntrinsic.cpp:16