ACF $AcfVersion:0$
CVarVector.h
Go to the documentation of this file.
1// SPDX-License-Identifier: LGPL-2.1-or-later OR GPL-2.0-or-later OR GPL-3.0-or-later OR LicenseRef-ACF-Commercial
2#pragma once
3
4
5// STL includes
6#include <vector>
7
8// Qt includes
9#include <QtCore/QtGlobal>
10#if QT_VERSION >= 0x050000
11#include <QtCore/QtMath>
12#else
13#include <QtCore/qmath.h>
14#endif
15#include <QtCore/QVector>
16
17// ACF includes
18#include <imath/TVector.h>
19
20
21namespace iser
22{
23 class IArchive;
24}
25
26
27namespace imath
28{
29
30
110{
111public:
112 typedef std::vector<double> Elements;
113
117 CVarVector();
118
122 explicit CVarVector(int componentsCount, double value = 0);
123
139 template <typename Iterator>
140 CVarVector(Iterator beginIter, Iterator endIter);
141
145 CVarVector(const CVarVector& vector);
146
161 template <int Size>
162 CVarVector(const TVector<Size, double>& vector);
163
167 bool IsEmpty() const;
168
172 int GetElementsCount() const;
173
178 bool SetElementsCount(int count, double value = 0);
179
183 double GetElement(int index) const;
184
188 double& GetElementRef(int index);
189
193 void SetElement(int index, double value);
194
198 void SetAllElements(double value);
199
203 void Reset();
204
208 void Reset(int elementsCount, double value);
209
213 void Clear();
214
220 void SetElementsFrom(const CVarVector& vector, double expansionValue = 0);
221
225 const Elements& GetElements() const;
226
231
237 bool EnsureElementsCount(int count, double value = 0);
238
242 void Translate(const CVarVector& vector);
243
247 CVarVector GetTranslated(const CVarVector& vector);
248
252 void GetTranslated(const CVarVector& vector, CVarVector& result);
253
258 void ScaledCumulate(const CVarVector& vector, double scale);
259
263 bool IsNull(double tolerance = I_BIG_EPSILON) const;
264
268 double GetDotProduct(const CVarVector& vector) const;
269
273 double GetLength2() const;
274
278 double GetLength() const;
279
283 double GetDistance2(const CVarVector& vector) const;
284
288 double GetDistance(const CVarVector& vector) const;
289
293 double GetElementsSum() const;
294
300 bool Normalize(double length = 1.0);
301
307 bool GetNormalized(CVarVector& result, double length = 1.0) const;
308
312 void GetMinimal(const CVarVector& vector, CVarVector& result) const;
313
317 void GetMaximal(const CVarVector& vector, CVarVector& result) const;
318
322 bool Serialize(iser::IArchive& archive);
323
324 bool operator==(const CVarVector& vector) const;
325 bool operator!=(const CVarVector& vector) const;
326 bool operator<(const CVarVector& vector) const;
327 bool operator>(const CVarVector& vector) const;
328 bool operator<=(const CVarVector& vector) const;
329 bool operator>=(const CVarVector& vector) const;
330
331 CVarVector operator-() const;
332
333 CVarVector operator+(const CVarVector& vector) const;
334 CVarVector operator-(const CVarVector& vector) const;
335 CVarVector operator*(double scalar) const;
336 CVarVector operator/(double scalar) const;
337
338 CVarVector& operator+=(const CVarVector& vector);
339 CVarVector& operator-=(const CVarVector& vector);
340 CVarVector& operator*=(double scalar);
341 CVarVector& operator/=(double scalar);
342
343 CVarVector& operator=(const CVarVector& vector);
344
345 double operator[](int i) const;
346 double& operator[](int i);
347
348private:
349 Elements m_elements;
350};
351
352
353// inline constructors
354
356{
357}
358
359
360inline CVarVector::CVarVector(int componentsCount, double value)
361: m_elements(componentsCount, value)
362{
363}
364
365
367: m_elements(vector.m_elements)
368{
369}
370
371
372template <typename Iterator>
373inline CVarVector::CVarVector(Iterator beginIter, Iterator endIter)
374: m_elements(beginIter, endIter)
375{
376}
377
378
379// inline methods
380
381inline bool CVarVector::IsEmpty() const
382{
383 return m_elements.empty();
384}
385
386
388{
389 return int(m_elements.size());
390}
391
392
393inline bool CVarVector::SetElementsCount(int count, double value)
394{
395 Q_ASSERT(count >= 0);
396
397 int oldCount = int(m_elements.size());
398
399 m_elements.resize(count);
400
401 for (int i = oldCount; i < count; ++i){
402 m_elements[i] = value;
403 }
404
405 return true;
406}
407
408
409inline double CVarVector::GetElement(int i) const
410{
411 return operator[](i);
412}
413
414
415inline double& CVarVector::GetElementRef(int i)
416{
417 return operator[](i);
418}
419
420
421inline void CVarVector::SetElement(int i, double value)
422{
423 operator[](i) = value;
424}
425
426
427inline void CVarVector::SetAllElements(double value)
428{
429 int elementsCount = GetElementsCount();
430 for (int i = 0; i < elementsCount; ++i){
431 m_elements[i] = value;
432 }
433}
434
435
436inline void CVarVector::Reset()
437{
438 m_elements.clear();
439}
440
441
442inline void CVarVector::Clear()
443{
444 int elementsCount = GetElementsCount();
445 for (int i = 0; i < elementsCount; ++i){
446 m_elements[i] = 0;
447 }
448}
449
450
451inline void CVarVector::Reset(int elementsCount, double value)
452{
453 m_elements.resize(elementsCount);
454
455 for (int i = 0; i < elementsCount; ++i){
456 m_elements[i] = value;
457 }
458}
459
460
462{
463 return m_elements;
464}
465
466
468{
469 return m_elements;
470}
471
472
473inline void CVarVector::Translate(const CVarVector& vector)
474{
475 Q_ASSERT(GetElementsCount() == vector.GetElementsCount());
476
477 int elementsCount = GetElementsCount();
478 for (int i = 0; i < elementsCount; ++i){
479 m_elements[i] += vector.m_elements[i];
480 }
481}
482
483
485{
486 return *this + vector;
487}
488
489
490inline void CVarVector::GetTranslated(const CVarVector& vector, CVarVector& result)
491{
492 result = *this + vector;
493}
494
495
496inline void CVarVector::ScaledCumulate(const CVarVector& vector, double scale)
497{
498 Q_ASSERT(GetElementsCount() == vector.GetElementsCount());
499
500 int elementsCount = GetElementsCount();
501 for (int i = 0; i < elementsCount; ++i){
502 m_elements[i] += vector.m_elements[i] * scale;
503 }
504}
505
506
507inline bool CVarVector::IsNull(double tolerance) const
508{
509 return GetLength2() <= tolerance * tolerance;
510}
511
512
513inline double CVarVector::GetDotProduct(const CVarVector& vector) const
514{
515 Q_ASSERT(GetElementsCount() == vector.GetElementsCount());
516
517 double retVal = 0.0;
518
519 int elementsCount = GetElementsCount();
520 for (int i = 0; i < elementsCount; ++i){
521 retVal += m_elements[i] * vector.m_elements[i];
522 }
523
524 return retVal;
525}
526
527
528inline double CVarVector::GetLength2() const
529{
530 return GetDotProduct(*this);
531}
532
533
534inline double CVarVector::GetLength() const
535{
536 return qSqrt(GetLength2());
537}
538
539
540inline double CVarVector::GetDistance2(const CVarVector& vector) const
541{
542 return (*this - vector).GetLength2();
543}
544
545
546inline double CVarVector::GetDistance(const CVarVector& vector) const
547{
548 return qSqrt(GetDistance2(vector));
549}
550
551
552// operators
553
554inline bool CVarVector::operator==(const CVarVector& vector) const
555{
556 if (m_elements.size() != vector.m_elements.size()){
557 return false;
558 }
559
560 bool retVal = true;
561 for ( Elements::const_iterator iter1 = m_elements.begin(), iter2 = vector.m_elements.begin();
562 iter1 != m_elements.end();
563 ++iter1,++iter2){
564 retVal = retVal && qFuzzyCompare(*iter1, *iter2);
565 }
566
567 return retVal;
568}
569
570
571inline bool CVarVector::operator!=(const CVarVector& vector) const
572{
573 return !operator==(vector);
574}
575
576
577inline bool CVarVector::operator<(const CVarVector& vector) const
578{
579 int count = int(m_elements.size());
580 int vectorCount = int(vector.m_elements.size());
581 int commonSize = qMin(count, vectorCount);
582 for (int i = 0; i < commonSize; ++i){
583 double element = m_elements[i];
584 double vectorElement = vector.m_elements[i];
585 if (!qFuzzyCompare(element, vectorElement)){
586 return m_elements[i] < vectorElement;
587 }
588 }
589
590 return count < vectorCount;
591}
592
593
594inline bool CVarVector::operator>(const CVarVector& vector) const
595{
596 int count = int(m_elements.size());
597 int vectorCount = int(vector.m_elements.size());
598 int commonSize = qMin(count, vectorCount);
599 for (int i = 0; i < commonSize; ++i){
600 double element = m_elements[i];
601 double vectorElement = vector.m_elements[i];
602 if (!qFuzzyCompare(element, vectorElement)){
603 return element > vectorElement;
604 }
605 }
606
607 return count > vectorCount;
608}
609
610
611inline bool CVarVector::operator<=(const CVarVector& vector) const
612{
613 int count = int(m_elements.size());
614 int vectorCount = int(vector.m_elements.size());
615 int commonSize = qMin(count, vectorCount);
616 for (int i = 0; i < commonSize; ++i){
617 double element = m_elements[i];
618 double vectorElement = vector.m_elements[i];
619 if (!qFuzzyCompare(element, vectorElement)){
620 return element < vectorElement;
621 }
622 }
623
624 return count <= vectorCount;
625}
626
627
628inline bool CVarVector::operator>=(const CVarVector& vector) const
629{
630 int count = int(m_elements.size());
631 int vectorCount = int(vector.m_elements.size());
632 int commonSize = qMin(count, vectorCount);
633 for (int i = 0; i < commonSize; ++i){
634 double element = m_elements[i];
635 double vectorElement = vector.m_elements[i];
636 if (!qFuzzyCompare(element, vectorElement)){
637 return element > vectorElement;
638 }
639 }
640
641 return count >= vectorCount;
642}
643
644
646{
647 Q_ASSERT(GetElementsCount() == vector.GetElementsCount());
648
649 int elementsCount = GetElementsCount();
650 for (int i = 0; i < elementsCount; ++i){
651 m_elements[i] += vector.m_elements[i];
652 }
653
654 return *this;
655}
656
657
659{
660 Q_ASSERT(GetElementsCount() == vector.GetElementsCount());
661
662 int elementsCount = GetElementsCount();
663 for (int i = 0; i < elementsCount; ++i){
664 m_elements[i] -= vector.m_elements[i];
665 }
666
667 return *this;
668}
669
670
671inline CVarVector& CVarVector::operator*=(double scalar)
672{
673 int elementsCount = GetElementsCount();
674 for (int i = 0; i < elementsCount; ++i){
675 m_elements[i] *= scalar;
676 }
677
678 return *this;
679}
680
681
682inline CVarVector& CVarVector::operator/=(double scalar)
683{
684 int elementsCount = GetElementsCount();
685 for (int i = 0; i < elementsCount; ++i){
686 m_elements[i] /= scalar;
687 }
688
689 return *this;
690}
691
692
694{
696 SetElementsFrom(vector);
697
698 return *this;
699}
700
701
703{
704 int elementsCount = GetElementsCount();
705
706 CVarVector retVal(elementsCount);
707
708 for (int i = 0; i < elementsCount; ++i){
709 retVal.m_elements[i] = -m_elements[i];
710 }
711
712 return retVal;
713}
714
715
716inline CVarVector CVarVector::operator+(const CVarVector& vector) const
717{
718 CVarVector retVal(*this);
719
720 retVal += vector;
721
722 return retVal;
723}
724
725
726inline CVarVector CVarVector::operator-(const CVarVector& vector) const
727{
728 CVarVector retVal(*this);
729
730 retVal -= vector;
731
732 return retVal;
733}
734
735
736inline CVarVector CVarVector::operator*(double scalar) const
737{
738 CVarVector retVal(*this);
739
740 retVal *= scalar;
741
742 return retVal;
743}
744
745
746inline CVarVector CVarVector::operator/(double scalar) const
747{
748 CVarVector retVal(*this);
749
750 retVal /= scalar;
751
752 return retVal;
753}
754
755
756inline double CVarVector::operator[](int i) const
757{
758 Q_ASSERT(i >= 0);
759 Q_ASSERT(i < GetElementsCount());
760
761 return m_elements[i];
762}
763
764
765inline double& CVarVector::operator[](int i)
766{
767 Q_ASSERT(i >= 0);
768 Q_ASSERT(i < GetElementsCount());
769
770 return m_elements[i];
771}
772
773
774// template methods
775
776template <int Size>
778{
779 m_elements.resize(Size);
780
781 for (int i = 0; i < Size; ++i){
782 m_elements[i] = vector[i];
783 }
784}
785
786
787} // namespace imath
788
789
Implementation of variable-size mathematical vector with double precision elements.
Definition CVarVector.h:110
Elements & GetElementsRef()
Get access to internal element container.
Definition CVarVector.h:467
double GetLength() const
Return euclidian length.
Definition CVarVector.h:534
CVarVector & operator*=(double scalar)
Definition CVarVector.h:671
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:554
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:540
CVarVector operator-() const
Definition CVarVector.h:702
void Clear()
Set all coordinates to zero.
Definition CVarVector.h:442
double GetElement(int index) const
Get element at specified index.
Definition CVarVector.h:409
void Reset()
Set size to zero.
Definition CVarVector.h:436
CVarVector & operator-=(const CVarVector &vector)
Definition CVarVector.h:658
bool operator>=(const CVarVector &vector) const
Definition CVarVector.h:628
CVarVector operator*(double scalar) const
Definition CVarVector.h:736
double GetDotProduct(const CVarVector &vector) const
Return dot product of two vectors.
Definition CVarVector.h:513
bool IsEmpty() const
Get true, if the element ist is empty.
Definition CVarVector.h:381
CVarVector & operator+=(const CVarVector &vector)
Definition CVarVector.h:645
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:546
bool operator>(const CVarVector &vector) const
Definition CVarVector.h:594
double operator[](int i) const
Definition CVarVector.h:756
CVarVector operator+(const CVarVector &vector) const
Definition CVarVector.h:716
double GetElementsSum() const
Get simple sum of all elements.
CVarVector & operator/=(double scalar)
Definition CVarVector.h:682
void ScaledCumulate(const CVarVector &vector, double scale)
Add second vector scaled by specified factor.
Definition CVarVector.h:496
CVarVector GetTranslated(const CVarVector &vector)
Get translated point.
Definition CVarVector.h:484
int GetElementsCount() const
Get number of elements.
Definition CVarVector.h:387
CVarVector operator/(double scalar) const
Definition CVarVector.h:746
CVarVector & operator=(const CVarVector &vector)
Definition CVarVector.h:693
void SetElementsFrom(const CVarVector &vector, double expansionValue=0)
Set elements from other vector without resizing.
bool operator!=(const CVarVector &vector) const
Definition CVarVector.h:571
void SetElement(int index, double value)
Set element at specified index.
Definition CVarVector.h:421
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:461
bool operator<=(const CVarVector &vector) const
Definition CVarVector.h:611
bool SetElementsCount(int count, double value=0)
Set number of elements.
Definition CVarVector.h:393
void Translate(const CVarVector &vector)
Translate the point.
Definition CVarVector.h:473
bool IsNull(double tolerance=I_BIG_EPSILON) const
Check if this vector is null.
Definition CVarVector.h:507
void SetAllElements(double value)
Set some value to all elements.
Definition CVarVector.h:427
void GetMinimal(const CVarVector &vector, CVarVector &result) const
Get vector with minimal elements values.
CVarVector()
Create the vector without components.
Definition CVarVector.h:355
double & GetElementRef(int index)
Get reference to element at specified index.
Definition CVarVector.h:415
bool operator<(const CVarVector &vector) const
Definition CVarVector.h:577
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:528
std::vector< double > Elements
Definition CVarVector.h:112
Implementation of fixed-size mathematical vector with specified type of elements.
Definition TVector.h:95
Represents an input/output persistence archive for object serialization.
Definition IArchive.h:164
static const double I_BIG_EPSILON
Definition istd.h:26
Package with mathematical functions and algebraical primitives.
Contains general persistence mechanism with basic archives implementations.