6#include <QtCore/QtGlobal>
7#if QT_VERSION >= 0x050000
8#include <QtCore/QtMath>
10#include <QtCore/qmath.h>
14#include <initializer_list>
93template <
int Size,
class Element =
double>
141 TVector(std::initializer_list<Element> values);
504 explicit TVector(Element vector);
512template <
int Size,
class Element>
518template <
int Size,
class Element>
521 for (
int i = 0; i < Size; ++i){
527template <
int Size,
class Element>
530 int count =
static_cast<int>(values.size());
531 Q_ASSERT(count <= Size);
533 for (
int i = 0; i < count; ++i){
534 m_elements[i] = *(values.begin() + i);
537 for (
int i = count; i < Size; ++i){
545template <
int Size,
class Element>
548 return operator[](i);
552template <
int Size,
class Element>
555 return operator[](i);
559template <
int Size,
class Element>
562 operator[](i) = value;
566template <
int Size,
class Element>
569 for (
int i = 0; i < Size; ++i){
570 m_elements[i] = value;
575template <
int Size,
class Element>
578 for (
int i = 0; i < Size; ++i){
584template <
int Size,
class Element>
587 for (
int i = 0; i < Size; ++i){
593template <
int Size,
class Element>
600template <
int Size,
class Element>
607template <
int Size,
class Element>
610 for (
int i = 0; i < Size; ++i){
616template <
int Size,
class Element>
619 return *
this + vector;
623template <
int Size,
class Element>
626 result = *
this + vector;
630template <
int Size,
class Element>
633 for (
int i = 0; i < Size; ++i){
634 m_elements[i] += vector.
m_elements[i] * scale;
639template <
int Size,
class Element>
642 return GetLength2() <= tolerance * tolerance;
646template <
int Size,
class Element>
649 Element retVal = 0.0;
651 for (
int i = 0; i < Size; ++i){
652 retVal += m_elements[i] * vector.
m_elements[i];
659template <
int Size,
class Element>
662 return GetDotProduct(*
this);
666template <
int Size,
class Element>
669 return qSqrt(GetLength2());
673template <
int Size,
class Element>
676 return (*
this - vector).GetLength2();
680template <
int Size,
class Element>
683 return qSqrt(GetDistance2(vector));
689template <
int Size,
class Element>
692 for (
int i = 0; i < Size; ++i){
701template <
int Size,
class Element>
704 return !operator==(vector);
708template <
int Size,
class Element>
711 for (
int i = 0; i < Size; ++i){
715 else if (m_elements[i] < vector.
m_elements[i]){
724template <
int Size,
class Element>
727 for (
int i = 0; i < Size; ++i){
731 else if (m_elements[i] < vector.
m_elements[i]){
740template <
int Size,
class Element>
743 for (
int i = 0; i < Size; ++i){
747 else if (m_elements[i] < vector.
m_elements[i]){
756template <
int Size,
class Element>
759 for (
int i = 0; i < Size; ++i){
763 else if (m_elements[i] < vector.
m_elements[i]){
772template <
int Size,
class Element>
775 for (
int i = 0; i < Size; ++i){
783template <
int Size,
class Element>
786 for (
int i = 0; i < Size; ++i){
794template <
int Size,
class Element>
797 for (
int i = 0; i < Size; ++i){
798 m_elements[i] *= scalar;
805template <
int Size,
class Element>
808 for (
int i = 0; i < Size; ++i){
809 m_elements[i] /= scalar;
816template <
int Size,
class Element>
821 for (
int i = 0; i < Size; ++i){
829template <
int Size,
class Element>
834 for (
int i = 0; i < Size; ++i){
842template <
int Size,
class Element>
847 for (
int i = 0; i < Size; ++i){
855template <
int Size,
class Element>
860 for (
int i = 0; i < Size; ++i){
861 retVal.
m_elements[i] = m_elements[i] * scalar;
868template <
int Size,
class Element>
873 for (
int i = 0; i < Size; ++i){
874 retVal.
m_elements[i] = m_elements[i] / scalar;
881template <
int Size,
class Element>
887 return m_elements[i];
891template <
int Size,
class Element>
897 return m_elements[i];
903template <
int Size,
class Element>
910template <
int Size,
class Element>
913 return count == Size;
917template <
int Size,
class Element>
926template <
int Size,
class Element>
931 for (
int i = 0; i < Size; ++i){
932 retVal += m_elements[i];
939template <
int Size,
class Element>
942 Element isLength = GetLength();
944 Element proportion = isLength / length;
947 for (
int i = 0; i < Size; ++i){
948 m_elements[i] = m_elements[i] / proportion;
959template <
int Size,
class Element>
962 Element isLength = GetLength();
964 Element proportion = isLength / length;
967 for (
int i = 0; i < Size; ++i){
968 result.
m_elements[i] = m_elements[i] / proportion;
979template <
int Size,
class Element>
982 for (
int i = 0; i < Size; ++i){
988template <
int Size,
class Element>
991 for (
int i = 0; i < Size; ++i){
997template <
int Size,
class Element>
1002 for (
int i = 0; i < Size; ++i){
1003 retVal = retVal && archive.
Process(m_elements[i]);
1012template <
int Size,
class Element>
1015 for (
int i = 0; i < Size; ++i){
1016 m_elements[i] = element;
1021template <
int Size,
class Element>
1022TVector<Size, Element> TVector<Size, Element>::s_zero(Element(0));
Implementation of fixed-size mathematical vector with specified type of elements.
Element GetLength() const
Calculates the Euclidean length (magnitude) of the vector.
TVector()
Creates an uninitialized vector.
TVector< Size, Element > operator*(Element scalar) const
Element & operator[](int i)
TVector(const TVector< Size, Element > &vector)
Creates a copy of another vector.
const Element & operator[](int i) const
Element GetDistance2(const TVector< Size, Element > &vector) const
Calculates the squared distance to another vector.
bool operator<=(const TVector< Size, Element > &vector) const
Element GetDotProduct(const TVector< Size, Element > &vector) const
Calculates the dot product with another vector.
TVector< Size, Element > & operator+=(const TVector< Size, Element > &vector)
Element GetElementsSum() const
Calculates the sum of all vector elements.
void Translate(const TVector< Size, Element > &vector)
Translates (adds) another vector to this vector.
void GetTranslated(const TVector< Size, Element > &vector, TVector< Size, Element > &result)
Computes the translated vector and stores it in the result parameter.
TVector< Size, Element >::Elements & GetElementsRef()
Get access to internal element container.
static bool SetElementsCount(int count)
Set number of elements.
TVector< Size, Element > operator+(const TVector< Size, Element > &vector) const
bool operator>=(const TVector< Size, Element > &vector) const
static int GetElementsCount()
Get number of elements.
TVector< Size, Element > & operator/=(Element scalar)
TVector< Size, Element > & operator-=(const TVector< Size, Element > &vector)
Element GetLength2() const
Calculates the squared Euclidean length of the vector.
TVector< Size, Element > & operator*=(Element scalar)
TVector< Size, Element > & operator=(const TVector< Size, Element > &vector)=default
bool Normalize(Element length=1.0)
Normalizes the vector to a specified length.
TVector(std::initializer_list< Element > values)
Creates a vector from an initializer list.
bool operator<(const TVector< Size, Element > &vector) const
TVector< Size, Element > GetTranslated(const TVector< Size, Element > &vector)
Returns a new vector that is the translation of this vector.
TVector< Size, Element > operator-() const
TVector< Size, Element > operator/(Element scalar) const
static const TVector< Size, Element > & GetZero()
Get vector with all coordinates set to 0.
void ScaledCumulate(const TVector< Size, Element > &vector, Element scale)
Adds a scaled vector to this vector.
bool operator!=(const TVector< Size, Element > &vector) const
bool Serialize(iser::IArchive &archive)
Serialize this vector to specified archive.
const TVector< Size, Element >::Elements & GetElements() const
Get read-only access to internal element container.
void GetMaximal(const TVector< Size, Element > &vector, TVector< Size, Element > &result) const
Get vector with maximal elements values.
void Clear()
Sets all coordinates to zero.
bool operator==(const TVector< Size, Element > &vector) const
Element & GetElementRef(int i)
Gets a reference to the element at the specified index (read-write).
void GetMinimal(const TVector< Size, Element > &vector, TVector< Size, Element > &result) const
Get vector with minimal elements values.
bool IsNull(Element tolerance=I_BIG_EPSILON) const
Checks if this vector is null (all elements approximately zero).
TVector< Size, Element > operator-(const TVector< Size, Element > &vector) const
bool operator>(const TVector< Size, Element > &vector) const
void SetAllElements(const Element &value)
Sets all elements to the same value.
Element GetDistance(const TVector< Size, Element > &vector) const
Calculates the Euclidean distance to another vector.
void SetElement(int i, const Element &value)
Sets the element at the specified index.
bool GetNormalized(TVector< Size, Element > &result, Element length=1.0) const
Returns a normalized copy of this vector with specified length.
const Element & GetElement(int i) const
Gets the element at the specified index (read-only).
void Reset()
Sets all coordinates to zero.
Represents an input/output persistence archive for object serialization.
virtual bool Process(bool &value)=0
Processes (reads or writes) a boolean value.
static const double I_BIG_EPSILON
Package with mathematical functions and algebraical primitives.