48 #define OPENMESH_VECTOR_HH
51 #define TEMPLATE_HEADER template <typename Scalar, int N>
52 #define CLASSNAME VectorT
53 #define DERIVED VectorDataT<Scalar,N>
54 #define unroll(expr) for (int i=0; i<N; ++i) expr(i)
58 #if defined( OPENMESH_VECTOR_HH )
63 class CLASSNAME :
public DERIVED
78 static inline int dim() {
return DIM; }
81 static inline size_t size() {
return DIM; }
83 static const size_t size_ = DIM;
92 explicit inline VectorT(
const Scalar& v) {
99 inline VectorT(
const Scalar& v0,
const Scalar& v1) {
101 Base::values_[0] = v0; Base::values_[1] = v1;
105 inline VectorT(
const Scalar& v0,
const Scalar& v1,
const Scalar& v2) {
107 Base::values_[0]=v0; Base::values_[1]=v1; Base::values_[2]=v2;
111 inline VectorT(
const Scalar& v0,
const Scalar& v1,
112 const Scalar& v2,
const Scalar& v3) {
114 Base::values_[0]=v0; Base::values_[1]=v1; Base::values_[2]=v2; Base::values_[3]=v3;
118 inline VectorT(
const Scalar& v0,
const Scalar& v1,
const Scalar& v2,
119 const Scalar& v3,
const Scalar& v4) {
121 Base::values_[0]=v0; Base::values_[1]=v1;Base::values_[2]=v2; Base::values_[3]=v3; Base::values_[4]=v4;
125 inline VectorT(
const Scalar& v0,
const Scalar& v1,
const Scalar& v2,
126 const Scalar& v3,
const Scalar& v4,
const Scalar& v5) {
128 Base::values_[0]=v0; Base::values_[1]=v1; Base::values_[2]=v2;
129 Base::values_[3]=v3; Base::values_[4]=v4; Base::values_[5]=v5;
133 explicit inline VectorT(
const Scalar _values[DIM]) {
134 memcpy(Base::values_, _values, DIM*
sizeof(Scalar));
141 inline vector_type& operator=(
const vector_type& _rhs) {
142 memcpy(Base::values_, _rhs.Base::values_, DIM*
sizeof(Scalar));
149 template<
typename otherScalarType>
160 template<
typename otherScalarType>
162 #define expr(i) Base::values_[i] = (Scalar)_rhs[i];
175 inline Scalar*
data() {
return Base::values_; }
178 inline const Scalar*
data()
const {
return Base::values_; }
197 assert(_i<DIM);
return Base::values_[_i];
202 assert(_i<DIM);
return Base::values_[_i];
212 #define expr(i) if(Base::values_[i]!=_rhs.Base::values_[i]) return false;
220 return !(*
this == _rhs);
230 #define expr(i) Base::values_[i] *= _s;
239 #define expr(i) Base::values_[i] /= _s;
251 #define expr(i) Base::values_[i] * _s
263 #define expr(i) Base::values_[i] / _s
278 #define expr(i) Base::values_[i] *= _rhs[i];
286 #define expr(i) Base::values_[i] /= _rhs[i];
294 #define expr(i) Base::values_[i] -= _rhs[i];
302 #define expr(i) Base::values_[i] += _rhs[i];
314 #define expr(i) Base::values_[i] * _v.Base::values_[i]
326 #define expr(i) Base::values_[i] / _v.Base::values_[i]
338 #define expr(i) Base::values_[i] + _v.Base::values_[i]
350 #define expr(i) Base::values_[i] - _v.Base::values_[i]
360 #define expr(i) v.Base::values_[i] = -Base::values_[i];
373 VectorT<Scalar,3>(Base::values_[1]*_rhs.Base::values_[2]-Base::values_[2]*_rhs.Base::values_[1],
374 Base::values_[2]*_rhs.Base::values_[0]-Base::values_[0]*_rhs.Base::values_[2],
375 Base::values_[0]*_rhs.Base::values_[1]-Base::values_[1]*_rhs.Base::values_[0]);
386 #define expr(i) p += Base::values_[i] * _rhs.Base::values_[i];
401 inline Scalar
norm()
const {
return (Scalar)sqrt(sqrnorm()); }
402 inline Scalar
length()
const {
return norm(); }
405 inline Scalar sqrnorm()
const
409 #define expr(i) s += Base::values_[i] * Base::values_[i];
414 #define expr(i) Base::values_[i]*Base::values_[i]
415 return (unroll_comb(expr, +));
434 return *
this / norm();
442 if (n != (Scalar)0.0)
457 inline Scalar l1_norm()
const
461 #define expr(i) s += std::abs(Base::values_[i]);
466 #define expr(i) std::abs(Base::values_[i])
467 return (unroll_comb(expr, +));
473 inline Scalar l8_norm()
const
486 inline Scalar max()
const
488 Scalar m(Base::values_[0]);
489 for(
int i=1; i<DIM; ++i) if(Base::values_[i]>m) m=Base::values_[i];
494 inline Scalar max_abs()
const
496 Scalar m(std::abs(Base::values_[0]));
497 for(
int i=1; i<DIM; ++i)
498 if(std::abs(Base::values_[i])>m)
499 m=std::abs(Base::values_[i]);
505 inline Scalar min()
const
507 Scalar m(Base::values_[0]);
508 for(
int i=1; i<DIM; ++i)
if(Base::values_[i]<m) m=Base::values_[i];
513 inline Scalar min_abs()
const
515 Scalar m(std::abs(Base::values_[0]));
516 for(
int i=1; i<DIM; ++i)
517 if(std::abs(Base::values_[i])<m)
518 m=std::abs(Base::values_[i]);
524 Scalar m(Base::values_[0]);
525 for(
int i=1; i<DIM; ++i) m+=Base::values_[i];
526 return m/Scalar(DIM);
531 Scalar m(std::abs(Base::values_[0]));
532 for(
int i=1; i<DIM; ++i) m+=std::abs(Base::values_[i]);
533 return m/Scalar(DIM);
539 #define expr(i) if (_rhs[i] < Base::values_[i]) Base::values_[i] = _rhs[i];
548 #define expr(i) if (_rhs[i] < Base::values_[i]) { Base::values_[i] = _rhs[i]; result = true; }
556 #define expr(i) if (_rhs[i] > Base::values_[i]) Base::values_[i] = _rhs[i];
565 #define expr(i) if (_rhs[i] > Base::values_[i]) { Base::values_[i] =_rhs[i]; result = true; }
586 template<
typename Functor>
589 #define expr(i) result[i] = _func(Base::values_[i]);
597 #define expr(i) Base::values_[i] = _s;
612 #define expr(i) if (Base::values_[i] != _rhs.Base::values_[i]) \
613 return (Base::values_[i] < _rhs.Base::values_[i]);
627 #define expr(i) is >> vec[i];
637 operator<<(std::ostream& os, const VectorT<Scalar,DIM>& vec)
640 for(
int i=0; i<N-1; ++i) os << vec[i] <<
" ";
643 #define expr(i) vec[i]
644 os << unroll_comb(expr, <<
" " <<);
653 #endif // included by VectorT.hh