6#ifndef imath_CVarVector_included
7#define imath_CVarVector_included
14#include <QtCore/QtGlobal>
15#include <QtCore/QtMath>
16#include <QtCore/QVector>
48 explicit CVarVector(
int componentsCount,
double value = 0);
53 template <
typename iterator>
54 CVarVector(iterator beginIter, iterator endIter);
108 void Reset(
int elementsCount,
double value);
162 bool IsNull(
double tolerance = I_BIG_EPSILON)
const;
258: m_elements(componentsCount, value)
264: m_elements(vector.m_elements)
269template <
typename iterator>
271: m_elements(beginIter, endIter)
280 return m_elements.empty();
286 return int(m_elements.size());
292 Q_ASSERT(count >= 0);
294 int oldCount = int(m_elements.size());
296 m_elements.resize(count);
298 for (
int i = oldCount; i < count; ++i){
299 m_elements[i] = value;
327 for (
int i = 0; i < elementsCount; ++i){
328 m_elements[i] = value;
342 for (
int i = 0; i < elementsCount; ++i){
350 m_elements.resize(elementsCount);
352 for (
int i = 0; i < elementsCount; ++i){
353 m_elements[i] = value;
375 for (
int i = 0; i < elementsCount; ++i){
376 m_elements[i] += vector.m_elements[i];
383 return *
this + vector;
389 result = *
this + vector;
398 for (
int i = 0; i < elementsCount; ++i){
399 m_elements[i] += vector.m_elements[i] * scale;
417 for (
int i = 0; i < elementsCount; ++i){
418 retVal += m_elements[i] * vector.m_elements[i];
439 return (*
this - vector).GetLength2();
453 if (m_elements.size() != vector.m_elements.size()){
458 for ( Elements::const_iterator iter1 = m_elements.begin(), iter2 = vector.m_elements.begin();
459 iter1 != m_elements.end();
461 retVal = retVal && qFuzzyCompare(*iter1, *iter2);
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;
487 return count < vectorCount;
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;
504 return count > vectorCount;
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;
521 return count <= vectorCount;
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;
538 return count >= vectorCount;
547 for (
int i = 0; i < elementsCount; ++i){
548 m_elements[i] += vector.m_elements[i];
560 for (
int i = 0; i < elementsCount; ++i){
561 m_elements[i] -= vector.m_elements[i];
571 for (
int i = 0; i < elementsCount; ++i){
572 m_elements[i] *= scalar;
582 for (
int i = 0; i < elementsCount; ++i){
583 m_elements[i] /= scalar;
605 for (
int i = 0; i < elementsCount; ++i){
606 retVal.m_elements[i] = -m_elements[i];
658 return m_elements[i];
667 return m_elements[i];
676 m_elements.resize(Size);
678 for (
int i = 0; i < Size; ++i){
679 m_elements[i] = vector[i];
Simple implementation of variable-size vector.
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
std::vector< double > Elements
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.
Implementation of fixed-size mathematical vector with specified type of elements.
Represent input/output persistence archive.
Package with mathematical functions and algebraical primitives.
Contains general persistence mechanism with basic archives implementations.