⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 vectort_inc.hh

📁 penMesh is a generic and efficient data structure for representing and manipulating polygonal meshes
💻 HH
字号:
//=============================================================================////                               OpenMesh//      Copyright (C) 2001-2005 by Computer Graphics Group, RWTH Aachen//                           www.openmesh.org////-----------------------------------------------------------------------------////                                License////   This library is free software; you can redistribute it and/or modify it//   under the terms of the GNU Library General Public License as published//   by the Free Software Foundation, version 2.////   This library 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//   Library General Public License for more details.////   You should have received a copy of the GNU Library General Public//   License along with this library; if not, write to the Free Software//   Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.////-----------------------------------------------------------------------------////   $Revision: 1.5.2.1 $//   $Date: 2007-02-26 12:51:17 $////=============================================================================#if defined( OPENMESH_VECTOR_HH )// ----------------------------------------------------------------------------TEMPLATE_HEADERclass CLASSNAME : public DERIVED{public:  //---------------------------------------------------------------- class info  /// the type of the scalar used in this template  typedef Scalar value_type;  /// type of this vector  typedef VectorT<Scalar,DIM>  vector_type;  /// returns dimension of the vector (deprecated)  static inline int dim() { return DIM; }  /// returns dimension of the vector  static inline size_t size() { return DIM; }  static const size_t size_ = DIM;  //-------------------------------------------------------------- constructors  /// default constructor creates uninitialized values.  inline VectorT() {}  /// special constructor for 1D vectors  explicit inline VectorT(const Scalar& v) {//     assert(DIM==1);//     values_[0] = v0;    vectorize(v);  }  /// special constructor for 2D vectors  inline VectorT(const Scalar& v0, const Scalar& v1) {    assert(DIM==2);    this->values_[0] = v0; this->values_[1] = v1;  }  /// special constructor for 3D vectors  inline VectorT(const Scalar& v0, const Scalar& v1, const Scalar& v2) {    assert(DIM==3);    this->values_[0]=v0; this->values_[1]=v1; this->values_[2]=v2;  }  /// special constructor for 4D vectors  inline VectorT(const Scalar& v0, const Scalar& v1,     const Scalar& v2, const Scalar& v3) {    assert(DIM==4);    this->values_[0]=v0; this->values_[1]=v1; this->values_[2]=v2; this->values_[3]=v3;  }  /// special constructor for 5D vectors  inline VectorT(const Scalar& v0, const Scalar& v1, const Scalar& v2,     const Scalar& v3, const Scalar& v4) {    assert(DIM==5);    this->values_[0]=v0; this->values_[1]=v1;this->values_[2]=v2; this->values_[3]=v3; this->values_[4]=v4;  }  /// special constructor for 6D vectors  inline VectorT(const Scalar& v0, const Scalar& v1, const Scalar& v2,     const Scalar& v3, const Scalar& v4, const Scalar& v5) {    assert(DIM==6);    this->values_[0]=v0; this->values_[1]=v1; this->values_[2]=v2;    this->values_[3]=v3; this->values_[4]=v4; this->values_[5]=v5;  }  /// construct from a value array (explicit)  explicit inline VectorT(const Scalar _values[DIM]) {    memcpy(this->values_, _values, DIM*sizeof(Scalar));  }#ifdef OM_CC_MIPS  /// assignment from a vector of the same kind  // mipspro need this method  inline vector_type& operator=(const vector_type& _rhs) {    memcpy(this->values_, _rhs.values_, DIM*sizeof(Scalar));    return *this;  }#endif  /// copy & cast constructor (explicit)  template<typename otherScalarType>  explicit inline VectorT(const VectorT<otherScalarType,DIM>& _rhs) {    operator=(_rhs);  }  //--------------------------------------------------------------------- casts  /// cast from vector with a different scalar type  template<typename otherScalarType>  inline vector_type& operator=(const VectorT<otherScalarType,DIM>& _rhs) {#define expr(i)  this->values_[i] = (Scalar)_rhs[i];    unroll(expr);#undef expr    return *this;  }  /// access to Scalar array  inline Scalar* data() { return this->values_; }  /// access to const Scalar array  inline const Scalar*data() const { return this->values_; }   //----------------------------------------------------------- element access   /// get i'th element read-write  inline Scalar& operator[](size_t _i) {    assert(_i>=0 && _i<DIM); return this->values_[_i];  }  /// get i'th element read-only  inline const Scalar& operator[](size_t _i) const {    assert(_i>=0 && _i<DIM); return this->values_[_i];  }  //---------------------------------------------------------------- comparsion  /// component-wise comparison  inline bool operator==(const vector_type& _rhs) const {#define expr(i) if(this->values_[i]!=_rhs.values_[i]) return false;    unroll(expr);#undef expr    return true;  }  /// component-wise comparison  inline bool operator!=(const vector_type& _rhs) const {    return !(*this == _rhs);  }  //---------------------------------------------------------- scalar operators  /// component-wise self-multiplication with scalar  inline vector_type& operator*=(const Scalar& _s) {#define expr(i) this->values_[i] *= _s;    unroll(expr);#undef expr    return *this;  }  /** component-wise self-division by scalar      \attention v *= (1/_s) is much faster than this  */  inline vector_type& operator/=(const Scalar& _s) {#define expr(i) this->values_[i] /= _s;    unroll(expr);#undef expr    return *this;  }  /// component-wise multiplication with scalar  inline vector_type operator*(const Scalar& _s) const {#if DIM==N    return vector_type(*this) *= _s;#else#define expr(i) this->values_[i] * _s    return vector_type(unroll_csv(expr));#undef expr#endif  }  /// component-wise division by with scalar  inline vector_type operator/(const Scalar& _s) const {#if DIM==N    return vector_type(*this) /= _s;#else#define expr(i) this->values_[i] / _s    return vector_type(unroll_csv(expr));#undef expr#endif  }  //---------------------------------------------------------- vector operators  /// component-wise self-multiplication  inline vector_type& operator*=(const vector_type& _rhs) {#define expr(i) this->values_[i] *= _rhs[i];    unroll(expr);#undef expr    return *this;  }  /// component-wise self-division  inline vector_type& operator/=(const vector_type& _rhs) {#define expr(i) this->values_[i] /= _rhs[i];    unroll(expr);#undef expr    return *this;  }  /// vector difference from this  inline vector_type& operator-=(const vector_type& _rhs) {#define expr(i) this->values_[i] -= _rhs[i];    unroll(expr);#undef expr    return *this;  }  /// vector self-addition  inline vector_type& operator+=(const vector_type& _rhs) {#define expr(i) this->values_[i] += _rhs[i];    unroll(expr);#undef expr    return *this;  }  /// component-wise vector multiplication  inline vector_type operator*(const vector_type& _v) const {#if DIM==N    return vector_type(*this) *= _v;#else#define expr(i) this->values_[i] * _v.values_[i]    return vector_type(unroll_csv(expr));#undef expr#endif  }  /// component-wise vector division  inline vector_type operator/(const vector_type& _v) const {#if DIM==N    return vector_type(*this) /= _v;#else#define expr(i) this->values_[i] / _v.values_[i]    return vector_type(unroll_csv(expr));#undef expr#endif  }  /// component-wise vector addition  inline vector_type operator+(const vector_type& _v) const {#if DIM==N    return vector_type(*this) += _v;#else#define expr(i) this->values_[i] + _v.values_[i]    return vector_type(unroll_csv(expr));#undef expr#endif  }  /// component-wise vector difference  inline vector_type operator-(const vector_type& _v) const {#if DIM==N    return vector_type(*this) -= _v;#else#define expr(i) this->values_[i] - _v.values_[i]    return vector_type(unroll_csv(expr));#undef expr#endif  }  /// unary minus  inline vector_type operator-(void) const {    vector_type v;#define expr(i) v.values_[i] = -this->values_[i];    unroll(expr);#undef expr    return v;  }  /// cross product: only defined for Vec3* as specialization  /// \see OpenMesh::cross  inline VectorT<Scalar,3> operator%(const VectorT<Scalar,3>& _rhs) const#if DIM==3  {    return      VectorT<Scalar,3>(this->values_[1]*_rhs.values_[2]-this->values_[2]*_rhs.values_[1],			this->values_[2]*_rhs.values_[0]-this->values_[0]*_rhs.values_[2],			this->values_[0]*_rhs.values_[1]-this->values_[1]*_rhs.values_[0]);  }#else  ;#endif  /// compute scalar product  /// \see OpenMesh::dot  inline Scalar operator|(const vector_type& _rhs) const {  Scalar p(0);#define expr(i) p += this->values_[i] * _rhs.values_[i];  unroll(expr);#undef expr    return p;  }  //------------------------------------------------------------ euclidean norm  /// \name Euclidean norm calculations  //@{  /// compute euclidean norm  inline Scalar norm() const { return (Scalar)sqrt(sqrnorm()); }  inline Scalar length() const { return norm(); } // OpenSG interface  /// compute squared euclidean norm  inline Scalar sqrnorm() const {#if DIM==N    Scalar s(0);#define expr(i) s += this->values_[i] * this->values_[i];    unroll(expr);#undef expr    return s;#else#define expr(i) this->values_[i]*this->values_[i]    return (unroll_comb(expr, +));#undef expr#endif  }  //@}  /** normalize vector, return normalized vector      \attention avoids div by zero only in debug mode */  inline vector_type& normalize() {#ifdef NDEBUG    operator*=(((Scalar)1.0)/norm());#else    Scalar n = norm();    if (n != (Scalar)0.0)      *this *= Scalar(1.0/n);#endif    return *this;  }  //------------------------------------------------------------ max, min, mean  /// return the maximal component  inline Scalar max() const {    Scalar m(this->values_[0]);    for(int i=1; i<DIM; ++i) if(this->values_[i]>m) m=this->values_[i];    return m;  }  /// return the minimal component  inline Scalar min() const {    Scalar m(this->values_[0]);    for(int i=1; i<DIM; ++i) if(this->values_[i]<m) m=this->values_[i];    return m;  }  /// return arithmetic mean  inline Scalar mean() const {    Scalar m(this->values_[0]);    for(int i=1; i<DIM; ++i) m+=this->values_[i];    return m/Scalar(DIM);  }  /// minimize values: same as *this = min(*this, _rhs), but faster  inline vector_type& minimize(const vector_type& _rhs) {#define expr(i) if (_rhs[i] < this->values_[i]) this->values_[i] = _rhs[i];    unroll(expr);#undef expr    return *this;  }  /// maximize values: same as *this = max(*this, _rhs), but faster  inline vector_type& maximize(const vector_type& _rhs) {#define expr(i) if (_rhs[i] > this->values_[i]) this->values_[i] = _rhs[i];    unroll(expr);#undef expr    return *this;  }  /// component-wise min  inline vector_type min(const vector_type& _rhs) {    return vector_type(*this).minimize(_rhs);  }  /// component-wise max  inline vector_type max(const vector_type& _rhs) {    return vector_type(*this).maximize(_rhs);  }  //------------------------------------------------------------ misc functions  /// component-wise apply function object with Scalar operator()(Scalar).  template<typename Functor>  inline vector_type apply(const Functor& _func) const {    vector_type result;#define expr(i) result[i] = _func(this->values_[i]);    unroll(expr);#undef expr    return result;  }  /// store the same value in each component (e.g. to clear all entries)  vector_type& vectorize(const Scalar& _s) {#define expr(i) this->values_[i] = _s;    unroll(expr);#undef expr    return *this;  }  /// store the same value in each component  static vector_type vectorized(const Scalar& _s) {    return vector_type().vectorize(_s);  }  /// lexicographical comparison  bool operator<(const vector_type& _rhs) const {#define expr(i) if (this->values_[i] != _rhs.values_[i]) \                   return (this->values_[i] < _rhs.values_[i]);    unroll(expr);#undef expr    return false;   }};/// read the space-separated components of a vector from a streamTEMPLATE_HEADERinline std::istream&operator>>(std::istream& is, VectorT<Scalar,DIM>& vec){#define expr(i) is >> vec[i];  unroll(expr);#undef expr  return is;}/// output a vector by printing its space-separated compontensTEMPLATE_HEADERinline std::ostream&operator<<(std::ostream& os, const VectorT<Scalar,DIM>& vec){#if DIM==N  for(int i=0; i<N-1; ++i) os << vec[i] << " ";  os << vec[N-1];#else#define expr(i) vec[i]  os << unroll_comb(expr, << " " <<);#undef expr#endif  return os;}// ----------------------------------------------------------------------------#endif // included by VectorT.hh//=============================================================================

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -