18template <
typename Base>
72 typename Base::ElementType
GetLength()
const;
89 bool Normalize(
typename Base::ElementType length = 1.0);
123 operator Base()
const;
129template <
typename Base>
135template <
typename Base>
144template <
typename Base>
147 int elementsCount = BaseClass::GetElementsCount();
148 for (
int i = 0; i < elementsCount; ++i){
149 BaseClass::SetElement(i, 0.0);
154template <
typename Base>
157 int elementsCount = qMin(BaseClass::GetElementsCount(), vector.GetElementsCount());
158 for (
int i = 0; i < elementsCount; ++i){
159 BaseClass::GetElementRef(i) += vector.GetElement(i);
164template <
typename Base>
167 return *
this + vector;
171template <
typename Base>
174 result = *
this + vector;
178template <
typename Base>
181 return GetLength2() <= tolerance * tolerance;
185template <
typename Base>
188 typename Base::ElementType retVal = 0.0;
190 int elementsCount = qMin(BaseClass::GetElementsCount(), vector.GetElementsCount());
191 for (
int i = 0; i < elementsCount; ++i){
192 retVal += BaseClass::GetElement(i) * vector.GetElement(i);
199template <
typename Base>
202 return GetDotProduct(*
this);
206template <
typename Base>
209 return qSqrt(GetLength2());
213template <
typename Base>
216 return (*
this - vector).GetLength2();
220template <
typename Base>
223 return qSqrt(GetDistance2(vector));
229template <
typename Base>
232 int elementsCount = BaseClass::GetElementsCount();
233 if (elementsCount != vector.GetElementsCount()){
237 for (
int i = 0; i < elementsCount; ++i){
238 if (BaseClass::GetElement(i) != vector.GetElement(i)){
246template <
typename Base>
249 return !operator==(vector);
253template <
typename Base>
256 int elementsCount = qMin(BaseClass::GetElementsCount(), vector.GetElementsCount());
257 for (
int i = 0; i < elementsCount; ++i){
258 typename Base::ElementType firstElement = BaseClass::GetElement(i);
259 typename Base::ElementType secondElement = vector.GetElement(i);
261 if (firstElement > secondElement){
264 else if (firstElement < secondElement){
269 return BaseClass::GetElementsCount() < vector.GetElementsCount();
273template <
typename Base>
276 int elementsCount = qMin(BaseClass::GetElementsCount(), vector.GetElementsCount());
277 for (
int i = 0; i < elementsCount; ++i){
278 typename Base::ElementType firstElement = BaseClass::GetElement(i);
279 typename Base::ElementType secondElement = vector.GetElement(i);
281 if (firstElement > secondElement){
284 else if (firstElement < secondElement){
289 return BaseClass::GetElementsCount() > vector.GetElementsCount();
293template <
typename Base>
296 int elementsCount = qMin(BaseClass::GetElementsCount(), vector.GetElementsCount());
297 for (
int i = 0; i < elementsCount; ++i){
298 typename Base::ElementType firstElement = BaseClass::GetElement(i);
299 typename Base::ElementType secondElement = vector.GetElement(i);
301 if (firstElement > secondElement){
304 else if (firstElement < secondElement){
309 return BaseClass::GetElementsCount() <= vector.GetElementsCount();
313template <
typename Base>
316 int elementsCount = qMin(BaseClass::GetElementsCount(), vector.GetElementsCount());
317 for (
int i = 0; i < elementsCount; ++i){
318 typename Base::ElementType firstElement = BaseClass::GetElement(i);
319 typename Base::ElementType secondElement = vector.GetElement(i);
321 if (firstElement > secondElement){
324 else if (firstElement < secondElement){
329 return BaseClass::GetElementsCount() >= vector.GetElementsCount();
333template <
typename Base>
336 BaseClass::operator=(vector);
342template <
typename Base>
345 int elementsCount = qMin(BaseClass::GetElementsCount(), vector.GetElementsCount());
346 for (
int i = 0; i < elementsCount; ++i){
347 BaseClass::GetElementRef(i) += vector.GetElement(i);
354template <
typename Base>
357 int elementsCount = qMin(BaseClass::GetElementsCount(), vector.GetElementsCount());
358 for (
int i = 0; i < elementsCount; ++i){
359 BaseClass::GetElementRef(i) -= vector.GetElement(i);
366template <
typename Base>
369 int elementsCount = BaseClass::GetElementsCount();
370 for (
int i = 0; i < elementsCount; ++i){
371 BaseClass::GetElementRef(i) *= scalar;
378template <
typename Base>
381 int elementsCount = BaseClass::GetElementsCount();
382 for (
int i = 0; i < elementsCount; ++i){
383 BaseClass::GetElementRef(i) /= scalar;
390template <
typename Base>
395 int elementsCount = BaseClass::GetElementsCount();
396 retVal.SetElementsCount(elementsCount);
397 for (
int i = 0; i < elementsCount; ++i){
398 retVal.SetElement(i, -BaseClass::GetElement(i));
405template <
typename Base>
410 int elementsCount = qMin(BaseClass::GetElementsCount(), vector.GetElementsCount());
411 retVal.SetElementsCount(elementsCount);
412 for (
int i = 0; i < elementsCount; ++i){
413 retVal.SetElement(i, BaseClass::GetElement(i) + vector.GetElement(i));
420template <
typename Base>
425 int elementsCount = qMin(BaseClass::GetElementsCount(), vector.GetElementsCount());
426 retVal.SetElementsCount(elementsCount);
427 for (
int i = 0; i < elementsCount; ++i){
428 retVal.SetElement(i, BaseClass::GetElement(i) - vector.GetElement(i));
435template <
typename Base>
440 int elementsCount = BaseClass::GetElementsCount();
441 retVal.SetElementsCount(elementsCount);
442 for (
int i = 0; i < elementsCount; ++i){
443 retVal.SetElement(i, BaseClass::GetElement(i) * scalar);
450template <
typename Base>
455 int elementsCount = BaseClass::GetElementsCount();
456 retVal.SetElementsCount(elementsCount);
457 for (
int i = 0; i < elementsCount; ++i){
458 retVal.SetElement(i, BaseClass::GetElement(i) / scalar);
467template <
typename Base>
470 typename Base::ElementType isLength = GetLength();
472 typename Base::ElementType proportion = isLength / length;
475 int elementsCount = BaseClass::GetElementsCount();
476 for (
int i = 0; i < elementsCount; ++i){
477 BaseClass::SetElement(i, BaseClass::GetElement(i) / proportion);
488template <
typename Base>
491 typename Base::ElementType isLength = GetLength();
493 typename Base::ElementType proportion = isLength / length;
496 int elementsCount = BaseClass::GetElementsCount();
497 result.SetElementsCount(elementsCount);
498 for (
int i = 0; i < elementsCount; ++i){
499 result.SetElement(i, BaseClass::GetElement(i) / proportion);
510template <
typename Base>
515 int elementsCount = BaseClass::GetElementsCount();
520 retVal = retVal && archive.
BeginMultiTag(elementsTag, elementTag, elementsCount);
527 BaseClass::SetElementsCount(elementsCount);
530 for (
int i = 0; i < elementsCount; ++i){
531 retVal = retVal && archive.
BeginTag(elementTag);
532 retVal = retVal && archive.
Process(BaseClass::GetElementRef(i));
533 retVal = retVal && archive.
EndTag(elementTag);
536 retVal = retVal && archive.
EndTag(elementsTag);
542template <
typename Base>
Implementation of mathematical vector with carthesian operations over elements container (vector).
TMathVectorWrap< Base > & operator/=(typename Base::ElementType scalar)
Base::ElementType GetDotProduct(const TMathVectorWrap< Base > &vector) const
Return dot product of two vectors.
bool operator>=(const TMathVectorWrap< Base > &vector) const
TMathVectorWrap< Base > & operator-=(const TMathVectorWrap< Base > &vector)
bool operator<(const TMathVectorWrap< Base > &vector) const
bool GetNormalized(TMathVectorWrap< Base > &result, typename Base::ElementType length=1.0) const
Return normalized vector with the same direction and specified length.
bool IsNull(typename Base::ElementType tolerance=I_BIG_EPSILON) const
Check if this vector is null.
bool operator>(const TMathVectorWrap< Base > &vector) const
bool Serialize(iser::IArchive &archive)
Serialize this vector to specified archive.
TMathVectorWrap< Base > GetTranslated(const TMathVectorWrap< Base > &vector)
Get translated point.
TMathVectorWrap< Base > operator-() const
TMathVectorWrap< Base > operator*(typename Base::ElementType scalar) const
void Clear()
Set all coordinates to zero.
Base::ElementType GetDistance2(const TMathVectorWrap< Base > &vector) const
Return distance square between two vectors.
TMathVectorWrap()
Create an uninitialized point.
TMathVectorWrap< Base > & operator+=(const TMathVectorWrap< Base > &vector)
bool Normalize(typename Base::ElementType length=1.0)
Normalize vector to specified length.
Base::ElementType GetDistance(const TMathVectorWrap< Base > &vector) const
Return distance between two vectors.
TMathVectorWrap< Base > operator+(const TMathVectorWrap< Base > &vector) const
bool operator<=(const TMathVectorWrap< Base > &vector) const
bool operator!=(const TMathVectorWrap< Base > &vector) const
TMathVectorWrap< Base > & operator*=(typename Base::ElementType scalar)
TMathVectorWrap< Base > & operator=(const TMathVectorWrap< Base > &vector)
Base::ElementType GetLength2() const
Return euclidian length square.
bool operator==(const TMathVectorWrap< Base > &vector) const
Base::ElementType GetLength() const
Return euclidian length.
TMathVectorWrap< Base > operator/(typename Base::ElementType scalar) const
void Translate(const TMathVectorWrap< Base > &vector)
Translate the point.
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.
Represents an input/output persistence archive for object serialization.
virtual bool Process(bool &value)=0
Processes (reads or writes) a boolean value.
virtual bool EndTag(const CArchiveTag &tag)=0
Ends a tagged section in the archive.
virtual bool BeginMultiTag(const CArchiveTag &tag, const CArchiveTag &subTag, int &count)=0
Begins a tagged section containing multiple elements of the same type.
virtual bool IsStoring() const =0
Checks if this archive is in storing (writing) or loading (reading) mode.
virtual bool BeginTag(const CArchiveTag &tag)=0
Begins a tagged section in the archive.
static const double I_BIG_EPSILON
Package with mathematical functions and algebraical primitives.