You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

114 lines
2.5 KiB
C++

/**
* @file plane3d.h
*
* @auhtor Remus Claudiu Dumitru <r.dumitru@jacobs-university.de>
* @date 16 Feb 2012
*
*/
#ifndef PLANE3D_H_
#define PLANE3D_H_
//==============================================================================
// Includes
//==============================================================================
#include "model/vector3d.h"
#include <vector>
namespace model {
/**
* A class defining a plane.
*/
class Plane3d {
private:
/**
* used to determine if vertical
*/
static constexpr double _EPSILON_VERTICAL = 0.02;
/**
* used to determine if horizontal
*/
static constexpr double _EPSILON_HORIZONTAL = 0.02;
/**
* if two planes are this close in cm
* then they may be considered to be the same
*/
static constexpr double _EPSILON_DISTANCE = 20;
/**
* if the length of the crossproduct of two normals is less than this
* then the planes may be considered to be the same
*/
static constexpr double _EPSILON_NORMAL_CROSS_PRODUCT = 2e-1;
public:
/**
* the normal defining the plane
*/
Vector3d normal;
/**
* the point of application of the normal
*/
Point3d pt;
/**
* the convex hull of this plane
*/
std::vector<Point3d> hull;
Plane3d();
Plane3d(const Point3d& pt, const Vector3d& normal);
Plane3d(const Point3d& pt, const Vector3d& normal,
const std::vector<Point3d>& hull);
Plane3d(const Plane3d& other);
virtual ~Plane3d();
/**
* compute the intersection of three planes
*/
Point3d intersect(const Plane3d& first, const Plane3d& second);
/**
* copies one plane to another
*/
Plane3d& operator=(const Plane3d& other);
/**
* returns true if a plane is vertical within some predefined epsilon values
*/
bool isVertical();
/**
* returns true if a plane is horizontal within some predefined epsilon values
*/
bool isHorizontal();
/**
* returns true if this plane replresents the same plane as other
* within some predefined epsilon values
*/
bool isSamePlane(Plane3d other);
/**
* Computes the normal of the plane from the hull.
*/
Vector3d computeAverageNormal();
/**
* Returns the 3D coordinates of points on the plane, which have a fixed
* distance to their next neighbor.
*/
std::vector<std::vector<Point3d> > getDiscretePoints(const double& dist) const;
};
} /* namespace model */
#endif /* PLANE3D_H_ */