9#include <QtCore/QtGlobal>
10#if QT_VERSION >= 0x050000
11#include <QtCore/QtMath>
13#include <QtCore/qmath.h>
15#include <QtCore/QVector>
122 explicit CVarVector(
int componentsCount,
double value = 0);
139 template <
typename Iterator>
140 CVarVector(Iterator beginIter, Iterator endIter);
208 void Reset(
int elementsCount,
double value);
361: m_elements(componentsCount, value)
367: m_elements(vector.m_elements)
372template <
typename Iterator>
374: m_elements(beginIter, endIter)
383 return m_elements.empty();
389 return int(m_elements.size());
395 Q_ASSERT(count >= 0);
397 int oldCount = int(m_elements.size());
399 m_elements.resize(count);
401 for (
int i = oldCount; i < count; ++i){
402 m_elements[i] = value;
430 for (
int i = 0; i < elementsCount; ++i){
431 m_elements[i] = value;
445 for (
int i = 0; i < elementsCount; ++i){
453 m_elements.resize(elementsCount);
455 for (
int i = 0; i < elementsCount; ++i){
456 m_elements[i] = value;
478 for (
int i = 0; i < elementsCount; ++i){
479 m_elements[i] += vector.m_elements[i];
486 return *
this + vector;
492 result = *
this + vector;
501 for (
int i = 0; i < elementsCount; ++i){
502 m_elements[i] += vector.m_elements[i] * scale;
520 for (
int i = 0; i < elementsCount; ++i){
521 retVal += m_elements[i] * vector.m_elements[i];
542 return (*
this - vector).GetLength2();
556 if (m_elements.size() != vector.m_elements.size()){
561 for ( Elements::const_iterator iter1 = m_elements.begin(), iter2 = vector.m_elements.begin();
562 iter1 != m_elements.end();
564 retVal = retVal && qFuzzyCompare(*iter1, *iter2);
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;
590 return count < vectorCount;
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;
607 return count > vectorCount;
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;
624 return count <= vectorCount;
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;
641 return count >= vectorCount;
650 for (
int i = 0; i < elementsCount; ++i){
651 m_elements[i] += vector.m_elements[i];
663 for (
int i = 0; i < elementsCount; ++i){
664 m_elements[i] -= vector.m_elements[i];
674 for (
int i = 0; i < elementsCount; ++i){
675 m_elements[i] *= scalar;
685 for (
int i = 0; i < elementsCount; ++i){
686 m_elements[i] /= scalar;
708 for (
int i = 0; i < elementsCount; ++i){
709 retVal.m_elements[i] = -m_elements[i];
761 return m_elements[i];
770 return m_elements[i];
779 m_elements.resize(Size);
781 for (
int i = 0; i < Size; ++i){
782 m_elements[i] = vector[i];
Implementation of variable-size mathematical vector with double precision elements.
Elements & GetElementsRef()
Get access to internal element container.
double GetLength() const
Return euclidian length.
CVarVector & operator*=(double scalar)
bool EnsureElementsCount(int count, double value=0)
Ensure, that number of elements is at least the specified value.
bool operator==(const CVarVector &vector) const
bool Serialize(iser::IArchive &archive)
Serialize this vector to specified archive.
double GetDistance2(const CVarVector &vector) const
Return distance square between two vectors.
CVarVector operator-() const
void Clear()
Set all coordinates to zero.
double GetElement(int index) const
Get element at specified index.
void Reset()
Set size to zero.
CVarVector & operator-=(const CVarVector &vector)
bool operator>=(const CVarVector &vector) const
CVarVector operator*(double scalar) const
double GetDotProduct(const CVarVector &vector) const
Return dot product of two vectors.
bool IsEmpty() const
Get true, if the element ist is empty.
CVarVector & operator+=(const CVarVector &vector)
bool Normalize(double length=1.0)
Normalize vector to specified length.
double GetDistance(const CVarVector &vector) const
Return distance between two vectors.
bool operator>(const CVarVector &vector) const
double operator[](int i) const
CVarVector operator+(const CVarVector &vector) const
double GetElementsSum() const
Get simple sum of all elements.
CVarVector & operator/=(double scalar)
void ScaledCumulate(const CVarVector &vector, double scale)
Add second vector scaled by specified factor.
CVarVector GetTranslated(const CVarVector &vector)
Get translated point.
int GetElementsCount() const
Get number of elements.
CVarVector operator/(double scalar) const
CVarVector & operator=(const CVarVector &vector)
void SetElementsFrom(const CVarVector &vector, double expansionValue=0)
Set elements from other vector without resizing.
bool operator!=(const CVarVector &vector) const
void SetElement(int index, double value)
Set element at specified index.
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.
bool operator<=(const CVarVector &vector) const
bool SetElementsCount(int count, double value=0)
Set number of elements.
void Translate(const CVarVector &vector)
Translate the point.
bool IsNull(double tolerance=I_BIG_EPSILON) const
Check if this vector is null.
void SetAllElements(double value)
Set some value to all elements.
void GetMinimal(const CVarVector &vector, CVarVector &result) const
Get vector with minimal elements values.
CVarVector()
Create the vector without components.
double & GetElementRef(int index)
Get reference to element at specified index.
bool operator<(const CVarVector &vector) const
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.
std::vector< double > Elements
Implementation of fixed-size mathematical vector with specified type of elements.
Represents an input/output persistence archive for object serialization.
static const double I_BIG_EPSILON
Package with mathematical functions and algebraical primitives.
Contains general persistence mechanism with basic archives implementations.