11#include <Eigen/Geometry>
49class Line3D :
protected Eigen::ParametrizedLine<double, 3> {
54 static Line3D Through(
const Eigen::Vector3d& p0,
55 const Eigen::Vector3d& p1) {
56 return {p0, (p1 - p0).normalized()};
76 Line3D(
const Eigen::Vector3d& origin,
const Eigen::Vector3d& direction);
78 virtual ~Line3D() =
default;
81 LineType GetLineType()
const {
return line_type_; }
84 const Eigen::Vector3d& Origin()
const {
return m_origin; }
87 const Eigen::Vector3d& Direction()
const {
return m_direction; }
91 virtual double Length()
const {
92 return std::numeric_limits<double>::infinity();
96 virtual void Transform(
const Eigen::Transform<double, 3, Eigen::Affine>& t);
100 const Eigen::ParametrizedLine<double, 3>& Line()
const {
return *
this; }
106 virtual utility::optional<double> IntersectionParameter(
107 const Eigen::Hyperplane<double, 3>& plane)
const;
119 double ProjectionParameter(
const Eigen::Vector3d& point)
const;
130 virtual Eigen::Vector3d Projection(
const Eigen::Vector3d& point)
const;
153 virtual utility::optional<double> SlabAABB(
154 const AxisAlignedBoundingBox& box)
const;
178 virtual utility::optional<double> ExactAABB(
179 const AxisAlignedBoundingBox& box)
const;
184 std::pair<double, double> ClosestParameters(
const Line3D& other)
const;
189 std::pair<Eigen::Vector3d, Eigen::Vector3d> ClosestPoints(
190 const Line3D& other)
const;
195 double DistanceTo(
const Line3D& other)
const;
202 virtual double ClampParameter(
double parameter)
const {
return parameter; }
208 virtual bool IsParameterValid(
double parameter)
const {
return true; }
213 Line3D(
const Eigen::Vector3d& origin,
214 const Eigen::Vector3d& direction,
222 std::pair<double, double> SlabAABBBase(
223 const AxisAlignedBoundingBox& box)
const;
226 const LineType line_type_ = LineType::Line;
240class Ray3D :
public Line3D {
244 static Ray3D Through(
const Eigen::Vector3d& p0,
const Eigen::Vector3d& p1) {
245 return {p0, (p1 - p0).normalized()};
249 Ray3D(
const Eigen::Vector3d& origin,
const Eigen::Vector3d& direction);
253 double Length()
const override {
254 return std::numeric_limits<double>::infinity();
262 utility::optional<double> IntersectionParameter(
263 const Eigen::Hyperplane<double, 3>& plane)
const override;
285 utility::optional<double> SlabAABB(
286 const AxisAlignedBoundingBox& box)
const override;
293 double ClampParameter(
double parameter)
const override {
294 return std::max(parameter, 0.);
301 bool IsParameterValid(
double parameter)
const override {
302 return parameter >= 0;
320class Segment3D :
public Line3D {
325 static Segment3D Through(
const Eigen::Vector3d& p0,
326 const Eigen::Vector3d& p1) {
332 Segment3D(
const Eigen::Vector3d& start_point,
333 const Eigen::Vector3d& end_point);
337 explicit Segment3D(
const std::pair<Eigen::Vector3d, Eigen::Vector3d>& pair);
341 double Length()
const override {
return length_; }
344 Eigen::Vector3d MidPoint()
const {
return 0.5 * (origin() + end_point_); }
347 const Eigen::Vector3d& EndPoint()
const {
return end_point_; }
351 const Eigen::Transform<double, 3, Eigen::Affine>& t)
override;
355 AxisAlignedBoundingBox GetBoundingBox()
const;
361 utility::optional<double> IntersectionParameter(
362 const Eigen::Hyperplane<double, 3>& plane)
const override;
386 utility::optional<double> SlabAABB(
387 const AxisAlignedBoundingBox& box)
const override;
408 utility::optional<double> ExactAABB(
409 const AxisAlignedBoundingBox& box)
const override;
416 double ClampParameter(
double parameter)
const override {
417 return std::max(std::min(parameter, length_), 0.);
424 bool IsParameterValid(
double parameter)
const override {
425 return parameter >= 0 && parameter <= length_;
429 Eigen::Vector3d end_point_;
Definition BoundingVolume.cpp:19
Definition PinholeCameraIntrinsic.cpp:16