6#ifndef imath_TFastVector_included
7#define imath_TFastVector_included
27template <
int MaxSize,
class Element =
double>
45 explicit TFastVector(
int componentsCount,
const Element& value = Element());
56 Q_ASSERT(Size <= MaxSize);
58 for (
int i = 0; i < Size; ++i){
135 bool IsNull(Element tolerance = I_BIG_EPSILON)
const;
225template <
int MaxSize,
class Element>
232template <
int MaxSize,
class Element>
234: m_elementsCount(qMin(MaxSize, componentsCount))
242template <
int MaxSize,
class Element>
244: m_elementsCount(vector.m_elementsCount)
252template <
int MaxSize,
class Element>
255 return m_elementsCount;
259template <
int MaxSize,
class Element>
262 if (count <= MaxSize){
263 for (
int i = m_elementsCount; i < count; ++i){
264 m_elements[i] = value;
267 m_elementsCount = count;
277template <
int MaxSize,
class Element>
280 if (count <= MaxSize){
281 if (m_elementsCount < count){
282 for (
int i = m_elementsCount; i < count; ++i){
283 m_elements[i] = value;
286 m_elementsCount = count;
297template <
int MaxSize,
class Element>
301 Q_ASSERT(i < m_elementsCount);
303 return m_elements[i];
307template <
int MaxSize,
class Element>
311 Q_ASSERT(i < m_elementsCount);
313 return m_elements[i];
317template <
int MaxSize,
class Element>
321 Q_ASSERT(i < m_elementsCount);
323 m_elements[i] = value;
327template <
int MaxSize,
class Element>
330 for (
int i = 0; i < m_elementsCount; ++i){
336template <
int MaxSize,
class Element>
340 for (
int i = 0; i < commonSize; ++i){
346template <
int MaxSize,
class Element>
351 for (; i < m_elementsCount; ++i){
352 m_elements[i] += vector.
m_elements[i] * scale;
363 m_elements[i] += vector.
m_elements[i] * scale;
369template <
int MaxSize,
class Element>
374 for (
int i = 0; i < commonSize; ++i){
375 SetElement(i, vector[i]);
378 for (
int i = commonSize; i < m_elementsCount; ++i){
379 SetElement(i, expansionValue);
384template <
int MaxSize,
class Element>
387 return *
this + vector;
391template <
int MaxSize,
class Element>
400template <
int MaxSize,
class Element>
403 return GetLength2() <= tolerance * tolerance;
407template <
int MaxSize,
class Element>
410 Element retVal = 0.0;
413 for (
int i = 0; i < commonSize; ++i){
414 retVal += m_elements[i] * vector.
m_elements[i];
421template <
int MaxSize,
class Element>
424 return GetDotProduct(*
this);
428template <
int MaxSize,
class Element>
431 return qSqrt(GetLength2());
435template <
int MaxSize,
class Element>
438 return (*
this - vector).GetLength2();
442template <
int MaxSize,
class Element>
445 return qSqrt(GetDistance2(vector));
451template <
int MaxSize,
class Element>
458 for (
int i = 0; i < m_elementsCount; ++i){
468template <
int MaxSize,
class Element>
471 return !operator==(vector);
475template <
int MaxSize,
class Element>
479 for (
int i = 0; i < commonSize; ++i){
483 else if (m_elements[i] < vector.
m_elements[i]){
492template <
int MaxSize,
class Element>
496 for (
int i = 0; i < commonSize; ++i){
500 else if (m_elements[i] < vector.
m_elements[i]){
509template <
int MaxSize,
class Element>
513 for (
int i = 0; i < commonSize; ++i){
517 else if (m_elements[i] < vector.
m_elements[i]){
526template <
int MaxSize,
class Element>
530 for (
int i = 0; i < commonSize; ++i){
534 else if (m_elements[i] < vector.
m_elements[i]){
543template <
int MaxSize,
class Element>
547 Q_ASSERT(m_elementsCount < MaxSize);
549 for (
int i = 0; i < m_elementsCount; ++i){
557template <
int MaxSize,
class Element>
562 for (; i < m_elementsCount; ++i){
582template <
int MaxSize,
class Element>
587 for (; i < m_elementsCount; ++i){
607template <
int MaxSize,
class Element>
610 for (
int i = 0; i < m_elementsCount; ++i){
611 m_elements[i] *= scalar;
618template <
int MaxSize,
class Element>
621 for (
int i = 0; i < m_elementsCount; ++i){
622 m_elements[i] /= scalar;
629template <
int MaxSize,
class Element>
634 for (
int i = 0; i < m_elementsCount; ++i){
642template <
int MaxSize,
class Element>
653template <
int MaxSize,
class Element>
664template <
int MaxSize,
class Element>
675template <
int MaxSize,
class Element>
686template <
int MaxSize,
class Element>
690 Q_ASSERT(i < m_elementsCount);
692 return m_elements[i];
696template <
int MaxSize,
class Element>
700 Q_ASSERT(i < MaxSize);
702 return m_elements[i];
708template <
int MaxSize,
class Element>
713 for (
int i = 0; i < m_elementsCount; ++i){
714 retVal += m_elements[i];
721template <
int MaxSize,
class Element>
724 Element isLength = GetLength();
726 Element proportion = isLength / length;
728 if (qAbs(proportion) > I_BIG_EPSILON){
729 for (
int i = 0; i < m_elementsCount; ++i){
730 m_elements[i] = m_elements[i] / proportion;
741template <
int MaxSize,
class Element>
750template <
int MaxSize,
class Element>
757 for (
int i = 0; i < elementsCount; ++i){
763template <
int MaxSize,
class Element>
770 for (
int i = 0; i < elementsCount; ++i){
776template <
int MaxSize,
class Element>
784 retVal = retVal && archive.
BeginMultiTag(elementsTag, elementTag, m_elementsCount);
786 if (!retVal || (m_elementsCount > MaxSize)){
794 for (
int i = 0; i < m_elementsCount; ++i){
795 retVal = retVal && archive.
BeginTag(elementTag);
796 retVal = retVal && archive.
Process(m_elements[i]);
797 retVal = retVal && archive.
EndTag(elementTag);
800 retVal = retVal && archive.
EndTag(elementsTag);
808template <
int MaxSize,
class Element>
811 size_t retVal = seed;
820 for (
int i = 0; i < elementsCount; ++i){
821 element.value = v[i];
823 retVal = (retVal << 1) ^ (element.raw + 1);
Simple implementation of fixed-size vector.
TFastVector< MaxSize, Element > operator-() const
void Clear()
Set all coordinates to zero.
const Element & GetElement(int i) const
Get element at specified i.
bool GetNormalized(TFastVector< MaxSize, Element > &result, Element length=1.0) const
Return normalized vector with the same direction and specified length.
Element GetDistance(const TFastVector< MaxSize, Element > &vector) const
Return distance between two vectors.
TFastVector< MaxSize, Element > & operator-=(const TFastVector< MaxSize, Element > &vector)
Element GetLength2() const
Return euclidian length square.
bool Normalize(Element length=1.0)
Normalize vector to specified length.
void SetElementsFrom(const TFastVector &vector, const Element &expansionValue=Element())
Set elemenents from other vector without resizing.
TFastVector< MaxSize, Element > & operator/=(Element scalar)
bool operator<=(const TFastVector< MaxSize, Element > &vector) const
bool operator>=(const TFastVector< MaxSize, Element > &vector) const
Element GetElementsSum() const
Get simple sum of all elements.
bool SetElementsCount(int count, const Element &value=Element())
Set number of elements.
bool operator==(const TFastVector< MaxSize, Element > &vector) const
void SetElement(int i, const Element &value)
Set element at specified i.
void GetMaximal(const TFastVector< MaxSize, Element > &vector, TFastVector< MaxSize, Element > &result) const
Get vector with maximal elements values.
TFastVector< MaxSize, Element > operator+(const TFastVector< MaxSize, Element > &vector) const
int GetElementsCount() const
Get number of elements.
TFastVector()
Create an uninitialized point.
TFastVector< MaxSize, Element > & operator=(const TFastVector< MaxSize, Element > &vector)
TFastVector< MaxSize, Element > operator*(Element scalar) const
Element m_elements[MaxSize]
void ScaledCumulate(const TFastVector< MaxSize, Element > &vector, Element scale)
Add second vector scaled by specified factor.
bool operator<(const TFastVector< MaxSize, Element > &vector) const
void GetMinimal(const TFastVector< MaxSize, Element > &vector, TFastVector< MaxSize, Element > &result) const
Get vector with minimal elements values.
TFastVector< MaxSize, Element > & operator+=(const TFastVector< MaxSize, Element > &vector)
Element GetDotProduct(const TFastVector< MaxSize, Element > &vector) const
Return dot product of two vectors.
bool operator!=(const TFastVector< MaxSize, Element > &vector) const
bool IsNull(Element tolerance=I_BIG_EPSILON) const
Check if this vector is null.
Element & GetElementRef(int i)
Get reference to element at specified i.
bool EnsureElementsCount(int count, const Element &value=Element())
Ensure, that number of elements vector cannot be smaller that some value.
TFastVector< MaxSize, Element > GetTranslated(const TFastVector< MaxSize, Element > &vector)
Get translated point.
bool Serialize(iser::IArchive &archive)
Serialize this vector to specified archive.
TFastVector(const imath::TVector< Size, Element > &vector)
const Element & operator[](int i) const
bool operator>(const TFastVector< MaxSize, Element > &vector) const
Element GetDistance2(const TFastVector< MaxSize, Element > &vector) const
Return distance square between two vectors.
void Translate(const TFastVector< MaxSize, Element > &vector)
Translate the point.
TFastVector< MaxSize, Element > operator-(const TFastVector< MaxSize, Element > &vector) const
TFastVector(const TFastVector< MaxSize, Element > &vector)
Copy constructor.
TFastVector(int componentsCount, const Element &value=Element())
Create vector and initialize number of components.
void GetTranslated(const TFastVector< MaxSize, Element > &vector, TFastVector< MaxSize, Element > &result)
/overloaded
Element & operator[](int i)
TFastVector< MaxSize, Element > & operator*=(Element scalar)
Element GetLength() const
Return euclidian length.
TFastVector< MaxSize, Element > operator/(Element scalar) const
Implementation of fixed-size mathematical vector with specified type of elements.
Process tag used to group data in archive stream.
@ TT_LEAF
Leaf tag, it can contain only one primitive element.
@ TT_MULTIPLE
Multiple tag containing variable number of child tags.
Represent input/output persistence archive.
virtual bool Process(bool &value)=0
Process primitive type.
virtual bool EndTag(const CArchiveTag &tag)=0
End of archive tag.
virtual bool BeginMultiTag(const CArchiveTag &tag, const CArchiveTag &subTag, int &count)=0
Begin of archive tag containing set of subelements of the same type.
virtual bool IsChanging() const =0
Check if this archive processing change the object state.
virtual bool BeginTag(const CArchiveTag &tag)=0
Begin of archive tag.
Package with mathematical functions and algebraical primitives.
size_t qHash(const TFastVector< MaxSize, Element > &v, size_t seed=0)