make Point derive Eigen's Matrix and some cleanning
This commit is contained in:
parent
949637c795
commit
c1551eddfd
|
@ -1152,7 +1152,7 @@ static bool TestIntersection(FaceType *f0,FaceType *f1)
|
||||||
//no adiacent faces
|
//no adiacent faces
|
||||||
if ( (f0!=f1) && (!ShareEdge(f0,f1))
|
if ( (f0!=f1) && (!ShareEdge(f0,f1))
|
||||||
&& (!ShareVertex(f0,f1)) )
|
&& (!ShareVertex(f0,f1)) )
|
||||||
return (vcg::Intersection_<FaceType>((*f0),(*f1)));
|
return (vcg::Intersection<FaceType>((*f0),(*f1)));
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
111
vcg/math/eigen.h
111
vcg/math/eigen.h
|
@ -28,12 +28,18 @@
|
||||||
#define EIGEN_DONT_VECTORIZE
|
#define EIGEN_DONT_VECTORIZE
|
||||||
#define EIGEN_MATRIXBASE_PLUGIN <vcg/math/eigen_vcgaddons.h>
|
#define EIGEN_MATRIXBASE_PLUGIN <vcg/math/eigen_vcgaddons.h>
|
||||||
|
|
||||||
|
// forward declarations
|
||||||
|
namespace Eigen {
|
||||||
|
template<typename Derived1, typename Derived2, int Size> struct ei_lexi_comparison;
|
||||||
|
}
|
||||||
|
|
||||||
#include "../Eigen/LU"
|
#include "../Eigen/LU"
|
||||||
#include "../Eigen/Geometry"
|
#include "../Eigen/Geometry"
|
||||||
#include "../Eigen/Array"
|
#include "../Eigen/Array"
|
||||||
#include "../Eigen/Core"
|
#include "../Eigen/Core"
|
||||||
#include "base.h"
|
#include "base.h"
|
||||||
|
|
||||||
|
// add support for unsigned char and short int
|
||||||
namespace Eigen {
|
namespace Eigen {
|
||||||
template<> struct NumTraits<unsigned char>
|
template<> struct NumTraits<unsigned char>
|
||||||
{
|
{
|
||||||
|
@ -61,6 +67,94 @@ template<> struct NumTraits<short int>
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
|
// WARNING this is a default version provided so that Intersection() stuff can compile.
|
||||||
|
// Indeed, the compiler try to instanciate all versions of Intersection() leading to
|
||||||
|
// the instanciation of Eigen::Matrix<Face,...> !!!
|
||||||
|
template<typename T> struct NumTraits
|
||||||
|
{
|
||||||
|
struct wrong_type
|
||||||
|
{
|
||||||
|
wrong_type() { assert(0 && "Eigen: you are using a wrong scalar type" ); }
|
||||||
|
};
|
||||||
|
|
||||||
|
typedef wrong_type Real;
|
||||||
|
typedef wrong_type FloatingPoint;
|
||||||
|
enum {
|
||||||
|
IsComplex = 0,
|
||||||
|
HasFloatingPoint = 0,
|
||||||
|
ReadCost = 0,
|
||||||
|
AddCost = 0,
|
||||||
|
MulCost = 0
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
// implementation of Lexicographic order comparison
|
||||||
|
// TODO should use meta unrollers
|
||||||
|
template<typename Derived1, typename Derived2> struct ei_lexi_comparison<Derived1,Derived2,2>
|
||||||
|
{
|
||||||
|
inline static bool less(const Derived1& a, const Derived2& b) {
|
||||||
|
return (a.coeff(1)!=b.coeff(1))?(a.coeff(1)< b.coeff(1)) : (a.coeff(0)<b.coeff(0));
|
||||||
|
}
|
||||||
|
|
||||||
|
inline static bool greater(const Derived1& a, const Derived2& b) {
|
||||||
|
return (a.coeff(1)!=b.coeff(1))?(a.coeff(1)> b.coeff(1)) : (a.coeff(0)>b.coeff(0));
|
||||||
|
}
|
||||||
|
|
||||||
|
inline static bool lessEqual(const Derived1& a, const Derived2& b) {
|
||||||
|
return (a.coeff(1)!=b.coeff(1))?(a.coeff(1)< b.coeff(1)) : (a.coeff(0)<=b.coeff(0));
|
||||||
|
}
|
||||||
|
|
||||||
|
inline static bool greaterEqual(const Derived1& a, const Derived2& b) {
|
||||||
|
return (a.coeff(1)!=b.coeff(1))?(a.coeff(1)> b.coeff(1)) : (a.coeff(0)>=b.coeff(0));
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
template<typename Derived1, typename Derived2> struct ei_lexi_comparison<Derived1,Derived2,3>
|
||||||
|
{
|
||||||
|
inline static bool less(const Derived1& a, const Derived2& b) {
|
||||||
|
return (a.coeff(2)!=b.coeff(2))?(a.coeff(2)< b.coeff(2)):
|
||||||
|
(a.coeff(1)!=b.coeff(1))?(a.coeff(1)< b.coeff(1)) : (a.coeff(0)<b.coeff(0));
|
||||||
|
}
|
||||||
|
|
||||||
|
inline static bool greater(const Derived1& a, const Derived2& b) {
|
||||||
|
return (a.coeff(2)!=b.coeff(2))?(a.coeff(2)> b.coeff(2)):
|
||||||
|
(a.coeff(1)!=b.coeff(1))?(a.coeff(1)> b.coeff(1)) : (a.coeff(0)>b.coeff(0));
|
||||||
|
}
|
||||||
|
|
||||||
|
inline static bool lessEqual(const Derived1& a, const Derived2& b) {
|
||||||
|
return (a.coeff(2)!=b.coeff(2))?(a.coeff(2)< b.coeff(2)):
|
||||||
|
(a.coeff(1)!=b.coeff(1))?(a.coeff(1)< b.coeff(1)) : (a.coeff(0)<=b.coeff(0));
|
||||||
|
}
|
||||||
|
|
||||||
|
inline static bool greaterEqual(const Derived1& a, const Derived2& b) {
|
||||||
|
return (a.coeff(2)!=b.coeff(2))?(a.coeff(2)> b.coeff(2)):
|
||||||
|
(a.coeff(1)!=b.coeff(1))?(a.coeff(1)> b.coeff(1)) : (a.coeff(0)>=b.coeff(0));
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
template<typename Derived1, typename Derived2> struct ei_lexi_comparison<Derived1,Derived2,4>
|
||||||
|
{
|
||||||
|
inline static bool less(const Derived1& a, const Derived2& b) {
|
||||||
|
return (a.coeff(3)!=b.coeff(3))?(a.coeff(3)< b.coeff(3)) : (a.coeff(2)!=b.coeff(2))?(a.coeff(2)< b.coeff(2)):
|
||||||
|
(a.coeff(1)!=b.coeff(1))?(a.coeff(1)< b.coeff(1)) : (a.coeff(0)<b.coeff(0));
|
||||||
|
}
|
||||||
|
|
||||||
|
inline static bool greater(const Derived1& a, const Derived2& b) {
|
||||||
|
return (a.coeff(3)!=b.coeff(3))?(a.coeff(3)> b.coeff(3)) : (a.coeff(2)!=b.coeff(2))?(a.coeff(2)> b.coeff(2)):
|
||||||
|
(a.coeff(1)!=b.coeff(1))?(a.coeff(1)> b.coeff(1)) : (a.coeff(0)>b.coeff(0));
|
||||||
|
}
|
||||||
|
|
||||||
|
inline static bool lessEqual(const Derived1& a, const Derived2& b) {
|
||||||
|
return (a.coeff(3)!=b.coeff(3))?(a.coeff(3)< b.coeff(3)) : (a.coeff(2)!=b.coeff(2))?(a.coeff(2)< b.coeff(2)):
|
||||||
|
(a.coeff(1)!=b.coeff(1))?(a.coeff(1)< b.coeff(1)) : (a.coeff(0)<=b.coeff(0));
|
||||||
|
}
|
||||||
|
|
||||||
|
inline static bool greaterEqual(const Derived1& a, const Derived2& b) {
|
||||||
|
return (a.coeff(3)!=b.coeff(3))?(a.coeff(3)> b.coeff(3)) : (a.coeff(2)!=b.coeff(2))?(a.coeff(2)> b.coeff(2)):
|
||||||
|
(a.coeff(1)!=b.coeff(1))?(a.coeff(1)> b.coeff(1)) : (a.coeff(0)>=b.coeff(0));
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#define VCG_EIGEN_INHERIT_ASSIGNMENT_OPERATOR(Derived, Op) \
|
#define VCG_EIGEN_INHERIT_ASSIGNMENT_OPERATOR(Derived, Op) \
|
||||||
|
@ -110,6 +204,23 @@ Angle(const Eigen::MatrixBase<Derived1>& p1, const Eigen::MatrixBase<Derived2> &
|
||||||
return vcg::math::Acos(t);
|
return vcg::math::Acos(t);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
template<typename Derived1, typename Derived2>
|
||||||
|
typename Eigen::ei_traits<Derived1>::Scalar
|
||||||
|
AngleN(const Eigen::MatrixBase<Derived1>& p1, const Eigen::MatrixBase<Derived2> & p2)
|
||||||
|
{
|
||||||
|
EIGEN_STATIC_ASSERT_VECTOR_ONLY(Derived1)
|
||||||
|
EIGEN_STATIC_ASSERT_VECTOR_ONLY(Derived2)
|
||||||
|
EIGEN_STATIC_ASSERT_FIXED_SIZE(Derived1)
|
||||||
|
EIGEN_STATIC_ASSERT_FIXED_SIZE(Derived2)
|
||||||
|
EIGEN_STATIC_ASSERT_SAME_VECTOR_SIZE(Derived1,Derived2)
|
||||||
|
typedef typename Eigen::ei_traits<Derived1>::Scalar Scalar;
|
||||||
|
|
||||||
|
Scalar t = (p1.dot(p2));
|
||||||
|
if(t>1) t = 1;
|
||||||
|
else if(t<-1) t = -1;
|
||||||
|
return vcg::math::Acos(t);
|
||||||
|
}
|
||||||
|
|
||||||
template<typename Derived1>
|
template<typename Derived1>
|
||||||
inline typename Eigen::ei_traits<Derived1>::Scalar Norm( const Eigen::MatrixBase<Derived1>& p)
|
inline typename Eigen::ei_traits<Derived1>::Scalar Norm( const Eigen::MatrixBase<Derived1>& p)
|
||||||
{ return p.norm(); }
|
{ return p.norm(); }
|
||||||
|
|
|
@ -40,8 +40,10 @@ EIGEN_DEPRECATED inline unsigned int RowsNumber() const { return rows(); };
|
||||||
* \param j the column index
|
* \param j the column index
|
||||||
* \return the element
|
* \return the element
|
||||||
*/
|
*/
|
||||||
EIGEN_DEPRECATED inline Scalar ElementAt(unsigned int i, unsigned int j) const { return (*this)(i,j); }
|
EIGEN_DEPRECATED inline Scalar ElementAt(unsigned int i, unsigned int j) const { return (*this)(i,j); };
|
||||||
EIGEN_DEPRECATED inline Scalar& ElementAt(unsigned int i, unsigned int j) { return (*this)(i,j); }
|
EIGEN_DEPRECATED inline Scalar& ElementAt(unsigned int i, unsigned int j) { return (*this)(i,j); };
|
||||||
|
EIGEN_DEPRECATED inline Scalar V(int i) const { return (*this)[i]; };
|
||||||
|
EIGEN_DEPRECATED inline Scalar& V(int i) { return (*this)[i]; };
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
* \deprecated use *this.determinant() (or *this.lu().determinant() for large matrices)
|
* \deprecated use *this.determinant() (or *this.lu().determinant() for large matrices)
|
||||||
|
@ -188,12 +190,110 @@ EIGEN_DEPRECATED void Dump()
|
||||||
}
|
}
|
||||||
|
|
||||||
/** \deprecated use norm() */
|
/** \deprecated use norm() */
|
||||||
EIGEN_DEPRECATED inline Scalar Norm() const { return norm(); }
|
EIGEN_DEPRECATED inline Scalar Norm() const { return norm(); };
|
||||||
/** \deprecated use squaredNorm() */
|
/** \deprecated use squaredNorm() */
|
||||||
EIGEN_DEPRECATED inline Scalar SquaredNorm() const { return norm2(); }
|
EIGEN_DEPRECATED inline Scalar SquaredNorm() const { return norm2(); };
|
||||||
/** \deprecated use normalize() or normalized() */
|
/** \deprecated use normalize() or normalized() */
|
||||||
EIGEN_DEPRECATED inline Derived& Normalize() { normalize(); return derived(); }
|
EIGEN_DEPRECATED inline Derived& Normalize() { normalize(); return derived(); };
|
||||||
|
/** \deprecated use normalized() */
|
||||||
|
EIGEN_DEPRECATED inline const EvalType Normalize() const { return normalized(); };
|
||||||
|
|
||||||
/** \deprecated use .cross(p) */
|
/** \deprecated use .cross(p) */
|
||||||
EIGEN_DEPRECATED inline EvalType operator ^ (const Derived& p ) const { return this->cross(p); }
|
EIGEN_DEPRECATED inline EvalType operator ^ (const Derived& p ) const { return this->cross(p); }
|
||||||
|
|
||||||
|
/// Homogeneous normalization (division by W)
|
||||||
|
inline Derived& HomoNormalize()
|
||||||
|
{
|
||||||
|
EIGEN_STATIC_ASSERT_VECTOR_ONLY(Derived);
|
||||||
|
enum {
|
||||||
|
SubRows = (int(Flags)&RowMajorBit) ? 1 : (RowsAtCompileTime==Dynamic ? Dynamic : RowsAtCompileTime-1),
|
||||||
|
SubCols = (int(Flags)&RowMajorBit) ? (ColsAtCompileTime==Dynamic ? Dynamic : ColsAtCompileTime-1) : 1,
|
||||||
|
};
|
||||||
|
Scalar& last = coeffRef(size()-2);
|
||||||
|
if (last!=Scalar(0))
|
||||||
|
{
|
||||||
|
Block<Derived,SubRows,SubCols>(derived(),0,0,
|
||||||
|
(int(Flags)&RowMajorBit) ? size()-1 : 1,
|
||||||
|
(int(Flags)&RowMajorBit) ? 1 : (size()-1)) / last;
|
||||||
|
last = Scalar(1.0);
|
||||||
|
}
|
||||||
|
return *this;
|
||||||
|
}
|
||||||
|
|
||||||
|
inline const EvalType HomoNormalize() const
|
||||||
|
{
|
||||||
|
EvalType res = derived();
|
||||||
|
return res.HomoNormalize();
|
||||||
|
}
|
||||||
|
|
||||||
|
/// norm infinity: largest absolute value of compoenet
|
||||||
|
EIGEN_DEPRECATED inline Scalar NormInfinity() const { return derived().cwise().abs().maxCoeff(); }
|
||||||
|
/// norm 1: sum of absolute values of components
|
||||||
|
EIGEN_DEPRECATED inline Scalar NormOne() const { return derived().cwise().abs().sum(); }
|
||||||
|
|
||||||
|
|
||||||
|
/// the sum of the components
|
||||||
|
EIGEN_DEPRECATED inline Scalar Sum() const { return sum(); }
|
||||||
|
/// returns the biggest component
|
||||||
|
EIGEN_DEPRECATED inline Scalar Max() const { return maxCoeff(); }
|
||||||
|
/// returns the smallest component
|
||||||
|
EIGEN_DEPRECATED inline Scalar Min() const { return minCoeff(); }
|
||||||
|
/// returns the index of the biggest component
|
||||||
|
EIGEN_DEPRECATED inline int MaxI() const { EIGEN_STATIC_ASSERT_VECTOR_ONLY(Derived); int i; maxCoeff(&i,0); return i; }
|
||||||
|
/// returns the index of the smallest component
|
||||||
|
EIGEN_DEPRECATED inline int MinI() const { EIGEN_STATIC_ASSERT_VECTOR_ONLY(Derived); int i; minCoeff(&i,0); return i; }
|
||||||
|
|
||||||
|
|
||||||
|
/// Padding function: give a default 0 value to all the elements that are not in the [0..2] range.
|
||||||
|
/// Useful for managing in a consistent way object that could have point2 / point3 / point4
|
||||||
|
inline Scalar Ext( const int i ) const
|
||||||
|
{
|
||||||
|
EIGEN_STATIC_ASSERT_VECTOR_ONLY(Derived);
|
||||||
|
EIGEN_STATIC_ASSERT_FIXED_SIZE(Derived);
|
||||||
|
|
||||||
|
if(i>=0 && i<SizeAtCompileTime)
|
||||||
|
return coeff(i);
|
||||||
|
else
|
||||||
|
return Scalar(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/// Per component scaling
|
||||||
|
template<typename OtherDerived>
|
||||||
|
EIGEN_DEPRECATED inline Derived& Scale(const MatrixBase<OtherDerived>& other)
|
||||||
|
{ this->cwise() *= other; return derived; }
|
||||||
|
|
||||||
|
template<typename OtherDerived>
|
||||||
|
EIGEN_DEPRECATED inline
|
||||||
|
CwiseBinaryOp<ei_scalar_product_op<Scalar>, Derived, OtherDerived>
|
||||||
|
Scale(const MatrixBase<OtherDerived>& other) const
|
||||||
|
{ return this->cwise() * other; }
|
||||||
|
|
||||||
|
|
||||||
|
template<typename OtherDerived>
|
||||||
|
EIGEN_DEPRECATED inline bool operator < (const MatrixBase<OtherDerived>& other) const {
|
||||||
|
EIGEN_STATIC_ASSERT_VECTOR_ONLY(Derived);
|
||||||
|
EIGEN_STATIC_ASSERT_SAME_VECTOR_SIZE(Derived,OtherDerived);
|
||||||
|
return ei_lexi_comparison<Derived,OtherDerived,SizeAtCompileTime>::less(derived(),other.derived());
|
||||||
|
}
|
||||||
|
|
||||||
|
template<typename OtherDerived>
|
||||||
|
EIGEN_DEPRECATED inline bool operator > (const MatrixBase<OtherDerived>& other) const {
|
||||||
|
EIGEN_STATIC_ASSERT_VECTOR_ONLY(Derived);
|
||||||
|
EIGEN_STATIC_ASSERT_SAME_VECTOR_SIZE(Derived,OtherDerived);
|
||||||
|
return ei_lexi_comparison<Derived,OtherDerived,SizeAtCompileTime>::geater(derived(),other.derived());
|
||||||
|
}
|
||||||
|
|
||||||
|
template<typename OtherDerived>
|
||||||
|
EIGEN_DEPRECATED inline bool operator <= (const MatrixBase<OtherDerived>& other) const {
|
||||||
|
EIGEN_STATIC_ASSERT_VECTOR_ONLY(Derived);
|
||||||
|
EIGEN_STATIC_ASSERT_SAME_VECTOR_SIZE(Derived,OtherDerived);
|
||||||
|
return ei_lexi_comparison<Derived,OtherDerived,SizeAtCompileTime>::lessEqual(derived(),other.derived());
|
||||||
|
}
|
||||||
|
|
||||||
|
template<typename OtherDerived>
|
||||||
|
EIGEN_DEPRECATED inline bool operator >= (const MatrixBase<OtherDerived>& other) const {
|
||||||
|
EIGEN_STATIC_ASSERT_VECTOR_ONLY(Derived);
|
||||||
|
EIGEN_STATIC_ASSERT_SAME_VECTOR_SIZE(Derived,OtherDerived);
|
||||||
|
return ei_lexi_comparison<Derived,OtherDerived,SizeAtCompileTime>::greaterEqual(derived(),other.derived());
|
||||||
|
}
|
||||||
|
|
|
@ -50,6 +50,7 @@ namespace ndim{
|
||||||
/* @{ */
|
/* @{ */
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
|
* \deprecated use Matrix<Scalar,Rows,Cols> or Matrix<Scalar,Dynamic,Dynamic>
|
||||||
* This class represent a generic <I>m</I><EFBFBD><I>n</I> matrix. The class is templated over the scalar type field.
|
* This class represent a generic <I>m</I><EFBFBD><I>n</I> matrix. The class is templated over the scalar type field.
|
||||||
* @param Scalar (Templete Parameter) Specifies the ScalarType field.
|
* @param Scalar (Templete Parameter) Specifies the ScalarType field.
|
||||||
*/
|
*/
|
||||||
|
@ -135,6 +136,7 @@ public:
|
||||||
* \param reference to the matrix to multiply by
|
* \param reference to the matrix to multiply by
|
||||||
* \return the matrix product
|
* \return the matrix product
|
||||||
*/
|
*/
|
||||||
|
// FIXME what the hell is that !
|
||||||
/*template <int N,int M>
|
/*template <int N,int M>
|
||||||
void DotProduct(Point<N,Scalar> &m,Point<M,Scalar> &result)
|
void DotProduct(Point<N,Scalar> &m,Point<M,Scalar> &result)
|
||||||
{
|
{
|
||||||
|
@ -147,7 +149,7 @@ public:
|
||||||
};*/
|
};*/
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
* \deprecated use *this.resize()
|
* \deprecated use *this.resize(); *this.setZero();
|
||||||
* Resize the current matrix.
|
* Resize the current matrix.
|
||||||
* \param m the number of matrix rows.
|
* \param m the number of matrix rows.
|
||||||
* \param n the number of matrix columns.
|
* \param n the number of matrix columns.
|
||||||
|
@ -159,11 +161,6 @@ public:
|
||||||
Base::resize(m,n);
|
Base::resize(m,n);
|
||||||
memset(Base::data(), 0, m*n*sizeof(Scalar));
|
memset(Base::data(), 0, m*n*sizeof(Scalar));
|
||||||
};
|
};
|
||||||
|
|
||||||
// EIGEN_DEPRECATED void Transpose()
|
|
||||||
// {
|
|
||||||
// assert(0 && "dangerous use of deprecated Transpose function, please use: m = m.transpose();");
|
|
||||||
// }
|
|
||||||
};
|
};
|
||||||
|
|
||||||
typedef vcg::ndim::Matrix<double> MatrixMNd;
|
typedef vcg::ndim::Matrix<double> MatrixMNd;
|
||||||
|
|
|
@ -0,0 +1,980 @@
|
||||||
|
/****************************************************************************
|
||||||
|
* VCGLib o o *
|
||||||
|
* Visual and Computer Graphics Library o o *
|
||||||
|
* _ O _ *
|
||||||
|
* Copyright(C) 2004 \/)\/ *
|
||||||
|
* Visual Computing Lab /\/| *
|
||||||
|
* ISTI - Italian National Research Council | *
|
||||||
|
* \ *
|
||||||
|
* All rights reserved. *
|
||||||
|
* *
|
||||||
|
* This program is free software; you can redistribute it and/or modify *
|
||||||
|
* it under the terms of the GNU General Public License as published by *
|
||||||
|
* the Free Software Foundation; either version 2 of the License, or *
|
||||||
|
* (at your option) any later version. *
|
||||||
|
* *
|
||||||
|
* This program is distributed in the hope that it will be useful, *
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
|
||||||
|
* GNU General Public License (http://www.gnu.org/licenses/gpl.txt) *
|
||||||
|
* for more details. *
|
||||||
|
* *
|
||||||
|
****************************************************************************/
|
||||||
|
/****************************************************************************
|
||||||
|
History
|
||||||
|
|
||||||
|
$Log: not supported by cvs2svn $
|
||||||
|
Revision 1.9 2006/12/20 15:23:52 ganovelli
|
||||||
|
using of locally defined variable removed
|
||||||
|
|
||||||
|
Revision 1.8 2006/04/11 08:10:05 zifnab1974
|
||||||
|
changes necessary for gcc 3.4.5 on linux 64bit.
|
||||||
|
|
||||||
|
Revision 1.7 2005/12/12 11:22:32 ganovelli
|
||||||
|
compiled with gcc
|
||||||
|
|
||||||
|
Revision 1.6 2005/01/12 11:25:52 ganovelli
|
||||||
|
corrected Point<3
|
||||||
|
|
||||||
|
Revision 1.5 2004/10/20 16:45:21 ganovelli
|
||||||
|
first compiling version (MC,INtel,gcc)
|
||||||
|
|
||||||
|
Revision 1.4 2004/04/29 10:47:06 ganovelli
|
||||||
|
some siyntax error corrected
|
||||||
|
|
||||||
|
Revision 1.3 2004/04/05 12:36:43 tarini
|
||||||
|
unified version: PointBase version, with no guards "(N==3)"
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
Revision 1.1 2004/03/16 03:07:38 tarini
|
||||||
|
"dimensionally unified" version: first commit
|
||||||
|
|
||||||
|
****************************************************************************/
|
||||||
|
|
||||||
|
#ifndef __VCGLIB_POINT
|
||||||
|
#define __VCGLIB_POINT
|
||||||
|
|
||||||
|
#include <assert.h>
|
||||||
|
#include <vcg/math/base.h>
|
||||||
|
#include <vcg/space/space.h>
|
||||||
|
|
||||||
|
namespace vcg {
|
||||||
|
|
||||||
|
namespace ndim{
|
||||||
|
|
||||||
|
|
||||||
|
//template <int N, class S>
|
||||||
|
//class Point;
|
||||||
|
|
||||||
|
/** \addtogroup space */
|
||||||
|
/*@{*/
|
||||||
|
/**
|
||||||
|
The templated class for representing a point in R^N space.
|
||||||
|
The class is templated over the ScalarType class that is used to represent coordinates.
|
||||||
|
PointBase provides the interface and the common operators for points
|
||||||
|
of any dimensionality.
|
||||||
|
*/
|
||||||
|
|
||||||
|
template <int N, class S>
|
||||||
|
class Point
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
typedef S ScalarType;
|
||||||
|
typedef VoidType ParamType;
|
||||||
|
typedef Point<N,S> PointType;
|
||||||
|
enum {Dimension=N};
|
||||||
|
|
||||||
|
|
||||||
|
protected:
|
||||||
|
/// The only data member. Hidden to user.
|
||||||
|
S _v[N];
|
||||||
|
|
||||||
|
public:
|
||||||
|
|
||||||
|
//@{
|
||||||
|
|
||||||
|
/** @name Standard Constructors and Initializers
|
||||||
|
No casting operators have been introduced to avoid automatic unattended (and costly) conversion between different PointType types
|
||||||
|
**/
|
||||||
|
|
||||||
|
inline Point () { };
|
||||||
|
// inline Point ( const S nv[N] );
|
||||||
|
|
||||||
|
/// Padding function: give a default 0 value to all the elements that are not in the [0..2] range.
|
||||||
|
/// Useful for managing in a consistent way object that could have point2 / point3 / point4
|
||||||
|
inline S Ext( const int i ) const
|
||||||
|
{
|
||||||
|
if(i>=0 && i<=N) return _v[i];
|
||||||
|
else return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// importer for points with different scalar type and-or dimensionality
|
||||||
|
template <int N2, class S2>
|
||||||
|
inline void Import( const Point<N2,S2> & b )
|
||||||
|
{
|
||||||
|
_v[0] = ScalarType(b[0]);
|
||||||
|
_v[1] = ScalarType(b[1]);
|
||||||
|
if (N>2) { if (N2>2) _v[2] = ScalarType(b[2]); else _v[2] = 0;};
|
||||||
|
if (N>3) { if (N2>3) _v[3] = ScalarType(b[3]); else _v[3] = 0;};
|
||||||
|
}
|
||||||
|
|
||||||
|
/// constructor for points with different scalar type and-or dimensionality
|
||||||
|
template <int N2, class S2>
|
||||||
|
static inline PointType Construct( const Point<N2,S2> & b )
|
||||||
|
{
|
||||||
|
PointType p; p.Import(b);
|
||||||
|
return p;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// importer for homogeneous points
|
||||||
|
template <class S2>
|
||||||
|
inline void ImportHomo( const Point<N-1,S2> & b )
|
||||||
|
{
|
||||||
|
_v[0] = ScalarType(b[0]);
|
||||||
|
_v[1] = ScalarType(b[1]);
|
||||||
|
if (N>2) { _v[2] = ScalarType(_v[2]); };
|
||||||
|
_v[N-1] = 1.0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// constructor for homogeneus point.
|
||||||
|
template <int N2, class S2>
|
||||||
|
static inline PointType Construct( const Point<N-1,S2> & b )
|
||||||
|
{
|
||||||
|
PointType p; p.ImportHomo(b);
|
||||||
|
return p;
|
||||||
|
}
|
||||||
|
|
||||||
|
//@}
|
||||||
|
|
||||||
|
//@{
|
||||||
|
|
||||||
|
/** @name Data Access.
|
||||||
|
access to data is done by overloading of [] or explicit naming of coords (x,y,z)**/
|
||||||
|
|
||||||
|
inline S & operator [] ( const int i )
|
||||||
|
{
|
||||||
|
assert(i>=0 && i<N);
|
||||||
|
return _v[i];
|
||||||
|
}
|
||||||
|
inline const S & operator [] ( const int i ) const
|
||||||
|
{
|
||||||
|
assert(i>=0 && i<N);
|
||||||
|
return _v[i];
|
||||||
|
}
|
||||||
|
inline const S &X() const { return _v[0]; }
|
||||||
|
inline const S &Y() const { return _v[1]; }
|
||||||
|
inline const S &Z() const { static_assert(N>2); return _v[2]; }
|
||||||
|
/// W is in any case the last coordinate.
|
||||||
|
/// (in a 2D point, W() == Y(). In a 3D point, W()==Z()
|
||||||
|
/// in a 4D point, W() is a separate component)
|
||||||
|
inline const S &W() const { return _v[N-1]; }
|
||||||
|
inline S &X() { return _v[0]; }
|
||||||
|
inline S &Y() { return _v[1]; }
|
||||||
|
inline S &Z() { static_assert(N>2); return _v[2]; }
|
||||||
|
inline S &W() { return _v[N-1]; }
|
||||||
|
inline const S * V() const
|
||||||
|
{
|
||||||
|
return _v;
|
||||||
|
}
|
||||||
|
inline S & V( const int i )
|
||||||
|
{
|
||||||
|
assert(i>=0 && i<N);
|
||||||
|
return _v[i];
|
||||||
|
}
|
||||||
|
inline const S & V( const int i ) const
|
||||||
|
{
|
||||||
|
assert(i>=0 && i<N);
|
||||||
|
return _v[i];
|
||||||
|
}
|
||||||
|
//@}
|
||||||
|
//@{
|
||||||
|
|
||||||
|
/** @name Linearity for points
|
||||||
|
**/
|
||||||
|
|
||||||
|
/// sets a PointType to Zero
|
||||||
|
inline void SetZero()
|
||||||
|
{
|
||||||
|
for(unsigned int ii = 0; ii < Dimension;++ii)
|
||||||
|
V(ii) = S();
|
||||||
|
}
|
||||||
|
|
||||||
|
inline PointType operator + ( PointType const & p) const
|
||||||
|
{
|
||||||
|
PointType res;
|
||||||
|
for(unsigned int ii = 0; ii < Dimension;++ii)
|
||||||
|
res[ii] = V(ii) + p[ii];
|
||||||
|
return res;
|
||||||
|
}
|
||||||
|
|
||||||
|
inline PointType operator - ( PointType const & p) const
|
||||||
|
{
|
||||||
|
PointType res;
|
||||||
|
for(unsigned int ii = 0; ii < Dimension;++ii)
|
||||||
|
res[ii] = V(ii) - p[ii];
|
||||||
|
return res;
|
||||||
|
}
|
||||||
|
|
||||||
|
inline PointType operator * ( const S s ) const
|
||||||
|
{
|
||||||
|
PointType res;
|
||||||
|
for(unsigned int ii = 0; ii < Dimension;++ii)
|
||||||
|
res[ii] = V(ii) * s;
|
||||||
|
return res;
|
||||||
|
}
|
||||||
|
|
||||||
|
inline PointType operator / ( const S s ) const
|
||||||
|
{
|
||||||
|
PointType res;
|
||||||
|
for(unsigned int ii = 0; ii < Dimension;++ii)
|
||||||
|
res[ii] = V(ii) / s;
|
||||||
|
return res;
|
||||||
|
}
|
||||||
|
|
||||||
|
inline PointType & operator += ( PointType const & p)
|
||||||
|
{
|
||||||
|
for(unsigned int ii = 0; ii < Dimension;++ii)
|
||||||
|
V(ii) += p[ii];
|
||||||
|
return *this;
|
||||||
|
}
|
||||||
|
|
||||||
|
inline PointType & operator -= ( PointType const & p)
|
||||||
|
{
|
||||||
|
for(unsigned int ii = 0; ii < Dimension;++ii)
|
||||||
|
V(ii) -= p[ii];
|
||||||
|
return *this;
|
||||||
|
}
|
||||||
|
|
||||||
|
inline PointType & operator *= ( const S s )
|
||||||
|
{
|
||||||
|
for(unsigned int ii = 0; ii < Dimension;++ii)
|
||||||
|
V(ii) *= s;
|
||||||
|
return *this;
|
||||||
|
}
|
||||||
|
|
||||||
|
inline PointType & operator /= ( const S s )
|
||||||
|
{
|
||||||
|
for(unsigned int ii = 0; ii < Dimension;++ii)
|
||||||
|
V(ii) *= s;
|
||||||
|
return *this;
|
||||||
|
}
|
||||||
|
|
||||||
|
inline PointType operator - () const
|
||||||
|
{
|
||||||
|
PointType res;
|
||||||
|
for(unsigned int ii = 0; ii < Dimension;++ii)
|
||||||
|
res[ii] = - V(ii);
|
||||||
|
return res;
|
||||||
|
}
|
||||||
|
//@}
|
||||||
|
//@{
|
||||||
|
|
||||||
|
/** @name Dot products (cross product "%" is defined olny for 3D points)
|
||||||
|
**/
|
||||||
|
/// Dot product
|
||||||
|
inline S operator * ( PointType const & p ) const;
|
||||||
|
|
||||||
|
/// slower version, more stable (double precision only)
|
||||||
|
inline S StableDot ( const PointType & p ) const;
|
||||||
|
|
||||||
|
//@}
|
||||||
|
|
||||||
|
//@{
|
||||||
|
|
||||||
|
/** @name Norms
|
||||||
|
**/
|
||||||
|
|
||||||
|
/// Euclidean norm
|
||||||
|
inline S Norm() const;
|
||||||
|
/// Euclidean norm, static version
|
||||||
|
template <class PT> static S Norm(const PT &p );
|
||||||
|
/// Squared Euclidean norm
|
||||||
|
inline S SquaredNorm() const;
|
||||||
|
/// Squared Euclidean norm, static version
|
||||||
|
template <class PT> static S SquaredNorm(const PT &p );
|
||||||
|
/// Normalization (division by norm)
|
||||||
|
inline PointType & Normalize();
|
||||||
|
/// Normalization (division by norm), static version
|
||||||
|
template <class PT> static PointType & Normalize(const PT &p);
|
||||||
|
/// Homogeneous normalization (division by W)
|
||||||
|
inline PointType & HomoNormalize();
|
||||||
|
|
||||||
|
/// norm infinity: largest absolute value of compoenet
|
||||||
|
inline S NormInfinity() const;
|
||||||
|
/// norm 1: sum of absolute values of components
|
||||||
|
inline S NormOne() const;
|
||||||
|
|
||||||
|
//@}
|
||||||
|
/// Signed area operator
|
||||||
|
/// a % b returns the signed area of the parallelogram inside a and b
|
||||||
|
inline S operator % ( PointType const & p ) const;
|
||||||
|
|
||||||
|
/// the sum of the components
|
||||||
|
inline S Sum() const;
|
||||||
|
/// returns the biggest component
|
||||||
|
inline S Max() const;
|
||||||
|
/// returns the smallest component
|
||||||
|
inline S Min() const;
|
||||||
|
/// returns the index of the biggest component
|
||||||
|
inline int MaxI() const;
|
||||||
|
/// returns the index of the smallest component
|
||||||
|
inline int MinI() const;
|
||||||
|
|
||||||
|
|
||||||
|
/// Per component scaling
|
||||||
|
inline PointType & Scale( const PointType & p );
|
||||||
|
|
||||||
|
|
||||||
|
/// Convert to polar coordinates
|
||||||
|
void ToPolar( S & ro, S & tetha, S & fi ) const
|
||||||
|
{
|
||||||
|
ro = Norm();
|
||||||
|
tetha = (S)atan2( _v[1], _v[0] );
|
||||||
|
fi = (S)acos( _v[2]/ro );
|
||||||
|
}
|
||||||
|
|
||||||
|
//@{
|
||||||
|
|
||||||
|
/** @name Comparison Operators.
|
||||||
|
Lexicographic order.
|
||||||
|
**/
|
||||||
|
|
||||||
|
inline bool operator == ( PointType const & p ) const;
|
||||||
|
inline bool operator != ( PointType const & p ) const;
|
||||||
|
inline bool operator < ( PointType const & p ) const;
|
||||||
|
inline bool operator > ( PointType const & p ) const;
|
||||||
|
inline bool operator <= ( PointType const & p ) const;
|
||||||
|
inline bool operator >= ( PointType const & p ) const;
|
||||||
|
//@}
|
||||||
|
|
||||||
|
//@{
|
||||||
|
|
||||||
|
/** @name
|
||||||
|
Glocal to Local and viceversa
|
||||||
|
(provided for uniformity with other spatial classes. trivial for points)
|
||||||
|
**/
|
||||||
|
|
||||||
|
inline PointType LocalToGlobal(ParamType p) const{
|
||||||
|
return *this; }
|
||||||
|
|
||||||
|
inline ParamType GlobalToLocal(PointType p) const{
|
||||||
|
ParamType p(); return p; }
|
||||||
|
//@}
|
||||||
|
|
||||||
|
}; // end class definition
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
template <class S>
|
||||||
|
class Point2 : public Point<2,S> {
|
||||||
|
public:
|
||||||
|
typedef S ScalarType;
|
||||||
|
typedef Point2 PointType;
|
||||||
|
using Point<2,S>::_v;
|
||||||
|
using Point<2,S>::V;
|
||||||
|
using Point<2,S>::W;
|
||||||
|
|
||||||
|
//@{
|
||||||
|
/** @name Special members for 2D points. **/
|
||||||
|
|
||||||
|
/// default
|
||||||
|
inline Point2 (){}
|
||||||
|
|
||||||
|
/// yx constructor
|
||||||
|
inline Point2 ( const S a, const S b){
|
||||||
|
_v[0]=a; _v[1]=b; };
|
||||||
|
|
||||||
|
/// unary orthogonal operator (2D equivalent of cross product)
|
||||||
|
/// returns orthogonal vector (90 deg left)
|
||||||
|
inline Point2 operator ~ () const {
|
||||||
|
return Point2 ( -_v[2], _v[1] );
|
||||||
|
}
|
||||||
|
|
||||||
|
/// returns the angle with X axis (radiants, in [-PI, +PI] )
|
||||||
|
inline ScalarType &Angle(){
|
||||||
|
return math::Atan2(_v[1],_v[0]);}
|
||||||
|
|
||||||
|
/// transform the point in cartesian coords into polar coords
|
||||||
|
inline Point2 & ToPolar(){
|
||||||
|
ScalarType t = Angle();
|
||||||
|
_v[0] = Norm();
|
||||||
|
_v[1] = t;
|
||||||
|
return *this;}
|
||||||
|
|
||||||
|
/// transform the point in polar coords into cartesian coords
|
||||||
|
inline Point2 & ToCartesian() {
|
||||||
|
ScalarType l = _v[0];
|
||||||
|
_v[0] = (ScalarType)(l*math::Cos(_v[1]));
|
||||||
|
_v[1] = (ScalarType)(l*math::Sin(_v[1]));
|
||||||
|
return *this;}
|
||||||
|
|
||||||
|
/// rotates the point of an angle (radiants, counterclockwise)
|
||||||
|
inline Point2 & Rotate( const ScalarType rad ){
|
||||||
|
ScalarType t = _v[0];
|
||||||
|
ScalarType s = math::Sin(rad);
|
||||||
|
ScalarType c = math::Cos(rad);
|
||||||
|
_v[0] = _v[0]*c - _v[1]*s;
|
||||||
|
_v[1] = t *s + _v[1]*c;
|
||||||
|
return *this;}
|
||||||
|
|
||||||
|
//@}
|
||||||
|
|
||||||
|
//@{
|
||||||
|
/** @name Implementation of standard functions for 3D points **/
|
||||||
|
|
||||||
|
inline void Zero(){
|
||||||
|
_v[0]=0; _v[1]=0; };
|
||||||
|
|
||||||
|
inline Point2 ( const S nv[2] ){
|
||||||
|
_v[0]=nv[0]; _v[1]=nv[1]; };
|
||||||
|
|
||||||
|
inline Point2 operator + ( Point2 const & p) const {
|
||||||
|
return Point2( _v[0]+p._v[0], _v[1]+p._v[1]); }
|
||||||
|
|
||||||
|
inline Point2 operator - ( Point2 const & p) const {
|
||||||
|
return Point2( _v[0]-p._v[0], _v[1]-p._v[1]); }
|
||||||
|
|
||||||
|
inline Point2 operator * ( const S s ) const {
|
||||||
|
return Point2( _v[0]*s, _v[1]*s ); }
|
||||||
|
|
||||||
|
inline Point2 operator / ( const S s ) const {
|
||||||
|
S t=1.0/s;
|
||||||
|
return Point2( _v[0]*t, _v[1]*t ); }
|
||||||
|
|
||||||
|
inline Point2 operator - () const {
|
||||||
|
return Point2 ( -_v[0], -_v[1] ); }
|
||||||
|
|
||||||
|
inline Point2 & operator += ( Point2 const & p ) {
|
||||||
|
_v[0] += p._v[0]; _v[1] += p._v[1]; return *this; }
|
||||||
|
|
||||||
|
inline Point2 & operator -= ( Point2 const & p ) {
|
||||||
|
_v[0] -= p._v[0]; _v[1] -= p._v[1]; return *this; }
|
||||||
|
|
||||||
|
inline Point2 & operator *= ( const S s ) {
|
||||||
|
_v[0] *= s; _v[1] *= s; return *this; }
|
||||||
|
|
||||||
|
inline Point2 & operator /= ( const S s ) {
|
||||||
|
S t=1.0/s; _v[0] *= t; _v[1] *= t; return *this; }
|
||||||
|
|
||||||
|
inline S Norm() const {
|
||||||
|
return math::Sqrt( _v[0]*_v[0] + _v[1]*_v[1] );}
|
||||||
|
|
||||||
|
template <class PT> static S Norm(const PT &p ) {
|
||||||
|
return math::Sqrt( p.V(0)*p.V(0) + p.V(1)*p.V(1) );}
|
||||||
|
|
||||||
|
inline S SquaredNorm() const {
|
||||||
|
return ( _v[0]*_v[0] + _v[1]*_v[1] );}
|
||||||
|
|
||||||
|
template <class PT> static S SquaredNorm(const PT &p ) {
|
||||||
|
return ( p.V(0)*p.V(0) + p.V(1)*p.V(1) );}
|
||||||
|
|
||||||
|
inline S operator * ( Point2 const & p ) const {
|
||||||
|
return ( _v[0]*p._v[0] + _v[1]*p._v[1]) ; }
|
||||||
|
|
||||||
|
inline bool operator == ( Point2 const & p ) const {
|
||||||
|
return _v[0]==p._v[0] && _v[1]==p._v[1] ;}
|
||||||
|
|
||||||
|
inline bool operator != ( Point2 const & p ) const {
|
||||||
|
return _v[0]!=p._v[0] || _v[1]!=p._v[1] ;}
|
||||||
|
|
||||||
|
inline bool operator < ( Point2 const & p ) const{
|
||||||
|
return (_v[1]!=p._v[1])?(_v[1]< p._v[1]) : (_v[0]<p._v[0]); }
|
||||||
|
|
||||||
|
inline bool operator > ( Point2 const & p ) const {
|
||||||
|
return (_v[1]!=p._v[1])?(_v[1]> p._v[1]) : (_v[0]>p._v[0]); }
|
||||||
|
|
||||||
|
inline bool operator <= ( Point2 const & p ) {
|
||||||
|
return (_v[1]!=p._v[1])?(_v[1]< p._v[1]) : (_v[0]<=p._v[0]); }
|
||||||
|
|
||||||
|
inline bool operator >= ( Point2 const & p ) const {
|
||||||
|
return (_v[1]!=p._v[1])?(_v[1]> p._v[1]) : (_v[0]>=p._v[0]); }
|
||||||
|
|
||||||
|
inline Point2 & Normalize() {
|
||||||
|
PointType n = Norm(); if(n!=0.0) { n=1.0/n; _v[0]*=n; _v[1]*=n;} return *this;};
|
||||||
|
|
||||||
|
template <class PT> Point2 & Normalize(const PT &p){
|
||||||
|
PointType n = Norm(); if(n!=0.0) { n=1.0/n; V(0)*=n; V(1)*=n; }
|
||||||
|
return *this;};
|
||||||
|
|
||||||
|
inline Point2 & HomoNormalize(){
|
||||||
|
if (_v[2]!=0.0) { _v[0] /= W(); W()=1.0; } return *this;};
|
||||||
|
|
||||||
|
inline S NormInfinity() const {
|
||||||
|
return math::Max( math::Abs(_v[0]), math::Abs(_v[1]) ); }
|
||||||
|
|
||||||
|
inline S NormOne() const {
|
||||||
|
return math::Abs(_v[0])+ math::Abs(_v[1]);}
|
||||||
|
|
||||||
|
inline S operator % ( Point2 const & p ) const {
|
||||||
|
return _v[0] * p._v[1] - _v[1] * p._v[0]; }
|
||||||
|
|
||||||
|
inline S Sum() const {
|
||||||
|
return _v[0]+_v[1];}
|
||||||
|
|
||||||
|
inline S Max() const {
|
||||||
|
return math::Max( _v[0], _v[1] ); }
|
||||||
|
|
||||||
|
inline S Min() const {
|
||||||
|
return math::Min( _v[0], _v[1] ); }
|
||||||
|
|
||||||
|
inline int MaxI() const {
|
||||||
|
return (_v[0] < _v[1]) ? 1:0; };
|
||||||
|
|
||||||
|
inline int MinI() const {
|
||||||
|
return (_v[0] > _v[1]) ? 1:0; };
|
||||||
|
|
||||||
|
inline PointType & Scale( const PointType & p ) {
|
||||||
|
_v[0] *= p._v[0]; _v[1] *= p._v[1]; return *this; }
|
||||||
|
|
||||||
|
inline S StableDot ( const PointType & p ) const {
|
||||||
|
return _v[0]*p._v[0] +_v[1]*p._v[1]; }
|
||||||
|
//@}
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
template <typename S>
|
||||||
|
class Point3 : public Point<3,S> {
|
||||||
|
public:
|
||||||
|
typedef S ScalarType;
|
||||||
|
typedef Point3<S> PointType;
|
||||||
|
using Point<3,S>::_v;
|
||||||
|
using Point<3,S>::V;
|
||||||
|
using Point<3,S>::W;
|
||||||
|
|
||||||
|
|
||||||
|
//@{
|
||||||
|
/** @name Special members for 3D points. **/
|
||||||
|
|
||||||
|
/// default
|
||||||
|
inline Point3 ():Point<3,S>(){}
|
||||||
|
/// yxz constructor
|
||||||
|
inline Point3 ( const S a, const S b, const S c){
|
||||||
|
_v[0]=a; _v[1]=b; _v[2]=c; };
|
||||||
|
|
||||||
|
/// Cross product for 3D points
|
||||||
|
inline PointType operator ^ ( PointType const & p ) const {
|
||||||
|
return Point3 (
|
||||||
|
_v[1]*p._v[2] - _v[2]*p._v[1],
|
||||||
|
_v[2]*p._v[0] - _v[0]*p._v[2],
|
||||||
|
_v[0]*p._v[1] - _v[1]*p._v[0] );
|
||||||
|
}
|
||||||
|
//@}
|
||||||
|
|
||||||
|
//@{
|
||||||
|
/** @name Implementation of standard functions for 3D points **/
|
||||||
|
|
||||||
|
inline void Zero(){
|
||||||
|
_v[0]=0; _v[1]=0; _v[2]=0; };
|
||||||
|
|
||||||
|
inline Point3 ( const S nv[3] ){
|
||||||
|
_v[0]=nv[0]; _v[1]=nv[1]; _v[2]=nv[2]; };
|
||||||
|
|
||||||
|
inline Point3 operator + ( Point3 const & p) const{
|
||||||
|
return Point3( _v[0]+p._v[0], _v[1]+p._v[1], _v[2]+p._v[2]); }
|
||||||
|
|
||||||
|
inline Point3 operator - ( Point3 const & p) const {
|
||||||
|
return Point3( _v[0]-p._v[0], _v[1]-p._v[1], _v[2]-p._v[2]); }
|
||||||
|
|
||||||
|
inline Point3 operator * ( const S s ) const {
|
||||||
|
return Point3( _v[0]*s, _v[1]*s , _v[2]*s ); }
|
||||||
|
|
||||||
|
inline Point3 operator / ( const S s ) const {
|
||||||
|
S t=1.0/s;
|
||||||
|
return Point3( _v[0]*t, _v[1]*t , _v[2]*t ); }
|
||||||
|
|
||||||
|
inline Point3 operator - () const {
|
||||||
|
return Point3 ( -_v[0], -_v[1] , -_v[2] ); }
|
||||||
|
|
||||||
|
inline Point3 & operator += ( Point3 const & p ) {
|
||||||
|
_v[0] += p._v[0]; _v[1] += p._v[1]; _v[2] += p._v[2]; return *this; }
|
||||||
|
|
||||||
|
inline Point3 & operator -= ( Point3 const & p ) {
|
||||||
|
_v[0] -= p._v[0]; _v[1] -= p._v[1]; _v[2] -= p._v[2]; return *this; }
|
||||||
|
|
||||||
|
inline Point3 & operator *= ( const S s ) {
|
||||||
|
_v[0] *= s; _v[1] *= s; _v[2] *= s; return *this; }
|
||||||
|
|
||||||
|
inline Point3 & operator /= ( const S s ) {
|
||||||
|
S t=1.0/s; _v[0] *= t; _v[1] *= t; _v[2] *= t; return *this; }
|
||||||
|
|
||||||
|
inline S Norm() const {
|
||||||
|
return math::Sqrt( _v[0]*_v[0] + _v[1]*_v[1] + _v[2]*_v[2] );}
|
||||||
|
|
||||||
|
template <class PT> static S Norm(const PT &p ) {
|
||||||
|
return math::Sqrt( p.V(0)*p.V(0) + p.V(1)*p.V(1) + p.V(2)*p.V(2) );}
|
||||||
|
|
||||||
|
inline S SquaredNorm() const {
|
||||||
|
return ( _v[0]*_v[0] + _v[1]*_v[1] + _v[2]*_v[2] );}
|
||||||
|
|
||||||
|
template <class PT> static S SquaredNorm(const PT &p ) {
|
||||||
|
return ( p.V(0)*p.V(0) + p.V(1)*p.V(1) + p.V(2)*p.V(2) );}
|
||||||
|
|
||||||
|
inline S operator * ( PointType const & p ) const {
|
||||||
|
return ( _v[0]*p._v[0] + _v[1]*p._v[1] + _v[2]*p._v[2]) ; }
|
||||||
|
|
||||||
|
inline bool operator == ( PointType const & p ) const {
|
||||||
|
return _v[0]==p._v[0] && _v[1]==p._v[1] && _v[2]==p._v[2] ;}
|
||||||
|
|
||||||
|
inline bool operator != ( PointType const & p ) const {
|
||||||
|
return _v[0]!=p._v[0] || _v[1]!=p._v[1] || _v[2]!=p._v[2] ;}
|
||||||
|
|
||||||
|
inline bool operator < ( PointType const & p ) const{
|
||||||
|
return (_v[2]!=p._v[2])?(_v[2]< p._v[2]):
|
||||||
|
(_v[1]!=p._v[1])?(_v[1]< p._v[1]) : (_v[0]<p._v[0]); }
|
||||||
|
|
||||||
|
inline bool operator > ( PointType const & p ) const {
|
||||||
|
return (_v[2]!=p._v[2])?(_v[2]> p._v[2]):
|
||||||
|
(_v[1]!=p._v[1])?(_v[1]> p._v[1]) : (_v[0]>p._v[0]); }
|
||||||
|
|
||||||
|
inline bool operator <= ( PointType const & p ) {
|
||||||
|
return (_v[2]!=p._v[2])?(_v[2]< p._v[2]):
|
||||||
|
(_v[1]!=p._v[1])?(_v[1]< p._v[1]) : (_v[0]<=p._v[0]); }
|
||||||
|
|
||||||
|
inline bool operator >= ( PointType const & p ) const {
|
||||||
|
return (_v[2]!=p._v[2])?(_v[2]> p._v[2]):
|
||||||
|
(_v[1]!=p._v[1])?(_v[1]> p._v[1]) : (_v[0]>=p._v[0]); }
|
||||||
|
|
||||||
|
inline PointType & Normalize() {
|
||||||
|
S n = Norm();
|
||||||
|
if(n!=0.0) {
|
||||||
|
n=S(1.0)/n;
|
||||||
|
_v[0]*=n; _v[1]*=n; _v[2]*=n; }
|
||||||
|
return *this;};
|
||||||
|
|
||||||
|
template <class PT> PointType & Normalize(const PT &p){
|
||||||
|
S n = Norm(); if(n!=0.0) { n=1.0/n; V(0)*=n; V(1)*=n; V(2)*=n; }
|
||||||
|
return *this;};
|
||||||
|
|
||||||
|
inline PointType & HomoNormalize(){
|
||||||
|
if (_v[2]!=0.0) { _v[0] /= W(); _v[1] /= W(); W()=1.0; }
|
||||||
|
return *this;};
|
||||||
|
|
||||||
|
inline S NormInfinity() const {
|
||||||
|
return math::Max( math::Max( math::Abs(_v[0]), math::Abs(_v[1]) ),
|
||||||
|
math::Abs(_v[3]) ); }
|
||||||
|
|
||||||
|
inline S NormOne() const {
|
||||||
|
return math::Abs(_v[0])+ math::Abs(_v[1])+math::Max(math::Abs(_v[2]));}
|
||||||
|
|
||||||
|
inline S operator % ( PointType const & p ) const {
|
||||||
|
S t = (*this)*p; /* Area, general formula */
|
||||||
|
return math::Sqrt( SquaredNorm() * p.SquaredNorm() - (t*t) );};
|
||||||
|
|
||||||
|
inline S Sum() const {
|
||||||
|
return _v[0]+_v[1]+_v[2];}
|
||||||
|
|
||||||
|
inline S Max() const {
|
||||||
|
return math::Max( math::Max( _v[0], _v[1] ), _v[2] ); }
|
||||||
|
|
||||||
|
inline S Min() const {
|
||||||
|
return math::Min( math::Min( _v[0], _v[1] ), _v[2] ); }
|
||||||
|
|
||||||
|
inline int MaxI() const {
|
||||||
|
int i= (_v[0] < _v[1]) ? 1:0; if (_v[i] < _v[2]) i=2; return i;};
|
||||||
|
|
||||||
|
inline int MinI() const {
|
||||||
|
int i= (_v[0] > _v[1]) ? 1:0; if (_v[i] > _v[2]) i=2; return i;};
|
||||||
|
|
||||||
|
inline PointType & Scale( const PointType & p ) {
|
||||||
|
_v[0] *= p._v[0]; _v[1] *= p._v[1]; _v[2] *= p._v[2]; return *this; }
|
||||||
|
|
||||||
|
inline S StableDot ( const PointType & p ) const {
|
||||||
|
S k0=_v[0]*p._v[0], k1=_v[1]*p._v[1], k2=_v[2]*p._v[2];
|
||||||
|
int exp0,exp1,exp2;
|
||||||
|
frexp( double(k0), &exp0 );
|
||||||
|
frexp( double(k1), &exp1 );
|
||||||
|
frexp( double(k2), &exp2 );
|
||||||
|
if( exp0<exp1 )
|
||||||
|
if(exp0<exp2) return (k1+k2)+k0; else return (k0+k1)+k2;
|
||||||
|
else
|
||||||
|
if(exp1<exp2) return (k0+k2)+k1; else return (k0+k1)+k2;
|
||||||
|
}
|
||||||
|
//@}
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
template <typename S>
|
||||||
|
class Point4 : public Point<4,S> {
|
||||||
|
public:
|
||||||
|
typedef S ScalarType;
|
||||||
|
typedef Point4<S> PointType;
|
||||||
|
using Point<3,S>::_v;
|
||||||
|
using Point<3,S>::V;
|
||||||
|
using Point<3,S>::W;
|
||||||
|
|
||||||
|
//@{
|
||||||
|
/** @name Special members for 4D points. **/
|
||||||
|
/// default
|
||||||
|
inline Point4 (){}
|
||||||
|
|
||||||
|
/// xyzw constructor
|
||||||
|
//@}
|
||||||
|
inline Point4 ( const S a, const S b, const S c, const S d){
|
||||||
|
_v[0]=a; _v[1]=b; _v[2]=c; _v[3]=d; };
|
||||||
|
//@{
|
||||||
|
/** @name Implementation of standard functions for 3D points **/
|
||||||
|
|
||||||
|
inline void Zero(){
|
||||||
|
_v[0]=0; _v[1]=0; _v[2]=0; _v[3]=0; };
|
||||||
|
|
||||||
|
inline Point4 ( const S nv[4] ){
|
||||||
|
_v[0]=nv[0]; _v[1]=nv[1]; _v[2]=nv[2]; _v[3]=nv[3]; };
|
||||||
|
|
||||||
|
inline Point4 operator + ( Point4 const & p) const {
|
||||||
|
return Point4( _v[0]+p._v[0], _v[1]+p._v[1], _v[2]+p._v[2], _v[3]+p._v[3] ); }
|
||||||
|
|
||||||
|
inline Point4 operator - ( Point4 const & p) const {
|
||||||
|
return Point4( _v[0]-p._v[0], _v[1]-p._v[1], _v[2]-p._v[2], _v[3]-p._v[3] ); }
|
||||||
|
|
||||||
|
inline Point4 operator * ( const S s ) const {
|
||||||
|
return Point4( _v[0]*s, _v[1]*s , _v[2]*s , _v[3]*s ); }
|
||||||
|
|
||||||
|
inline PointType operator ^ ( PointType const & p ) const {
|
||||||
|
assert(0);
|
||||||
|
return *this;
|
||||||
|
}
|
||||||
|
|
||||||
|
inline Point4 operator / ( const S s ) const {
|
||||||
|
S t=1.0/s;
|
||||||
|
return Point4( _v[0]*t, _v[1]*t , _v[2]*t , _v[3]*t ); }
|
||||||
|
|
||||||
|
inline Point4 operator - () const {
|
||||||
|
return Point4 ( -_v[0], -_v[1] , -_v[2] , -_v[3] ); }
|
||||||
|
|
||||||
|
inline Point4 & operator += ( Point4 const & p ) {
|
||||||
|
_v[0] += p._v[0]; _v[1] += p._v[1]; _v[2] += p._v[2]; _v[3] += p._v[3]; return *this; }
|
||||||
|
|
||||||
|
inline Point4 & operator -= ( Point4 const & p ) {
|
||||||
|
_v[0] -= p._v[0]; _v[1] -= p._v[1]; _v[2] -= p._v[2]; _v[3] -= p._v[3]; return *this; }
|
||||||
|
|
||||||
|
inline Point4 & operator *= ( const S s ) {
|
||||||
|
_v[0] *= s; _v[1] *= s; _v[2] *= s; _v[3] *= s; return *this; }
|
||||||
|
|
||||||
|
inline Point4 & operator /= ( const S s ) {
|
||||||
|
S t=1.0/s; _v[0] *= t; _v[1] *= t; _v[2] *= t; _v[3] *= t; return *this; }
|
||||||
|
|
||||||
|
inline S Norm() const {
|
||||||
|
return math::Sqrt( _v[0]*_v[0] + _v[1]*_v[1] + _v[2]*_v[2] + _v[3]*_v[3] );}
|
||||||
|
|
||||||
|
template <class PT> static S Norm(const PT &p ) {
|
||||||
|
return math::Sqrt( p.V(0)*p.V(0) + p.V(1)*p.V(1) + p.V(2)*p.V(2) + p.V(3)*p.V(3) );}
|
||||||
|
|
||||||
|
inline S SquaredNorm() const {
|
||||||
|
return ( _v[0]*_v[0] + _v[1]*_v[1] + _v[2]*_v[2] + _v[3]*_v[3] );}
|
||||||
|
|
||||||
|
template <class PT> static S SquaredNorm(const PT &p ) {
|
||||||
|
return ( p.V(0)*p.V(0) + p.V(1)*p.V(1) + p.V(2)*p.V(2) + p.V(3)*p.V(3) );}
|
||||||
|
|
||||||
|
inline S operator * ( PointType const & p ) const {
|
||||||
|
return ( _v[0]*p._v[0] + _v[1]*p._v[1] + _v[2]*p._v[2] + _v[3]*p._v[3] ); }
|
||||||
|
|
||||||
|
inline bool operator == ( PointType const & p ) const {
|
||||||
|
return _v[0]==p._v[0] && _v[1]==p._v[1] && _v[2]==p._v[2] && _v[3]==p._v[3];}
|
||||||
|
|
||||||
|
inline bool operator != ( PointType const & p ) const {
|
||||||
|
return _v[0]!=p._v[0] || _v[1]!=p._v[1] || _v[2]!=p._v[2] || _v[3]!=p._v[3];}
|
||||||
|
|
||||||
|
inline bool operator < ( PointType const & p ) const{
|
||||||
|
return (_v[3]!=p._v[3])?(_v[3]< p._v[3]) : (_v[2]!=p._v[2])?(_v[2]< p._v[2]):
|
||||||
|
(_v[1]!=p._v[1])?(_v[1]< p._v[1]) : (_v[0]<p._v[0]); }
|
||||||
|
|
||||||
|
inline bool operator > ( PointType const & p ) const {
|
||||||
|
return (_v[3]!=p._v[3])?(_v[3]> p._v[3]) : (_v[2]!=p._v[2])?(_v[2]> p._v[2]):
|
||||||
|
(_v[1]!=p._v[1])?(_v[1]> p._v[1]) : (_v[0]>p._v[0]); }
|
||||||
|
|
||||||
|
inline bool operator <= ( PointType const & p ) {
|
||||||
|
return (_v[3]!=p._v[3])?(_v[3]< p._v[3]) : (_v[2]!=p._v[2])?(_v[2]< p._v[2]):
|
||||||
|
(_v[1]!=p._v[1])?(_v[1]< p._v[1]) : (_v[0]<=p._v[0]); }
|
||||||
|
|
||||||
|
inline bool operator >= ( PointType const & p ) const {
|
||||||
|
return (_v[3]!=p._v[3])?(_v[3]> p._v[3]) : (_v[2]!=p._v[2])?(_v[2]> p._v[2]):
|
||||||
|
(_v[1]!=p._v[1])?(_v[1]> p._v[1]) : (_v[0]>=p._v[0]); }
|
||||||
|
|
||||||
|
inline PointType & Normalize() {
|
||||||
|
PointType n = Norm(); if(n!=0.0) { n=1.0/n; _v[0]*=n; _v[1]*=n; _v[2]*=n; _v[3]*=n; }
|
||||||
|
return *this;};
|
||||||
|
|
||||||
|
template <class PT> PointType & Normalize(const PT &p){
|
||||||
|
PointType n = Norm(); if(n!=0.0) { n=1.0/n; V(0)*=n; V(1)*=n; V(2)*=n; V(3)*=n; }
|
||||||
|
return *this;};
|
||||||
|
|
||||||
|
inline PointType & HomoNormalize(){
|
||||||
|
if (_v[3]!=0.0) { _v[0] /= W(); _v[1] /= W(); _v[2] /= W(); W()=1.0; }
|
||||||
|
return *this;};
|
||||||
|
|
||||||
|
inline S NormInfinity() const {
|
||||||
|
return math::Max( math::Max( math::Abs(_v[0]), math::Abs(_v[1]) ),
|
||||||
|
math::Max( math::Abs(_v[2]), math::Abs(_v[3]) ) ); }
|
||||||
|
|
||||||
|
inline S NormOne() const {
|
||||||
|
return math::Abs(_v[0])+ math::Abs(_v[1])+math::Max(math::Abs(_v[2]),math::Abs(_v[3]));}
|
||||||
|
|
||||||
|
inline S operator % ( PointType const & p ) const {
|
||||||
|
S t = (*this)*p; /* Area, general formula */
|
||||||
|
return math::Sqrt( SquaredNorm() * p.SquaredNorm() - (t*t) );};
|
||||||
|
|
||||||
|
inline S Sum() const {
|
||||||
|
return _v[0]+_v[1]+_v[2]+_v[3];}
|
||||||
|
|
||||||
|
inline S Max() const {
|
||||||
|
return math::Max( math::Max( _v[0], _v[1] ), math::Max( _v[2], _v[3] )); }
|
||||||
|
|
||||||
|
inline S Min() const {
|
||||||
|
return math::Min( math::Min( _v[0], _v[1] ), math::Min( _v[2], _v[3] )); }
|
||||||
|
|
||||||
|
inline int MaxI() const {
|
||||||
|
int i= (_v[0] < _v[1]) ? 1:0; if (_v[i] < _v[2]) i=2; if (_v[i] < _v[3]) i=3;
|
||||||
|
return i;};
|
||||||
|
|
||||||
|
inline int MinI() const {
|
||||||
|
int i= (_v[0] > _v[1]) ? 1:0; if (_v[i] > _v[2]) i=2; if (_v[i] > _v[3]) i=3;
|
||||||
|
return i;};
|
||||||
|
|
||||||
|
inline PointType & Scale( const PointType & p ) {
|
||||||
|
_v[0] *= p._v[0]; _v[1] *= p._v[1]; _v[2] *= p._v[2]; _v[3] *= p._v[3]; return *this; }
|
||||||
|
|
||||||
|
inline S StableDot ( const PointType & p ) const {
|
||||||
|
S k0=_v[0]*p._v[0], k1=_v[1]*p._v[1], k2=_v[2]*p._v[2], k3=_v[3]*p._v[3];
|
||||||
|
int exp0,exp1,exp2,exp3;
|
||||||
|
frexp( double(k0), &exp0 );frexp( double(k1), &exp1 );
|
||||||
|
frexp( double(k2), &exp2 );frexp( double(k3), &exp3 );
|
||||||
|
if (exp0>exp1) { math::Swap(k0,k1); math::Swap(exp0,exp1); }
|
||||||
|
if (exp2>exp3) { math::Swap(k2,k3); math::Swap(exp2,exp3); }
|
||||||
|
if (exp0>exp2) { math::Swap(k0,k2); math::Swap(exp0,exp2); }
|
||||||
|
if (exp1>exp3) { math::Swap(k1,k3); math::Swap(exp1,exp3); }
|
||||||
|
if (exp2>exp3) { math::Swap(k2,k3); math::Swap(exp2,exp3); }
|
||||||
|
return ( (k0 + k1) + k2 ) +k3; }
|
||||||
|
|
||||||
|
//@}
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
template <class S>
|
||||||
|
inline S Angle( Point3<S> const & p1, Point3<S> const & p2 )
|
||||||
|
{
|
||||||
|
S w = p1.Norm()*p2.Norm();
|
||||||
|
if(w==0) return -1;
|
||||||
|
S t = (p1*p2)/w;
|
||||||
|
if(t>1) t = 1;
|
||||||
|
else if(t<-1) t = -1;
|
||||||
|
return (S) acos(t);
|
||||||
|
}
|
||||||
|
|
||||||
|
// versione uguale alla precedente ma che assume che i due vettori siano unitari
|
||||||
|
template <class S>
|
||||||
|
inline S AngleN( Point3<S> const & p1, Point3<S> const & p2 )
|
||||||
|
{
|
||||||
|
S w = p1*p2;
|
||||||
|
if(w>1)
|
||||||
|
w = 1;
|
||||||
|
else if(w<-1)
|
||||||
|
w=-1;
|
||||||
|
return (S) acos(w);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
template <int N,class S>
|
||||||
|
inline S Norm( Point<N,S> const & p )
|
||||||
|
{
|
||||||
|
return p.Norm();
|
||||||
|
}
|
||||||
|
|
||||||
|
template <int N,class S>
|
||||||
|
inline S SquaredNorm( Point<N,S> const & p )
|
||||||
|
{
|
||||||
|
return p.SquaredNorm();
|
||||||
|
}
|
||||||
|
|
||||||
|
template <int N,class S>
|
||||||
|
inline Point<N,S> & Normalize( Point<N,S> & p )
|
||||||
|
{
|
||||||
|
p.Normalize();
|
||||||
|
return p;
|
||||||
|
}
|
||||||
|
|
||||||
|
template <int N, class S>
|
||||||
|
inline S Distance( Point<N,S> const & p1,Point<N,S> const & p2 )
|
||||||
|
{
|
||||||
|
return (p1-p2).Norm();
|
||||||
|
}
|
||||||
|
|
||||||
|
template <int N, class S>
|
||||||
|
inline S SquaredDistance( Point<N,S> const & p1,Point<N,S> const & p2 )
|
||||||
|
{
|
||||||
|
return (p1-p2).SquaredNorm();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
//template <typename S>
|
||||||
|
//struct Point2:public Point<2,S>{
|
||||||
|
// inline Point2(){};
|
||||||
|
// inline Point2(Point<2,S> const & p):Point<2,S>(p){} ;
|
||||||
|
// inline Point2( const S a, const S b):Point<2,S>(a,b){};
|
||||||
|
//};
|
||||||
|
//
|
||||||
|
//template <typename S>
|
||||||
|
//struct Point3:public Point3<S> {
|
||||||
|
// inline Point3(){};
|
||||||
|
// inline Point3(Point3<S> const & p):Point3<S> (p){}
|
||||||
|
// inline Point3( const S a, const S b, const S c):Point3<S> (a,b,c){};
|
||||||
|
//};
|
||||||
|
//
|
||||||
|
//
|
||||||
|
//template <typename S>
|
||||||
|
//struct Point4:public Point4<S>{
|
||||||
|
// inline Point4(){};
|
||||||
|
// inline Point4(Point4<S> const & p):Point4<S>(p){}
|
||||||
|
// inline Point4( const S a, const S b, const S c, const S d):Point4<S>(a,b,c,d){};
|
||||||
|
//};
|
||||||
|
|
||||||
|
typedef Point2<short> Point2s;
|
||||||
|
typedef Point2<int> Point2i;
|
||||||
|
typedef Point2<float> Point2f;
|
||||||
|
typedef Point2<double> Point2d;
|
||||||
|
typedef Point2<short> Vector2s;
|
||||||
|
typedef Point2<int> Vector2i;
|
||||||
|
typedef Point2<float> Vector2f;
|
||||||
|
typedef Point2<double> Vector2d;
|
||||||
|
|
||||||
|
typedef Point3<short> Point3s;
|
||||||
|
typedef Point3<int> Point3i;
|
||||||
|
typedef Point3<float> Point3f;
|
||||||
|
typedef Point3<double> Point3d;
|
||||||
|
typedef Point3<short> Vector3s;
|
||||||
|
typedef Point3<int> Vector3i;
|
||||||
|
typedef Point3<float> Vector3f;
|
||||||
|
typedef Point3<double> Vector3d;
|
||||||
|
|
||||||
|
|
||||||
|
typedef Point4<short> Point4s;
|
||||||
|
typedef Point4<int> Point4i;
|
||||||
|
typedef Point4<float> Point4f;
|
||||||
|
typedef Point4<double> Point4d;
|
||||||
|
typedef Point4<short> Vector4s;
|
||||||
|
typedef Point4<int> Vector4i;
|
||||||
|
typedef Point4<float> Vector4f;
|
||||||
|
typedef Point4<double> Vector4d;
|
||||||
|
|
||||||
|
/*@}*/
|
||||||
|
|
||||||
|
//added only for backward compatibility
|
||||||
|
template<unsigned int N,typename S>
|
||||||
|
struct PointBase : Point<N,S>
|
||||||
|
{
|
||||||
|
PointBase()
|
||||||
|
:Point<N,S>()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
} // end namespace ndim
|
||||||
|
} // end namespace vcg
|
||||||
|
#endif
|
||||||
|
|
|
@ -404,16 +404,17 @@ namespace vcg {
|
||||||
|
|
||||||
/// intersection between two triangles
|
/// intersection between two triangles
|
||||||
template<typename TRIANGLETYPE>
|
template<typename TRIANGLETYPE>
|
||||||
inline bool Intersection_(const TRIANGLETYPE & t0,const TRIANGLETYPE & t1){
|
inline bool Intersection(const TRIANGLETYPE & t0,const TRIANGLETYPE & t1){
|
||||||
return NoDivTriTriIsect(t0.P0(0),t0.P0(1),t0.P0(2),
|
return NoDivTriTriIsect(t0.P0(0),t0.P0(1),t0.P0(2),
|
||||||
t1.P0(0),t1.P0(1),t1.P0(2));
|
t1.P0(0),t1.P0(1),t1.P0(2));
|
||||||
}
|
}
|
||||||
|
|
||||||
template<class T>
|
template<class T>
|
||||||
inline bool Intersection(Point3<T> V0,Point3<T> V1,Point3<T> V2,
|
inline bool Intersection(Point3<T> V0,Point3<T> V1,Point3<T> V2,
|
||||||
Point3<T> U0,Point3<T> U1,Point3<T> U2){
|
Point3<T> U0,Point3<T> U1,Point3<T> U2){
|
||||||
return NoDivTriTriIsect(V0,V1,V2,U0,U1,U2);
|
return NoDivTriTriIsect(V0,V1,V2,U0,U1,U2);
|
||||||
}
|
}
|
||||||
|
#if 0
|
||||||
template<class T>
|
template<class T>
|
||||||
inline bool Intersection(Point3<T> V0,Point3<T> V1,Point3<T> V2,
|
inline bool Intersection(Point3<T> V0,Point3<T> V1,Point3<T> V2,
|
||||||
Point3<T> U0,Point3<T> U1,Point3<T> U2,int *coplanar,
|
Point3<T> U0,Point3<T> U1,Point3<T> U2,int *coplanar,
|
||||||
|
@ -528,7 +529,8 @@ bool Intersection( const Ray3<T> & ray, const Point3<T> & vert0,
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
|
#if 0
|
||||||
// ray-triangle, gives intersection 3d point and distance along ray
|
// ray-triangle, gives intersection 3d point and distance along ray
|
||||||
template<class T>
|
template<class T>
|
||||||
bool Intersection( const Line3<T> & ray, const Point3<T> & vert0,
|
bool Intersection( const Line3<T> & ray, const Point3<T> & vert0,
|
||||||
|
@ -577,7 +579,7 @@ bool Intersection( const Line3<T> & ray, const Point3<T> & vert0,
|
||||||
inte = vert0 + edge1*a + edge2*b;
|
inte = vert0 + edge1*a + edge2*b;
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
// line-box
|
// line-box
|
||||||
template<class T>
|
template<class T>
|
||||||
bool Intersection_Line_Box( const Box3<T> & box, const Line3<T> & r, Point3<T> & coord )
|
bool Intersection_Line_Box( const Box3<T> & box, const Line3<T> & r, Point3<T> & coord )
|
||||||
|
|
File diff suppressed because it is too large
Load Diff
|
@ -76,11 +76,7 @@ public:
|
||||||
inline Scalar &X() {return data()[0];}
|
inline Scalar &X() {return data()[0];}
|
||||||
inline Scalar &Y() {return data()[1];}
|
inline Scalar &Y() {return data()[1];}
|
||||||
|
|
||||||
inline Scalar & V( const int i )
|
// overloaded to return a const reference
|
||||||
{
|
|
||||||
assert(i>=0 && i<2);
|
|
||||||
return data()[i];
|
|
||||||
}
|
|
||||||
inline const Scalar & V( const int i ) const
|
inline const Scalar & V( const int i ) const
|
||||||
{
|
{
|
||||||
assert(i>=0 && i<2);
|
assert(i>=0 && i<2);
|
||||||
|
@ -98,45 +94,15 @@ public:
|
||||||
inline Point2(const Eigen::MatrixBase<OtherDerived>& other) : Base(other) {}
|
inline Point2(const Eigen::MatrixBase<OtherDerived>& other) : Base(other) {}
|
||||||
|
|
||||||
/// cross product
|
/// cross product
|
||||||
|
// hm.. this is not really a cross product
|
||||||
inline Scalar operator ^ ( Point2 const & p ) const
|
inline Scalar operator ^ ( Point2 const & p ) const
|
||||||
{
|
{
|
||||||
return data()[0]*p.data()[1] - data()[1]*p.data()[0];
|
return data()[0]*p.data()[1] - data()[1]*p.data()[0];
|
||||||
}
|
}
|
||||||
|
|
||||||
inline Point2 & Scale( const Scalar sx, const Scalar sy )
|
|
||||||
{
|
|
||||||
data()[0] *= sx;
|
|
||||||
data()[1] *= sy;
|
|
||||||
return * this;
|
|
||||||
}
|
|
||||||
|
|
||||||
/// lexical ordering
|
|
||||||
inline bool operator < ( Point2 const & p ) const
|
|
||||||
{
|
|
||||||
return (data()[1]!=p.data()[1])?(data()[1]<p.data()[1]):
|
|
||||||
(data()[0]<p.data()[0]);
|
|
||||||
}
|
|
||||||
/// lexical ordering
|
|
||||||
inline bool operator > ( Point2 const & p ) const
|
|
||||||
{
|
|
||||||
return (data()[1]!=p.data()[1])?(data()[1]>p.data()[1]):
|
|
||||||
(data()[0]>p.data()[0]);
|
|
||||||
}
|
|
||||||
/// lexical ordering
|
|
||||||
inline bool operator <= ( Point2 const & p ) const
|
|
||||||
{
|
|
||||||
return (data()[1]!=p.data()[1])?(data()[1]< p.data()[1]):
|
|
||||||
(data()[0]<=p.data()[0]);
|
|
||||||
}
|
|
||||||
/// lexical ordering
|
|
||||||
inline bool operator >= ( Point2 const & p ) const
|
|
||||||
{
|
|
||||||
return (data()[1]!=p.data()[1])?(data()[1]> p.data()[1]):
|
|
||||||
(data()[0]>=p.data()[0]);
|
|
||||||
}
|
|
||||||
|
|
||||||
/// returns the angle with X axis (radiants, in [-PI, +PI] )
|
/// returns the angle with X axis (radiants, in [-PI, +PI] )
|
||||||
inline Scalar Angle() const {
|
inline Scalar Angle() const
|
||||||
|
{
|
||||||
return math::Atan2(data()[1],data()[0]);
|
return math::Atan2(data()[1],data()[0]);
|
||||||
}
|
}
|
||||||
/// transform the point in cartesian coords into polar coords
|
/// transform the point in cartesian coords into polar coords
|
||||||
|
@ -168,13 +134,6 @@ public:
|
||||||
return *this;
|
return *this;
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Questa funzione estende il vettore ad un qualsiasi numero di dimensioni
|
|
||||||
/// paddando gli elementi estesi con zeri
|
|
||||||
inline Scalar Ext( const int i ) const
|
|
||||||
{
|
|
||||||
if(i>=0 && i<2) return data()[i];
|
|
||||||
else return 0;
|
|
||||||
}
|
|
||||||
/// imports from 2D points of different types
|
/// imports from 2D points of different types
|
||||||
template <class T>
|
template <class T>
|
||||||
inline void Import( const Point2<T> & b )
|
inline void Import( const Point2<T> & b )
|
||||||
|
@ -189,13 +148,6 @@ public:
|
||||||
}
|
}
|
||||||
}; // end class definition
|
}; // end class definition
|
||||||
|
|
||||||
|
|
||||||
template <class T>
|
|
||||||
inline T Angle( Point2<T> const & p0, Point2<T> const & p1 )
|
|
||||||
{
|
|
||||||
return p1.Angle() - p0.Angle();
|
|
||||||
}
|
|
||||||
|
|
||||||
typedef Point2<short> Point2s;
|
typedef Point2<short> Point2s;
|
||||||
typedef Point2<int> Point2i;
|
typedef Point2<int> Point2i;
|
||||||
typedef Point2<float> Point2f;
|
typedef Point2<float> Point2f;
|
||||||
|
|
|
@ -94,13 +94,6 @@ public:
|
||||||
template<typename OtherDerived>
|
template<typename OtherDerived>
|
||||||
inline Point3(const Eigen::MatrixBase<OtherDerived>& other) : Base(other) {}
|
inline Point3(const Eigen::MatrixBase<OtherDerived>& other) : Base(other) {}
|
||||||
|
|
||||||
/// Padding function: give a default 0 value to all the elements that are not in the [0..2] range.
|
|
||||||
/// Useful for managing in a consistent way object that could have point2 / point3 / point4
|
|
||||||
inline Scalar Ext( const int i ) const
|
|
||||||
{
|
|
||||||
if(i>=0 && i<=2) return data()[i];
|
|
||||||
else return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
template<class OtherDerived>
|
template<class OtherDerived>
|
||||||
inline void Import( const Eigen::MatrixBase<OtherDerived>& b )
|
inline void Import( const Eigen::MatrixBase<OtherDerived>& b )
|
||||||
|
@ -141,11 +134,7 @@ public:
|
||||||
inline Scalar &X() { return data()[0]; }
|
inline Scalar &X() { return data()[0]; }
|
||||||
inline Scalar &Y() { return data()[1]; }
|
inline Scalar &Y() { return data()[1]; }
|
||||||
inline Scalar &Z() { return data()[2]; }
|
inline Scalar &Z() { return data()[2]; }
|
||||||
inline Scalar & V( const int i )
|
// overloaded to return a const reference
|
||||||
{
|
|
||||||
assert(i>=0 && i<3);
|
|
||||||
return data()[i];
|
|
||||||
}
|
|
||||||
inline const Scalar & V( const int i ) const
|
inline const Scalar & V( const int i ) const
|
||||||
{
|
{
|
||||||
assert(i>=0 && i<3);
|
assert(i>=0 && i<3);
|
||||||
|
@ -210,37 +199,6 @@ public:
|
||||||
|
|
||||||
Box3<_Scalar> GetBBox(Box3<_Scalar> &bb) const;
|
Box3<_Scalar> GetBBox(Box3<_Scalar> &bb) const;
|
||||||
//@}
|
//@}
|
||||||
//@{
|
|
||||||
|
|
||||||
/** @name Comparison Operators.
|
|
||||||
Note that the reverse z prioritized ordering, useful in many situations.
|
|
||||||
**/
|
|
||||||
|
|
||||||
inline bool operator < ( Point3 const & p ) const
|
|
||||||
{
|
|
||||||
return (data()[2]!=p.data()[2])?(data()[2]<p.data()[2]):
|
|
||||||
(data()[1]!=p.data()[1])?(data()[1]<p.data()[1]):
|
|
||||||
(data()[0]<p.data()[0]);
|
|
||||||
}
|
|
||||||
inline bool operator > ( Point3 const & p ) const
|
|
||||||
{
|
|
||||||
return (data()[2]!=p.data()[2])?(data()[2]>p.data()[2]):
|
|
||||||
(data()[1]!=p.data()[1])?(data()[1]>p.data()[1]):
|
|
||||||
(data()[0]>p.data()[0]);
|
|
||||||
}
|
|
||||||
inline bool operator <= ( Point3 const & p ) const
|
|
||||||
{
|
|
||||||
return (data()[2]!=p.data()[2])?(data()[2]< p.data()[2]):
|
|
||||||
(data()[1]!=p.data()[1])?(data()[1]< p.data()[1]):
|
|
||||||
(data()[0]<=p.data()[0]);
|
|
||||||
}
|
|
||||||
inline bool operator >= ( Point3 const & p ) const
|
|
||||||
{
|
|
||||||
return (data()[2]!=p.data()[2])?(data()[2]> p.data()[2]):
|
|
||||||
(data()[1]!=p.data()[1])?(data()[1]> p.data()[1]):
|
|
||||||
(data()[0]>=p.data()[0]);
|
|
||||||
}
|
|
||||||
//@}
|
|
||||||
|
|
||||||
}; // end class definition
|
}; // end class definition
|
||||||
|
|
||||||
|
|
|
@ -89,24 +89,13 @@ public:
|
||||||
inline T &Z() {return Base::z();}
|
inline T &Z() {return Base::z();}
|
||||||
inline T &W() {return Base::w();}
|
inline T &W() {return Base::w();}
|
||||||
|
|
||||||
inline const T & V ( const int i ) const
|
// overloaded to return a const reference
|
||||||
{
|
inline const T & V (int i) const
|
||||||
assert(i>=0 && i<4);
|
|
||||||
return data()[i];
|
|
||||||
}
|
|
||||||
inline T & V ( const int i )
|
|
||||||
{
|
{
|
||||||
assert(i>=0 && i<4);
|
assert(i>=0 && i<4);
|
||||||
return data()[i];
|
return data()[i];
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Padding function: give a default 0 value to all the elements that are not in the [0..2] range.
|
|
||||||
/// Useful for managing in a consistent way object that could have point2 / point3 / point4
|
|
||||||
inline T Ext( const int i ) const
|
|
||||||
{
|
|
||||||
if(i>=0 && i<=3) return data()[i];
|
|
||||||
else return 0;
|
|
||||||
}
|
|
||||||
//@}
|
//@}
|
||||||
|
|
||||||
inline Point4 VectProd ( const Point4 &x, const Point4 &z ) const
|
inline Point4 VectProd ( const Point4 &x, const Point4 &z ) const
|
||||||
|
@ -125,45 +114,6 @@ public:
|
||||||
return res;
|
return res;
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Homogeneous normalization (division by W)
|
|
||||||
inline Point4 & HomoNormalize() {
|
|
||||||
if (data()[3]!=0.0) { Base::template start<3>() /= coeff(3); coeffRef(3) = 1.0; }
|
|
||||||
return *this;
|
|
||||||
}
|
|
||||||
|
|
||||||
//@{
|
|
||||||
/** @name Comparison operators (lexicographical order)
|
|
||||||
**/
|
|
||||||
inline bool operator < ( Point4 const & p ) const
|
|
||||||
{
|
|
||||||
return (data()[3]!=p.data()[3])?(data()[3]<p.data()[3]):
|
|
||||||
(data()[2]!=p.data()[2])?(data()[2]<p.data()[2]):
|
|
||||||
(data()[1]!=p.data()[1])?(data()[1]<p.data()[1]):
|
|
||||||
(data()[0]<p.data()[0]);
|
|
||||||
}
|
|
||||||
inline bool operator > ( const Point4 & p ) const
|
|
||||||
{
|
|
||||||
return (data()[3]!=p.data()[3])?(data()[3]>p.data()[3]):
|
|
||||||
(data()[2]!=p.data()[2])?(data()[2]>p.data()[2]):
|
|
||||||
(data()[1]!=p.data()[1])?(data()[1]>p.data()[1]):
|
|
||||||
(data()[0]>p.data()[0]);
|
|
||||||
}
|
|
||||||
inline bool operator <= ( const Point4 & p ) const
|
|
||||||
{
|
|
||||||
return (data()[3]!=p.data()[3])?(data()[3]< p.data()[3]):
|
|
||||||
(data()[2]!=p.data()[2])?(data()[2]< p.data()[2]):
|
|
||||||
(data()[1]!=p.data()[1])?(data()[1]< p.data()[1]):
|
|
||||||
(data()[0]<=p.data()[0]);
|
|
||||||
}
|
|
||||||
inline bool operator >= ( const Point4 & p ) const
|
|
||||||
{
|
|
||||||
return (data()[3]!=p.data()[3])?(data()[3]> p.data()[3]):
|
|
||||||
(data()[2]!=p.data()[2])?(data()[2]> p.data()[2]):
|
|
||||||
(data()[1]!=p.data()[1])?(data()[1]> p.data()[1]):
|
|
||||||
(data()[0]>=p.data()[0]);
|
|
||||||
}
|
|
||||||
//@}
|
|
||||||
|
|
||||||
//@{
|
//@{
|
||||||
/** @name Dot products
|
/** @name Dot products
|
||||||
**/
|
**/
|
||||||
|
|
Loading…
Reference in New Issue