ICF 3.1.1.10
Technical documentation of ICF Libraries
CVarVector.h
Go to the documentation of this file.
1/********************************************************************************
2** This file is part of the ICF Framework. Copyright (C) Witold Gantzke & Kirill Lepskiy
3** ICF Framework may be used under the terms of the LGPL License v. 2.1 by the Free Software Foundation.
4********************************************************************************/
5
6#ifndef imath_CVarVector_included
7#define imath_CVarVector_included
8
9
10// STL includes
11#include <vector>
12
13// Qt includes
14#include <QtCore/QtGlobal>
15#include <QtCore/QtMath>
16#include <QtCore/QVector>
17
18// ICF includes
19#include <imath/TVector.h>
20
21
22namespace iser
23{
24 class IArchive;
25}
26
27
28namespace imath
29{
30
31
36{
37public:
38 typedef std::vector<double> Elements;
39
43 CVarVector();
44
48 explicit CVarVector(int componentsCount, double value = 0);
49
53 template <typename iterator>
54 CVarVector(iterator beginIter, iterator endIter);
55
59 CVarVector(const CVarVector& vector);
60
61 template <int Size>
62 CVarVector(const TVector<Size, double>& vector);
63
67 bool IsEmpty() const;
68
72 int GetElementsCount() const;
73
78 bool SetElementsCount(int count, double value = 0);
79
83 double GetElement(int index) const;
84
88 double& GetElementRef(int index);
89
93 void SetElement(int index, double value);
94
98 void SetAllElements(double value);
99
103 void Reset();
104
108 void Reset(int elementsCount, double value);
109
113 void Clear();
114
120 void SetElementsFrom(const CVarVector& vector, double expansionValue = 0);
121
125 const Elements& GetElements() const;
130
136 bool EnsureElementsCount(int count, double value = 0);
137
141 void Translate(const CVarVector& vector);
142
146 CVarVector GetTranslated(const CVarVector& vector);
147
151 void GetTranslated(const CVarVector& vector, CVarVector& result);
152
157 void ScaledCumulate(const CVarVector& vector, double scale);
158
162 bool IsNull(double tolerance = I_BIG_EPSILON) const;
163
167 double GetDotProduct(const CVarVector& vector) const;
168
172 double GetLength2() const;
173
177 double GetLength() const;
178
182 double GetDistance2(const CVarVector& vector) const;
183
187 double GetDistance(const CVarVector& vector) const;
188
192 double GetElementsSum() const;
193
199 bool Normalize(double length = 1.0);
205 bool GetNormalized(CVarVector& result, double length = 1.0) const;
206
210 void GetMinimal(const CVarVector& vector, CVarVector& result) const;
214 void GetMaximal(const CVarVector& vector, CVarVector& result) const;
215
219 bool Serialize(iser::IArchive& archive);
220
221 bool operator==(const CVarVector& vector) const;
222 bool operator!=(const CVarVector& vector) const;
223 bool operator<(const CVarVector& vector) const;
224 bool operator>(const CVarVector& vector) const;
225 bool operator<=(const CVarVector& vector) const;
226 bool operator>=(const CVarVector& vector) const;
227
228 CVarVector operator-() const;
229
230 CVarVector operator+(const CVarVector& vector) const;
231 CVarVector operator-(const CVarVector& vector) const;
232 CVarVector operator*(double scalar) const;
233 CVarVector operator/(double scalar) const;
234
235 CVarVector& operator+=(const CVarVector& vector);
236 CVarVector& operator-=(const CVarVector& vector);
237 CVarVector& operator*=(double scalar);
238 CVarVector& operator/=(double scalar);
239
240 CVarVector& operator=(const CVarVector& vector);
241
242 double operator[](int i) const;
243 double& operator[](int i);
244
245private:
246 Elements m_elements;
247};
248
249
250// inline constructors
251
253{
254}
255
256
257inline CVarVector::CVarVector(int componentsCount, double value)
258: m_elements(componentsCount, value)
259{
260}
261
262
264: m_elements(vector.m_elements)
265{
266}
267
268
269template <typename iterator>
270inline CVarVector::CVarVector(iterator beginIter, iterator endIter)
271: m_elements(beginIter, endIter)
272{
273}
274
275
276// inline methods
277
278inline bool CVarVector::IsEmpty() const
279{
280 return m_elements.empty();
281}
282
283
285{
286 return int(m_elements.size());
287}
288
289
290inline bool CVarVector::SetElementsCount(int count, double value)
291{
292 Q_ASSERT(count >= 0);
293
294 int oldCount = int(m_elements.size());
295
296 m_elements.resize(count);
297
298 for (int i = oldCount; i < count; ++i){
299 m_elements[i] = value;
300 }
301
302 return true;
303}
304
305
306inline double CVarVector::GetElement(int i) const
307{
308 return operator[](i);
309}
310
311
312inline double& CVarVector::GetElementRef(int i)
313{
314 return operator[](i);
315}
316
317
318inline void CVarVector::SetElement(int i, double value)
319{
320 operator[](i) = value;
321}
322
323
324inline void CVarVector::SetAllElements(double value)
325{
326 int elementsCount = GetElementsCount();
327 for (int i = 0; i < elementsCount; ++i){
328 m_elements[i] = value;
329 }
330}
331
332
333inline void CVarVector::Reset()
334{
335 m_elements.clear();
336}
337
338
339inline void CVarVector::Clear()
340{
341 int elementsCount = GetElementsCount();
342 for (int i = 0; i < elementsCount; ++i){
343 m_elements[i] = 0;
344 }
345}
346
347
348inline void CVarVector::Reset(int elementsCount, double value)
349{
350 m_elements.resize(elementsCount);
351
352 for (int i = 0; i < elementsCount; ++i){
353 m_elements[i] = value;
354 }
355}
356
357
359{
360 return m_elements;
361}
362
363
365{
366 return m_elements;
367}
368
369
370inline void CVarVector::Translate(const CVarVector& vector)
371{
372 Q_ASSERT(GetElementsCount() == vector.GetElementsCount());
373
374 int elementsCount = GetElementsCount();
375 for (int i = 0; i < elementsCount; ++i){
376 m_elements[i] += vector.m_elements[i];
377 }
378}
379
380
382{
383 return *this + vector;
384}
385
386
387inline void CVarVector::GetTranslated(const CVarVector& vector, CVarVector& result)
388{
389 result = *this + vector;
390}
391
392
393inline void CVarVector::ScaledCumulate(const CVarVector& vector, double scale)
394{
395 Q_ASSERT(GetElementsCount() == vector.GetElementsCount());
396
397 int elementsCount = GetElementsCount();
398 for (int i = 0; i < elementsCount; ++i){
399 m_elements[i] += vector.m_elements[i] * scale;
400 }
401}
402
403
404inline bool CVarVector::IsNull(double tolerance) const
405{
406 return GetLength2() <= tolerance * tolerance;
407}
408
409
410inline double CVarVector::GetDotProduct(const CVarVector& vector) const
411{
412 Q_ASSERT(GetElementsCount() == vector.GetElementsCount());
413
414 double retVal = 0.0;
415
416 int elementsCount = GetElementsCount();
417 for (int i = 0; i < elementsCount; ++i){
418 retVal += m_elements[i] * vector.m_elements[i];
419 }
420
421 return retVal;
422}
423
424
425inline double CVarVector::GetLength2() const
426{
427 return GetDotProduct(*this);
428}
429
430
431inline double CVarVector::GetLength() const
432{
433 return qSqrt(GetLength2());
434}
435
436
437inline double CVarVector::GetDistance2(const CVarVector& vector) const
438{
439 return (*this - vector).GetLength2();
440}
441
442
443inline double CVarVector::GetDistance(const CVarVector& vector) const
444{
445 return qSqrt(GetDistance2(vector));
446}
447
448
449// operators
450
451inline bool CVarVector::operator==(const CVarVector& vector) const
452{
453 if (m_elements.size() != vector.m_elements.size()){
454 return false;
455 }
456
457 bool retVal = true;
458 for ( Elements::const_iterator iter1 = m_elements.begin(), iter2 = vector.m_elements.begin();
459 iter1 != m_elements.end();
460 ++iter1,++iter2){
461 retVal = retVal && qFuzzyCompare(*iter1, *iter2);
462 }
463
464 return retVal;
465}
466
467
468inline bool CVarVector::operator!=(const CVarVector& vector) const
469{
470 return !operator==(vector);
471}
472
473
474inline bool CVarVector::operator<(const CVarVector& vector) const
475{
476 int count = int(m_elements.size());
477 int vectorCount = int(vector.m_elements.size());
478 int commonSize = qMin(count, vectorCount);
479 for (int i = 0; i < commonSize; ++i){
480 int element = m_elements[i];
481 int vectorElement = vector.m_elements[i];
482 if (element != vectorElement){
483 return element < vectorElement;
484 }
485 }
486
487 return count < vectorCount;
488}
489
490
491inline bool CVarVector::operator>(const CVarVector& vector) const
492{
493 int count = int(m_elements.size());
494 int vectorCount = int(vector.m_elements.size());
495 int commonSize = qMin(count, vectorCount);
496 for (int i = 0; i < commonSize; ++i){
497 int element = m_elements[i];
498 int vectorElement = vector.m_elements[i];
499 if (element != vectorElement){
500 return element > vectorElement;
501 }
502 }
503
504 return count > vectorCount;
505}
506
507
508inline bool CVarVector::operator<=(const CVarVector& vector) const
509{
510 int count = int(m_elements.size());
511 int vectorCount = int(vector.m_elements.size());
512 int commonSize = qMin(count, vectorCount);
513 for (int i = 0; i < commonSize; ++i){
514 int element = m_elements[i];
515 int vectorElement = vector.m_elements[i];
516 if (element != vectorElement){
517 return element < vectorElement;
518 }
519 }
520
521 return count <= vectorCount;
522}
523
524
525inline bool CVarVector::operator>=(const CVarVector& vector) const
526{
527 int count = int(m_elements.size());
528 int vectorCount = int(vector.m_elements.size());
529 int commonSize = qMin(count, vectorCount);
530 for (int i = 0; i < commonSize; ++i){
531 int element = m_elements[i];
532 int vectorElement = vector.m_elements[i];
533 if (element != vectorElement){
534 return element > vectorElement;
535 }
536 }
537
538 return count >= vectorCount;
539}
540
541
543{
544 Q_ASSERT(GetElementsCount() == vector.GetElementsCount());
545
546 int elementsCount = GetElementsCount();
547 for (int i = 0; i < elementsCount; ++i){
548 m_elements[i] += vector.m_elements[i];
549 }
550
551 return *this;
552}
553
554
556{
557 Q_ASSERT(GetElementsCount() == vector.GetElementsCount());
558
559 int elementsCount = GetElementsCount();
560 for (int i = 0; i < elementsCount; ++i){
561 m_elements[i] -= vector.m_elements[i];
562 }
563
564 return *this;
565}
566
567
568inline CVarVector& CVarVector::operator*=(double scalar)
569{
570 int elementsCount = GetElementsCount();
571 for (int i = 0; i < elementsCount; ++i){
572 m_elements[i] *= scalar;
573 }
574
575 return *this;
576}
577
578
579inline CVarVector& CVarVector::operator/=(double scalar)
580{
581 int elementsCount = GetElementsCount();
582 for (int i = 0; i < elementsCount; ++i){
583 m_elements[i] /= scalar;
584 }
585
586 return *this;
587}
588
589
591{
593 SetElementsFrom(vector);
594
595 return *this;
596}
597
598
600{
601 int elementsCount = GetElementsCount();
602
603 CVarVector retVal(elementsCount);
604
605 for (int i = 0; i < elementsCount; ++i){
606 retVal.m_elements[i] = -m_elements[i];
607 }
608
609 return retVal;
610}
611
612
613inline CVarVector CVarVector::operator+(const CVarVector& vector) const
614{
615 CVarVector retVal(*this);
616
617 retVal += vector;
618
619 return retVal;
620}
621
622
623inline CVarVector CVarVector::operator-(const CVarVector& vector) const
624{
625 CVarVector retVal(*this);
626
627 retVal -= vector;
628
629 return retVal;
630}
631
632
633inline CVarVector CVarVector::operator*(double scalar) const
634{
635 CVarVector retVal(*this);
636
637 retVal *= scalar;
638
639 return retVal;
640}
641
642
643inline CVarVector CVarVector::operator/(double scalar) const
644{
645 CVarVector retVal(*this);
646
647 retVal /= scalar;
648
649 return retVal;
650}
651
652
653inline double CVarVector::operator[](int i) const
654{
655 Q_ASSERT(i >= 0);
656 Q_ASSERT(i < GetElementsCount());
657
658 return m_elements[i];
659}
660
661
662inline double& CVarVector::operator[](int i)
663{
664 Q_ASSERT(i >= 0);
665 Q_ASSERT(i < GetElementsCount());
666
667 return m_elements[i];
668}
669
670
671// template methods
672
673template <int Size>
675{
676 m_elements.resize(Size);
677
678 for (int i = 0; i < Size; ++i){
679 m_elements[i] = vector[i];
680 }
681}
682
683
684} // namespace imath
685
686
687#endif // !imath_CVarVector_included
688
689
Simple implementation of variable-size vector.
Definition CVarVector.h:36
Elements & GetElementsRef()
Get access to internal element container.
Definition CVarVector.h:364
double GetLength() const
Return euclidian length.
Definition CVarVector.h:431
CVarVector & operator*=(double scalar)
Definition CVarVector.h:568
bool EnsureElementsCount(int count, double value=0)
Ensure, that number of elements is at least the specified value.
bool operator==(const CVarVector &vector) const
Definition CVarVector.h:451
bool Serialize(iser::IArchive &archive)
Serialize this vector to specified archive.
double GetDistance2(const CVarVector &vector) const
Return distance square between two vectors.
Definition CVarVector.h:437
CVarVector operator-() const
Definition CVarVector.h:599
void Clear()
Set all coordinates to zero.
Definition CVarVector.h:339
double GetElement(int index) const
Get element at specified index.
Definition CVarVector.h:306
void Reset()
Set size to zero.
Definition CVarVector.h:333
CVarVector & operator-=(const CVarVector &vector)
Definition CVarVector.h:555
bool operator>=(const CVarVector &vector) const
Definition CVarVector.h:525
CVarVector operator*(double scalar) const
Definition CVarVector.h:633
double GetDotProduct(const CVarVector &vector) const
Return dot product of two vectors.
Definition CVarVector.h:410
bool IsEmpty() const
Get true, if the element ist is empty.
Definition CVarVector.h:278
CVarVector & operator+=(const CVarVector &vector)
Definition CVarVector.h:542
bool Normalize(double length=1.0)
Normalize vector to specified length.
double GetDistance(const CVarVector &vector) const
Return distance between two vectors.
Definition CVarVector.h:443
bool operator>(const CVarVector &vector) const
Definition CVarVector.h:491
double operator[](int i) const
Definition CVarVector.h:653
CVarVector operator+(const CVarVector &vector) const
Definition CVarVector.h:613
double GetElementsSum() const
Get simple sum of all elements.
CVarVector & operator/=(double scalar)
Definition CVarVector.h:579
void ScaledCumulate(const CVarVector &vector, double scale)
Add second vector scaled by specified factor.
Definition CVarVector.h:393
CVarVector GetTranslated(const CVarVector &vector)
Get translated point.
Definition CVarVector.h:381
int GetElementsCount() const
Get number of elements.
Definition CVarVector.h:284
CVarVector operator/(double scalar) const
Definition CVarVector.h:643
CVarVector & operator=(const CVarVector &vector)
Definition CVarVector.h:590
void SetElementsFrom(const CVarVector &vector, double expansionValue=0)
Set elements from other vector without resizing.
bool operator!=(const CVarVector &vector) const
Definition CVarVector.h:468
std::vector< double > Elements
Definition CVarVector.h:38
void SetElement(int index, double value)
Set element at specified index.
Definition CVarVector.h:318
void GetMaximal(const CVarVector &vector, CVarVector &result) const
Get vector with maximal elements values.
const Elements & GetElements() const
Get read-only access to internal element container.
Definition CVarVector.h:358
bool operator<=(const CVarVector &vector) const
Definition CVarVector.h:508
bool SetElementsCount(int count, double value=0)
Set number of elements.
Definition CVarVector.h:290
void Translate(const CVarVector &vector)
Translate the point.
Definition CVarVector.h:370
bool IsNull(double tolerance=I_BIG_EPSILON) const
Check if this vector is null.
Definition CVarVector.h:404
void SetAllElements(double value)
Set some value to all elements.
Definition CVarVector.h:324
void GetMinimal(const CVarVector &vector, CVarVector &result) const
Get vector with minimal elements values.
CVarVector()
Create the vector without components.
Definition CVarVector.h:252
double & GetElementRef(int index)
Get reference to element at specified index.
Definition CVarVector.h:312
bool operator<(const CVarVector &vector) const
Definition CVarVector.h:474
bool GetNormalized(CVarVector &result, double length=1.0) const
Return normalized vector with the same direction and specified length.
double GetLength2() const
Return euclidean length square.
Definition CVarVector.h:425
Implementation of fixed-size mathematical vector with specified type of elements.
Definition TVector.h:32
Represent input/output persistence archive.
Definition IArchive.h:34
Package with mathematical functions and algebraical primitives.
Contains general persistence mechanism with basic archives implementations.

© Witold Gantzke and Kirill Lepskiy