13 #include <Eigen/Geometry>
49 class Line3D :
protected Eigen::ParametrizedLine<double, 3> {
55 const Eigen::Vector3d& p1) {
56 return {p0, (p1 - p0).normalized()};
76 Line3D(
const Eigen::Vector3d& origin,
const Eigen::Vector3d& direction);
84 const Eigen::Vector3d&
Origin()
const {
return m_origin; }
87 const Eigen::Vector3d&
Direction()
const {
return m_direction; }
96 virtual void Transform(
const Eigen::Transform<double, 3, Eigen::Affine>& t);
100 const Eigen::ParametrizedLine<double, 3>&
Line()
const {
return *
this; }
107 const Eigen::Hyperplane<double, 3>& plane)
const;
190 const Line3D& other)
const;
214 const Eigen::Vector3d& direction,
243 static Ray3D Through(
const Eigen::Vector3d& p0,
const Eigen::Vector3d& p1) {
244 return {p0, (p1 - p0).normalized()};
248 Ray3D(
const Eigen::Vector3d& origin,
const Eigen::Vector3d& direction);
262 const Eigen::Hyperplane<double, 3>& plane)
const override;
285 const ccBBox& box)
const override;
301 return parameter >= 0;
325 const Eigen::Vector3d& p1) {
332 const Eigen::Vector3d& end_point);
336 explicit Segment3D(
const std::pair<Eigen::Vector3d, Eigen::Vector3d>& pair);
340 double Length()
const override {
return length_; }
343 Eigen::Vector3d
MidPoint()
const {
return 0.5 * (origin() + end_point_); }
346 const Eigen::Vector3d&
EndPoint()
const {
return end_point_; }
350 const Eigen::Transform<double, 3, Eigen::Affine>& t)
override;
361 const Eigen::Hyperplane<double, 3>& plane)
const override;
386 const ccBBox& box)
const override;
408 const ccBBox& box)
const override;
424 return parameter >= 0 && parameter <= length_;
428 Eigen::Vector3d end_point_;
Line3D is a class which derives from Eigen::ParametrizedLine<double, 3> in order to capture the seman...
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 ...
virtual ~Line3D()=default
const Eigen::Vector3d & Direction() const
Gets the line's direction vector.
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.
@ Line
Lines extend infinitely in both directions.
LineType GetLineType() const
Gets the semantic type of the line.
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,...
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.
virtual bool IsParameterValid(double parameter) const
Verifies that a given parameter value is valid for the semantics of the line object....
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.
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 ...
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....
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...
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 ...
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,...
double ClampParameter(double parameter) const override
Clamps/bounds a parameter value to the closest valid place where the entity exists....
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....
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...
const Eigen::Vector3d & EndPoint() const
Get the end point of the segment.
bool IsParameterValid(double parameter) const override
Verifies that a given parameter value is valid for the semantics of the line object....
double Length() const override
Get the scalar length of the segment as the distance between the start point (origin) and the end poi...
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....
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....
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.
__device__ __forceinline__ float infinity()
Generic file read and write utility for python interface.