58 #define OPENVOLUMEMESH_VECTOR_HH 61 #define TEMPLATE_HEADER template <typename Scalar, int N> 62 #define CLASSNAME VectorT 63 #define DERIVED VectorDataT<Scalar,N> 64 #define unroll(expr) for (int i=0; i<N; ++i) expr(i) 68 #if defined( OPENVOLUMEMESH_VECTOR_HH ) 88 static inline int dim() {
return DIM; }
91 static inline size_t size() {
return DIM; }
93 static const size_t size_ = DIM;
109 inline VectorT(
const Scalar v0,
const Scalar v1) {
111 Base::values_[0] = v0; Base::values_[1] = v1;
116 inline VectorT(
const Scalar v0,
const Scalar v1,
const Scalar v2) {
118 Base::values_[0]=v0; Base::values_[1]=v1; Base::values_[2]=v2;
123 inline VectorT(
const Scalar v0,
const Scalar v1,
125 const Scalar v2,
const Scalar v3) {
126 Base::values_[0]=v0; Base::values_[1]=v1; Base::values_[2]=v2; Base::values_[3]=v3;
129 VectorT homogenized()
const {
return VectorT(Base::values_[0]/Base::values_[3], Base::values_[1]/Base::values_[3], Base::values_[2]/Base::values_[3], 1); }
133 inline VectorT(
const Scalar v0,
const Scalar v1,
const Scalar v2,
135 const Scalar v3,
const Scalar v4) {
136 Base::values_[0]=v0; Base::values_[1]=v1;Base::values_[2]=v2; Base::values_[3]=v3; Base::values_[4]=v4;
141 inline VectorT(
const Scalar v0,
const Scalar v1,
const Scalar v2,
143 const Scalar v3,
const Scalar v4,
const Scalar v5) {
144 Base::values_[0]=v0; Base::values_[1]=v1; Base::values_[2]=v2;
145 Base::values_[3]=v3; Base::values_[4]=v4; Base::values_[5]=v5;
150 explicit inline VectorT(
const Scalar _values[DIM]) {
151 memcpy(
data(), _values, DIM*
sizeof(Scalar));
159 memcpy(Base::values_, _rhs.Base::values_, DIM*
sizeof(Scalar));
166 template<
typename otherScalarType>
167 explicit inline VectorT(
const VectorT<otherScalarType,DIM>& _rhs) {
177 template<
typename otherScalarType>
179 #define expr(i) Base::values_[i] = (Scalar)_rhs[i]; 192 inline Scalar*
data() {
return Base::values_; }
195 inline const Scalar*
data()
const {
return Base::values_; }
212 assert(_i<DIM);
return Base::values_[_i];
217 assert(_i<DIM);
return Base::values_[_i];
227 #define expr(i) if(Base::values_[i]!=_rhs.Base::values_[i]) return false; 235 return !(*
this == _rhs);
245 #define expr(i) Base::values_[i] *= _s; 254 #define expr(i) Base::values_[i] /= _s; 266 #define expr(i) Base::values_[i] * _s 278 #define expr(i) Base::values_[i] / _s 293 #define expr(i) Base::values_[i] *= _rhs[i]; 301 #define expr(i) Base::values_[i] /= _rhs[i]; 309 #define expr(i) Base::values_[i] -= _rhs[i]; 317 #define expr(i) Base::values_[i] += _rhs[i]; 329 #define expr(i) Base::values_[i] * _v.Base::values_[i] 341 #define expr(i) Base::values_[i] / _v.Base::values_[i] 353 #define expr(i) Base::values_[i] + _v.Base::values_[i] 365 #define expr(i) Base::values_[i] - _v.Base::values_[i] 375 #define expr(i) v.Base::values_[i] = -Base::values_[i]; 384 inline VectorT<Scalar,3>
operator%(
const VectorT<Scalar,3>& _rhs)
const 388 VectorT<Scalar,3>(Base::values_[1]*_rhs.Base::values_[2]-Base::values_[2]*_rhs.Base::values_[1],
389 Base::values_[2]*_rhs.Base::values_[0]-Base::values_[0]*_rhs.Base::values_[2],
390 Base::values_[0]*_rhs.Base::values_[1]-Base::values_[1]*_rhs.Base::values_[0]);
401 #define expr(i) p += Base::values_[i] * _rhs.Base::values_[i]; 415 inline Scalar
norm()
const {
return (Scalar)sqrt(
sqrnorm()); }
417 inline Scalar length()
const {
return norm(); }
424 #define expr(i) s += Base::values_[i] * Base::values_[i]; 429 #define expr(i) Base::values_[i]*Base::values_[i] 430 return (unroll_comb(expr, +));
449 return *
this /
norm();
457 if (n != (Scalar)0.0)
476 #define expr(i) s += std::abs(Base::values_[i]); 481 #define expr(i) std::abs(Base::values_[i]) 482 return (unroll_comb(expr, +));
503 Scalar m(Base::values_[0]);
504 for(
int i=1; i<DIM; ++i)
if(Base::values_[i]>m) m=Base::values_[i];
511 Scalar m(std::abs(Base::values_[0]));
512 for(
int i=1; i<DIM; ++i)
513 if(std::abs(Base::values_[i])>m)
514 m=std::abs(Base::values_[i]);
522 Scalar m(Base::values_[0]);
523 for(
int i=1; i<DIM; ++i)
if(Base::values_[i]<m) m=Base::values_[i];
530 Scalar m(std::abs(Base::values_[0]));
531 for(
int i=1; i<DIM; ++i)
532 if(std::abs(Base::values_[i])<m)
533 m=std::abs(Base::values_[i]);
539 Scalar m(Base::values_[0]);
540 for(
int i=1; i<DIM; ++i) m+=Base::values_[i];
541 return m/Scalar(DIM);
546 Scalar m(std::abs(Base::values_[0]));
547 for(
int i=1; i<DIM; ++i) m+=std::abs(Base::values_[i]);
548 return m/Scalar(DIM);
554 #define expr(i) if (_rhs[i] < Base::values_[i]) Base::values_[i] = _rhs[i]; 563 #define expr(i) if (_rhs[i] < Base::values_[i]) { Base::values_[i] = _rhs[i]; result = true; } 571 #define expr(i) if (_rhs[i] > Base::values_[i]) Base::values_[i] = _rhs[i]; 580 #define expr(i) if (_rhs[i] > Base::values_[i]) { Base::values_[i] =_rhs[i]; result = true; } 601 template<
typename Functor>
604 #define expr(i) result[i] = _func(Base::values_[i]); 612 #define expr(i) Base::values_[i] = _s; 627 #define expr(i) if (Base::values_[i] != _rhs.Base::values_[i]) \ 628 return (Base::values_[i] < _rhs.Base::values_[i]); 640 operator>>(std::istream& is, VectorT<Scalar,DIM>& vec)
642 #define expr(i) is >> vec[i]; 652 operator<<(std::ostream& os,
const VectorT<Scalar,DIM>& vec)
655 for(
int i=0; i<N-1; ++i) os << vec[i] <<
" ";
658 #define expr(i) vec[i] 659 os << unroll_comb(expr, <<
" " <<);
668 #endif // included by VectorT.hh VectorT< Scalar, DIM > vector_type
type of this vector
Definition: VectorT_inc.hh:85
const Scalar & operator[](size_t _i) const
get i'th element read-only
Definition: VectorT_inc.hh:216
vector_type & operator *=(const Scalar &_s)
component-wise self-multiplication with scalar
Definition: VectorT_inc.hh:244
Scalar mean() const
return arithmetic mean
Definition: VectorT_inc.hh:538
VectorT(const Scalar _values[DIM])
construct from a value array (explicit)
Definition: VectorT_inc.hh:150
Scalar sqrnorm() const
compute squared euclidean norm
Definition: VectorT_inc.hh:420
vector_type & vectorize(const Scalar &_s)
store the same value in each component (e.g. to clear all entries)
Definition: VectorT_inc.hh:611
bool operator!=(const vector_type &_rhs) const
component-wise comparison
Definition: VectorT_inc.hh:234
vector_type & normalize()
Definition: VectorT_inc.hh:438
vector_type & operator/=(const vector_type &_rhs)
component-wise self-division
Definition: VectorT_inc.hh:300
Scalar value_type
the type of the scalar used in this template
Definition: VectorT_inc.hh:82
vector_type operator/(const Scalar &_s) const
component-wise division by with scalar
Definition: VectorT_inc.hh:274
Scalar operator|(const vector_type &_rhs) const
Definition: VectorT_inc.hh:399
vector_type & maximize(const vector_type &_rhs)
maximize values: same as *this = max(*this, _rhs), but faster
Definition: VectorT_inc.hh:570
bool maximized(const vector_type &_rhs)
maximize values and signalize coordinate maximization
Definition: VectorT_inc.hh:578
bool minimized(const vector_type &_rhs)
minimize values and signalize coordinate minimization
Definition: VectorT_inc.hh:561
Scalar mean_abs() const
return absolute arithmetic mean
Definition: VectorT_inc.hh:545
VectorT< Scalar, 3 > operator%(const VectorT< Scalar, 3 > &_rhs) const
Scalar l8_norm() const
compute l8_norm
Definition: VectorT_inc.hh:488
vector_type & operator/=(const Scalar &_s)
Definition: VectorT_inc.hh:253
VectorT()
default constructor creates uninitialized values.
Definition: VectorT_inc.hh:99
vector_type operator+(const vector_type &_v) const
component-wise vector addition
Definition: VectorT_inc.hh:349
Definition: VectorT_inc.hh:73
vector_type operator/(const vector_type &_v) const
component-wise vector division
Definition: VectorT_inc.hh:337
Scalar min_abs() const
return the minimal absolute component
Definition: VectorT_inc.hh:528
vector_type operator *(const Scalar &_s) const
component-wise multiplication with scalar
Definition: VectorT_inc.hh:262
vector_type min(const vector_type &_rhs) const
component-wise min
Definition: VectorT_inc.hh:587
vector_type & minimize(const vector_type &_rhs)
minimize values: same as *this = min(*this, _rhs), but faster
Definition: VectorT_inc.hh:553
vector_type & operator=(const VectorT< otherScalarType, DIM > &_rhs)
cast from vector with a different scalar type
Definition: VectorT_inc.hh:178
vector_type operator-(void) const
unary minus
Definition: VectorT_inc.hh:373
Scalar l1_norm() const
compute L1 (Manhattan) norm
Definition: VectorT_inc.hh:472
bool operator==(const vector_type &_rhs) const
component-wise comparison
Definition: VectorT_inc.hh:226
static vector_type vectorized(const Scalar &_s)
store the same value in each component
Definition: VectorT_inc.hh:620
const vector_type normalized() const
Definition: VectorT_inc.hh:447
Scalar max_abs() const
return the maximal absolute component
Definition: VectorT_inc.hh:509
static int dim()
returns dimension of the vector (deprecated)
Definition: VectorT_inc.hh:88
vector_type apply(const Functor &_func) const
component-wise apply function object with Scalar operator()(Scalar).
Definition: VectorT_inc.hh:602
vector_type max(const vector_type &_rhs) const
component-wise max
Definition: VectorT_inc.hh:592
vector_type & operator+=(const vector_type &_rhs)
vector self-addition
Definition: VectorT_inc.hh:316
VectorT(const VectorT< otherScalarType, DIM > &_rhs)
copy & cast constructor (explicit)
Definition: VectorT_inc.hh:167
vector_type operator-(const vector_type &_v) const
component-wise vector difference
Definition: VectorT_inc.hh:361
Scalar norm() const
compute euclidean norm
Definition: VectorT_inc.hh:416
vector_type & normalize_cond()
Definition: VectorT_inc.hh:454
static size_t size()
returns dimension of the vector
Definition: VectorT_inc.hh:91
vector_type & operator-=(const vector_type &_rhs)
vector difference from this
Definition: VectorT_inc.hh:308
Scalar max() const
return the maximal component
Definition: VectorT_inc.hh:501
VectorT(const Scalar &v)
special constructor for 1D vectors
Definition: VectorT_inc.hh:102
Scalar * data()
access to Scalar array
Definition: VectorT_inc.hh:192
Scalar min() const
return the minimal component
Definition: VectorT_inc.hh:520
const Scalar * data() const
access to const Scalar array
Definition: VectorT_inc.hh:195
Scalar & operator[](size_t _i)
get i'th element read-write
Definition: VectorT_inc.hh:211
bool operator<(const vector_type &_rhs) const
lexicographical comparison
Definition: VectorT_inc.hh:626