DGtal  0.6.devel
 All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Groups Pages
PointVector.ih
1 
30 
31 // IMPLEMENTATION of inline methods.
33 
35 #include <cstdlib>
36 #include <cmath>
37 #include <DGtal/base/BasicFunctors.h>
38 #include "DGtal/io/Color.h"
40 template<Dimension dim, typename Container>
41 inline
42 std::bitset<dim> DGtal::setDimensionsIn( const Container &dimensions )
43 {
44  std::bitset<dim> t1;
45  for ( typename Container::const_iterator it=dimensions.begin();
46  it!=dimensions.end(); ++it )
47  {
48  ASSERT( *it<dim );
49  t1.set(*it);
50  }
51  return t1;
52 }
53 //------------------------------------------------------------------------------
54 template<Dimension dim, typename Container>
55 inline
56 std::bitset<dim> DGtal::setDimensionsNotIn( const Container &dimensions )
57 {
58  std::bitset<dim> t1; t1.set();
59  for ( typename Container::const_iterator it=dimensions.begin();
60  it!=dimensions.end(); ++it )
61  {
62  ASSERT( *it<dim );
63  t1.reset(*it);
64  }
65  return t1;
66 }
67 //------------------------------------------------------------------------------
68 template<Dimension dim, typename TComponent>
69 inline
71 {
72  for ( Dimension i = 0; i < dim; ++i )
73  myArray[ i ] = NumberTraits<TComponent>::ZERO;
74 }
75 //------------------------------------------------------------------------------
76 template<Dimension dim, typename TComponent>
77 template<typename Functor>
78 inline
80  const Self& apoint2,
81  const Functor& f)
82 {
83  for ( Dimension i = 0; i < dim; ++i )
84  myArray[ i ] = f.operator() (apoint1[i], apoint2[i]);
85 }
86 //------------------------------------------------------------------------------
87 template<Dimension dim, typename TComponent>
88 inline
90 {}
91 //------------------------------------------------------------------------------
92 template<Dimension dim, typename TComponent>
93 inline
95 {
96  // The problem here is that we have no guaranty on the size of init !!
97  for ( Dimension i = 0; i < dim; ++i )
98  myArray[ i ] = ptrValues[ i ];
99 }
100 //------------------------------------------------------------------------------
101 template<Dimension dim, typename TComponent>
102 inline
104 {
105  ASSERT( dim >= 2 );
106  myArray[ 0 ] = x;
107  myArray[ 1 ] = y;
108  for ( Dimension i = 2; i < dim; ++i )
109  myArray[ i ] = NumberTraits<TComponent>::ZERO;
110 }
111 //------------------------------------------------------------------------------
112 template<Dimension dim, typename TComponent>
113 inline
115  const Component & y,
116  const Component & z )
117 {
118  ASSERT( dim >= 3 );
119  myArray[ 0 ] = x;
120  myArray[ 1 ] = y;
121  myArray[ 2 ] = z;
122  for ( Dimension i = 3; i < dim; ++i )
123  myArray[ i ] = NumberTraits<TComponent>::ZERO;
124 }
125 //------------------------------------------------------------------------------
126 template<Dimension dim, typename TComponent>
127 inline
129  const Component & y,
130  const Component & z,
131  const Component & t )
132 {
133  ASSERT( dim >= 4 );
134  myArray[ 0 ] = x;
135  myArray[ 1 ] = y;
136  myArray[ 2 ] = z;
137  myArray[ 3 ] = t;
138  for ( Dimension i = 4; i < dim; ++i )
139  myArray[ i ] = NumberTraits<TComponent>::ZERO;
140 }
141 //------------------------------------------------------------------------------
142 #ifdef CPP11_INITIALIZER_LIST
143 template<Dimension dim, typename TComponent>
144 inline
145 DGtal::PointVector<dim, TComponent>::PointVector(std::initializer_list<Component> init)
146 {
147  unsigned int i = 0;
148  for (const Component *p = init.begin (); p != init.end () && i < dim; ++p, ++i)
149  myArray[ i ] = *p;
150  for ( ; i < dim; ++i)
151  myArray[i] = NumberTraits<TComponent>::ZERO;
152 }
153 #endif // CPP11_INITIALIZER_LIST
154 //------------------------------------------------------------------------------
155 template<Dimension dim, typename TComponent>
156 inline
158  : myArray( other.myArray )
159 {}
160 //------------------------------------------------------------------------------
161 template<Dimension dim, typename TComponent>
162 template<typename OtherComponent>
163 inline
165 {
166  for ( Dimension i = 0; i < dimension; ++i )
167  this->myArray[ i ] = (int)(static_cast<OtherComponent>(other[ i ]));
168 }
169 //------------------------------------------------------------------------------
170 template<Dimension dim, typename TComponent>
171 inline
174 {
175  return myArray.begin();
176 }
177 //------------------------------------------------------------------------------
178 template<Dimension dim, typename TComponent>
179 inline
182 {
183  return myArray.end();
184 }
185 //------------------------------------------------------------------------------
186 template<Dimension dim, typename TComponent>
187 inline
190 {
191  return myArray.begin();
192 }
193 //------------------------------------------------------------------------------
194 template<Dimension dim, typename TComponent>
195 inline
198 {
199  return myArray.end();
200 }
201 //------------------------------------------------------------------------------
202 template<Dimension dim, typename TComponent>
203 inline
206 {
207  return myArray.rbegin();
208 }
209 //------------------------------------------------------------------------------
210 template<Dimension dim, typename TComponent>
211 inline
214 {
215  return myArray.rend();
216 }
217 //------------------------------------------------------------------------------
218 template<Dimension dim, typename TComponent>
219 inline
222 {
223  return myArray.rbegin();
224 }
225 //------------------------------------------------------------------------------
226 template<Dimension dim, typename TComponent>
227 inline
230 {
231  return myArray.rend();
232 }
233 //------------------------------------------------------------------------------
234 template<Dimension dim, typename TComponent>
235 inline
236 typename DGtal::Dimension
238 {
239  return dim;
240 }
241 //------------------------------------------------------------------------------
242 template<Dimension dim, typename TComponent>
243 inline
246 {
247  ASSERT ( i < dim );
248  return myArray.at( i );
249 }
250 //------------------------------------------------------------------------------
251 template<Dimension dim, typename TComponent>
252 inline
255 {
256  ASSERT ( i < dim );
257  return myArray.at( i );
258 }
259 //------------------------------------------------------------------------------
260 template<Dimension dim, typename TComponent>
261 inline
264 {
265  ASSERT ( i < dim );
266  return myArray[i];
267 }
268 //------------------------------------------------------------------------------
269 template<Dimension dim, typename TComponent>
270 inline
273 {
274  ASSERT ( i < dim );
275  return myArray[i];
276 }
277 //------------------------------------------------------------------------------
278 template<Dimension dim, typename TComponent>
281 {
282  for ( Dimension i = 0; i < myArray.size(); ++i )
283  myArray[ i ] *= coeff;
284  return *this;
285 }
286 //------------------------------------------------------------------------------
287 template<Dimension dim, typename TComponent>
290 {
291  Self v = *this;
292  v *= coeff;
293  return v;
294 }
295 //------------------------------------------------------------------------------
296 template<Dimension dim, typename TComponent>
297 inline
300 {
301  myArray = pv.myArray;
302  return *this;
303 }
304 //------------------------------------------------------------------------------
305 template<Dimension dim, typename TComponent>
306 template<typename Component2>
307 inline
310 {
311  for ( Dimension i = 0; i < dimension; ++i )
312  {
313  this->myArray[ i ] = static_cast<Component>(v[ i ]);
314  }
315  return *this;
316 }
317 //------------------------------------------------------------------------------
318 #ifdef CPP11_INITIALIZER_LIST
319 template<Dimension dim, typename TComponent>
320 inline
323  ( const Self & pv,
324  std::initializer_list<Dimension> dimensions )
325 {
326  std::vector<Dimension> dims;
327  dims.reserve(dimensions.size());
328  for (const Dimension *c = dimensions.begin (); c != dimensions.end (); ++c)
329  dims.push_back(*c);
330  return partialCopy(pv, dims);
331 }
332 //------------------------------------------------------------------------------
333 template<Dimension dim, typename TComponent>
334 inline
337 ( const Self & pv,
338  std::initializer_list<Dimension> dimensions )
339 {
340  std::vector<Dimension> dims;
341  dims.reserve(dimensions.size());
342  for (const Dimension *c = dimensions.begin (); c != dimensions.end (); ++c)
343  dims.push_back(*c);
344  return partialCopyInv(pv, dims);
345 }
346 #endif
347 //------------------------------------------------------------------------------
348 template<Dimension dim, typename TComponent>
349 inline
352 ( const Self & pv,
353  const std::vector<Dimension> &dimensions)
354 {
355  std::bitset<dim> dims = ::setDimensionsIn<dim>(dimensions);
356  for ( Dimension i = 0; i < dim; ++i )
357  {
358  if ( dims.test(i) ) myArray[i] = pv.myArray[i];
359  }
360  return *this;
361 }
362 //------------------------------------------------------------------------------
363 template<Dimension dim, typename TComponent>
364 inline
367 ( const Self & pv,
368  const std::vector<Dimension> &dimensions)
369 {
370  std::bitset<dim> dims = ::setDimensionsIn<dim>(dimensions);
371  for ( Dimension i = 0; i < dim; ++i )
372  {
373  if ( !dims.test(i) ) myArray[i] = pv.myArray[i];
374  }
375  return *this;
376 }
377 //------------------------------------------------------------------------------
378 template<Dimension dim, typename TComponent>
379 inline
380 bool
382 ( const Self & pv,
383  const std::vector<Dimension> &dimensions ) const
384 {
385  std::bitset<dim> dims = setDimensionsIn<dim>(dimensions);
386  for ( Dimension i = 0; i < dim; ++i )
387  {
388  if ( dims.test(i) && myArray[i] != pv.myArray[i]) return false;
389  }
390  return true;
391 }
392 //------------------------------------------------------------------------------
393 template<Dimension dim, typename TComponent>
394 inline
395 bool
397 ( const Self & pv,
398  const std::vector<Dimension> &dimensions ) const
399 {
400  std::bitset<dim> dims = setDimensionsIn<dim>(dimensions);
401  for ( Dimension i = 0; i < dim; ++i )
402  {
403  if ( !dims.test(i) && myArray[i] != pv.myArray[i]) return false;
404  }
405  return true;
406 }
407 //------------------------------------------------------------------------------
408 template<Dimension dim, typename TComponent>
409 inline
410 bool
412 {
413  return (myArray == pv.myArray);
414 }
415 //------------------------------------------------------------------------------
416 template<Dimension dim, typename TComponent>
417 inline
418 bool
420 {
421  return (myArray != pv.myArray);
422 }
423 //------------------------------------------------------------------------------
424 template<Dimension dim, typename TComponent>
425 inline
426 bool
428 {
429  return (myArray < pv.myArray);
430 }
431 //------------------------------------------------------------------------------
432 template<Dimension dim, typename TComponent>
433 inline
434 bool
436 {
437  return (myArray <= pv.myArray);
438 }
439 //------------------------------------------------------------------------------
440 template<Dimension dim, typename TComponent>
441 inline
442 bool
444 {
445  return (myArray > pv.myArray);
446 }
447 //------------------------------------------------------------------------------
448 template<Dimension dim, typename TComponent>
449 inline
450 bool
452 {
453  return (myArray >= pv.myArray);
454 }
455 //------------------------------------------------------------------------------
456 template<Dimension dim, typename TComponent>
457 inline
460 {
461  for ( Dimension i = 0; i < dim; ++i )
462  this->myArray[ i ] += v[ i ];
463  return *this;
464 }
465 //------------------------------------------------------------------------------
466 template<Dimension dim, typename TComponent>
467 inline
470 {
471  return Self(*this, v, std::plus<Component>());
472 }
473 //------------------------------------------------------------------------------
474 template<Dimension dim, typename TComponent>
475 inline
478 {
479  for ( Dimension i = 0; i < dim; ++i )
480  this->myArray[ i ] -= v[ i ];
481  return *this;
482 }
483 //------------------------------------------------------------------------------
484 template<Dimension dim,typename TComponent>
485 inline
488 {
489  for ( Dimension i = 0; i < dim; ++i )
490  this->myArray[ i ] /= v[ i ];
491  return *this;
492 }
493 //------------------------------------------------------------------------------
494 template<Dimension dim,typename TComponent>
495 inline
498 {
499  return Self(*this, v, std::divides<Component>());
500 }
501 //------------------------------------------------------------------------------
502 template<Dimension dim,typename TComponent>
503 inline
506 {
507  for ( Dimension i = 0; i < dimension; ++i )
508  this->myArray[ i ] /= coeff;
509  return *this;
510 }
511 //------------------------------------------------------------------------------
512 template<Dimension dim,typename TComponent>
513 inline
516 {
517  Self p;
518  for ( Dimension i = 0; i < dimension; ++i )
519  p[i] = this->myArray[ i ] / coeff;
520  return p;
521 }
522 //------------------------------------------------------------------------------
523 template<Dimension dim, typename TComponent>
524 inline
527 {
529  for ( Dimension i = 0; i < dim; ++i )
530  dotprod += this->myArray[ i ]*v[ i ];
531  return dotprod;
532 }
533 //------------------------------------------------------------------------------
534 template<Dimension dim, typename TComponent>
535 inline
538 {
539  return Self(*this, v, MinusFunctor<Component>());
540 }
541 //------------------------------------------------------------------------------
542 template<Dimension dim, typename TComponent>
543 inline
544 void
546 {
547  for ( Dimension i = 0; i < myArray.size(); ++i )
548  myArray[ i ] = 0;
549 }
550 //------------------------------------------------------------------------------
551 template<Dimension dim, typename TComponent>
552 inline
555 {
556  return Self(*this, apoint, MinFunctor<Component>());
557 }
558 //------------------------------------------------------------------------------
559 template<Dimension dim, typename TComponent>
560 inline
563 {
564  return Self(*this, apoint, MaxFunctor<Component>());
565 }
566 //------------------------------------------------------------------------------
567 template<Dimension dim, typename TComponent>
568 inline
569 bool
571 {
572  for ( Dimension i = 0; i < myArray.size(); ++i )
573  if ( p[ i ] < myArray[ i ] )
574  return false;
575  return true;
576 }
577 //------------------------------------------------------------------------------
578 template<Dimension dim, typename TComponent>
579 inline
580 bool
582 {
583  for ( Dimension i = 0; i < myArray.size(); ++i )
584  if ( p[ i ] > myArray[ i ] )
585  return false;
586  return true;
587 }
588 //------------------------------------------------------------------------------
589 template<Dimension dim, typename TComponent>
590 inline
593 {
594  return *std::max_element(this->begin(), this->end());
595 }
596 //------------------------------------------------------------------------------
597 template<Dimension dim, typename TComponent>
598 inline
601 {
602  return *std::min_element(this->begin(), this->end());
603 }
604 //------------------------------------------------------------------------------
605 template<Dimension dim, typename TComponent>
606 inline
609 {
610  return std::max_element(this->begin(), this->end());
611 }
612 //------------------------------------------------------------------------------
613 template<Dimension dim, typename TComponent>
614 inline
617 {
618  return std::min_element(this->begin(), this->end());
619 }
620 //------------------------------------------------------------------------------
621 template<Dimension dim, typename TComponent>
622 inline
623 void
626 {
627  for ( Dimension i = 0; i < dimension; ++i )
628  this->myArray[ i ] = - this->myArray[ i ];
629 }
630 //------------------------------------------------------------------------------
631 template<Dimension dim, typename TComponent>
632 inline
633 double
635  typename Self::NormType aType ) const
636 {
637  double tmp = 0.0;
638 
639  ASSERT ( dim > 0 );
640 
641  switch ( aType )
642  {
643  case L_2:
644  for ( Dimension i = 0; i < dimension; i++ )
645  tmp += NumberTraits<Component>::castToDouble(at ( i )) *
647  tmp = ( double ) sqrt ( tmp );
648  break;
649  case L_1:
650  for ( Dimension i = 0; i < dimension; i++ )
651  tmp += fabs ( NumberTraits<Component>::castToDouble(at( i ) ));
652  break;
653  case L_infty:
654  tmp = fabs( NumberTraits<Component>::castToDouble( at( 0 )));
655  for ( Dimension i = 1; i < dimension; i++ )
656  if ( tmp < fabs ( NumberTraits<Component>::castToDouble(at ( i ) ) ))
657  tmp = fabs ( NumberTraits<Component>::castToDouble(at ( i ) ));
658  break;
659  }
660  return tmp;
661 }
662 //------------------------------------------------------------------------------
663 template<Dimension dim, typename TComponent>
664 inline
667 {
668  ASSERT ( dimension > 0 );
670  ( ( myArray[ 0 ] >= 0 ) ? myArray[ 0 ] : UnsignedComponent(-myArray[ 0 ]) );
671  for ( Dimension i = 1; i < dimension; ++i )
672  val += ( myArray[ i ] >= 0 )
673  ? myArray[ i ]
674  : UnsignedComponent(-myArray[ i ]);
675  return val;
676 }
677 //------------------------------------------------------------------------------
678 template<Dimension dim, typename TComponent>
679 inline
682 {
683  ASSERT ( dimension > 0 );
684  UnsignedComponent tmp;
685  UnsignedComponent val( ( myArray[ 0 ] >= 0 ) ? myArray[ 0 ] : -myArray[ 0 ] );
686  for ( Dimension i = 1; i < dimension; ++i )
687  {
688  tmp = ( myArray[ i ] >= 0 ) ? myArray[ i ] : -myArray[ i ] ;
689  if ( tmp > val )
690  val = tmp;
691  }
692  return val;
693 }
694 //------------------------------------------------------------------------------
695 
696 template<Dimension dim, typename TComponent>
697 inline
700 {
701  PointVector<dim,double> normalized =(*this);
702  normalized /= normalized.norm();
703  return normalized;
704 }
705 //------------------------------------------------------------------------------
706 template<Dimension dim, typename TComponent>
707 inline
710 {
711  Self p;
712  for ( Dimension i = 0; i < dim; ++i )
713  p.myArray[ i ] = val;
714  return p;
715 }
716 //------------------------------------------------------------------------------
717 template<Dimension dim,typename TComponent>
718 inline
721 {
722  Self p;
723  p.myArray[ k ] = val;
724  return p;
725 }
726 //------------------------------------------------------------------------------
727 template<Dimension dim,typename TComponent>
728 inline
729 void
731 {
732  out << "[PointVector] {";
733  for (Dimension i = 0; i < dimension ; ++i)
734  out << at( i ) << (i == dimension - 1 ? "" : ", ");
735  out << "}";
736 }
737 
738 //------------------------------------------------------------------------------
739 template<Dimension dim, typename TComponent>
740 inline
741 std::string
743 {
744  return "PointVector";
745 }
746 
747 //------------------------------------------------------------------------------
748 template<Dimension dim, typename TComponent>
749 inline
750 std::ostream&
751 DGtal::operator<<( std::ostream & out,
752  const PointVector<dim, TComponent>& object )
753 {
754  object.selfDisplay( out );
755  return out;
756 }
757 //------------------------------------------------------------------------------
758 template<Dimension dim, typename TComponent>
759 inline
760 bool
762 {
763  return true;
764 }
765 //------------------------------------------------------------------------------