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

161 lines
5.0 KiB

////////////////////////////////////////////////////////////////////
// Plane.h
//
// Copyright 2007 cDc@seacave
// Distributed under the Boost Software License, Version 1.0
// (See http://www.boost.org/LICENSE_1_0.txt)
#ifndef __SEACAVE_PLANE_H__
#define __SEACAVE_PLANE_H__
// I N C L U D E S /////////////////////////////////////////////////
// D E F I N E S ///////////////////////////////////////////////////
namespace SEACAVE {
// S T R U C T S ///////////////////////////////////////////////////
// Basic hyper-plane class
// (plane represented in Hessian Normal Form: n.x+d=0 <=> ax+by+cz+d=0)
template <typename TYPE, int DIMS=3>
class TPlane
{
STATIC_ASSERT(DIMS > 0 && DIMS <= 3);
public:
typedef Eigen::Matrix<TYPE,DIMS,1> VECTOR;
typedef Eigen::Matrix<TYPE,DIMS,1> POINT;
typedef SEACAVE::TAABB<TYPE,DIMS> AABB;
typedef SEACAVE::TRay<TYPE,DIMS> RAY;
enum { numScalar = DIMS+1 };
enum { numParams = numScalar-1 };
VECTOR m_vN; // plane normal vector
TYPE m_fD; // distance to origin
//---------------------------------------
inline TPlane() {}
inline TPlane(const VECTOR&, TYPE);
inline TPlane(const VECTOR&, const POINT&);
inline TPlane(const POINT&, const POINT&, const POINT&);
inline TPlane(const TYPE p[DIMS+1]);
inline TPlane(const Eigen::Matrix<TYPE,DIMS+1,1>&);
inline void Set(const VECTOR&, TYPE);
inline void Set(const VECTOR&, const POINT&);
inline void Set(const POINT&, const POINT&, const POINT&);
inline void Set(const TYPE p[DIMS+1]);
inline void Set(const Eigen::Matrix<TYPE,DIMS+1,1>&);
int Optimize(const POINT*, size_t, int maxIters=100);
template <typename RobustNormFunctor>
int Optimize(const POINT*, size_t, const RobustNormFunctor& robust, int maxIters=100);
inline void Invalidate();
inline bool IsValid() const;
inline void Negate();
inline TPlane Negated() const;
inline TYPE Distance(const TPlane&) const;
inline TYPE Distance(const POINT&) const;
inline TYPE DistanceAbs(const POINT&) const;
inline POINT ProjectPoint(const POINT&) const;
inline GCLASS Classify(const POINT&) const;
inline GCLASS Classify(const AABB&) const;
bool Clip(const RAY&, TYPE, RAY*, RAY*) const;
bool Intersects(const POINT& p0, const POINT& p1, const POINT& p2) const;
bool Intersects(const TPlane& plane, RAY& ray) const;
bool Intersects(const AABB& aabb) const;
inline TYPE& operator [] (BYTE i) { ASSERT(i<numScalar); return m_vN.data()[i]; }
inline TYPE operator [] (BYTE i) const { ASSERT(i<numScalar); return m_vN.data()[i]; }
#ifdef _USE_BOOST
// implement BOOST serialization
template<class Archive>
void serialize(Archive& ar, const unsigned int /*version*/) {
ar & m_vN;
ar & m_fD;
}
#endif
}; // class TPlane
/*----------------------------------------------------------------*/
template <typename TYPE, typename TYPEW=TYPE, bool bFitLineMode=false>
struct FitPlaneOnline {
TYPEW sumX, sumSqX, sumXY, sumXZ;
TYPEW sumY, sumSqY, sumYZ;
TYPEW sumZ, sumSqZ;
size_t size;
FitPlaneOnline();
void Update(const TPoint3<TYPE>& P);
TPoint3<TYPEW> GetModel(TPoint3<TYPEW>& avg, TPoint3<TYPEW>& dir) const;
template <typename TYPEE> TPoint3<TYPEE> GetPlane(TPlane<TYPEE,3>& plane) const;
};
/*----------------------------------------------------------------*/
// Basic 3D frustum class
// (represented as 6 planes oriented toward outside the frustum volume)
template <typename TYPE, int DIMS=6>
class TFrustum
{
STATIC_ASSERT(DIMS > 0 && DIMS <= 6);
public:
typedef Eigen::Matrix<TYPE,4,4,Eigen::RowMajor> MATRIX4x4;
typedef Eigen::Matrix<TYPE,3,4,Eigen::RowMajor> MATRIX3x4;
typedef Eigen::Matrix<TYPE,3,1> VECTOR;
typedef Eigen::Matrix<TYPE,3,1> POINT;
typedef SEACAVE::TPlane<TYPE,3> PLANE;
typedef SEACAVE::TSphere<TYPE,3> SPHERE;
typedef SEACAVE::TAABB<TYPE,3> AABB;
enum { numCorners = (1<<3) };
PLANE m_planes[DIMS]; // left, right, top, bottom, near and far planes
//---------------------------------------
inline TFrustum() {}
inline TFrustum(const MATRIX4x4&, TYPE width, TYPE height, TYPE nearZ=TYPE(0.0001), TYPE farZ=TYPE(1000));
inline TFrustum(const MATRIX3x4&, TYPE width, TYPE height, TYPE nearZ=TYPE(0.0001), TYPE farZ=TYPE(1000));
void Set(const MATRIX4x4&, TYPE width, TYPE height, TYPE nearZ=TYPE(0.0001), TYPE farZ=TYPE(1000));
void Set(const MATRIX3x4&, TYPE width, TYPE height, TYPE nearZ=TYPE(0.0001), TYPE farZ=TYPE(1000));
void Set(const VECTOR corners[numCorners]);
void SetProjectionGL(const MATRIX4x4&);
GCLASS Classify(const POINT&) const;
GCLASS Classify(const SPHERE&) const;
GCLASS Classify(const AABB&) const;
inline TYPE& operator [] (BYTE i) { ASSERT(i<DIMS); return m_planes[i]; }
inline TYPE operator [] (BYTE i) const { ASSERT(i<DIMS); return m_planes[i]; }
#ifdef _USE_BOOST
// implement BOOST serialization
template<class Archive>
void serialize(Archive& ar, const unsigned int /*version*/) {
ar & m_planes;
}
#endif
}; // class TPlane
/*----------------------------------------------------------------*/
#include "Plane.inl"
/*----------------------------------------------------------------*/
} // namespace SEACAVE
#endif // __SEACAVE_PLANE_H__