// SPDX-License-Identifier: LGPL-2.1-or-later // Wild Magic Source Code // David Eberly // http://www.geometrictools.com // Copyright (c) 1998-2007 // // This library is free software; you can redistribute it and/or modify it // under the terms of the GNU Lesser General Public License as published by // the Free Software Foundation; either version 2.1 of the License, or (at // your option) any later version. The license is available for reading at // either of the locations: // http://www.gnu.org/copyleft/lgpl.html // http://www.geometrictools.com/License/WildMagicLicense.pdf // The license applies to versions 0 through 4 of Wild Magic. // // Version: 4.0.0 (2006/06/28) namespace Wm4 { //---------------------------------------------------------------------------- template TRVector::TRVector () { // For efficiency in construction of large arrays of vectors, the // default constructor does not initialize the vector. } //---------------------------------------------------------------------------- template TRVector::TRVector (const TRVector& rkV) { for (int i = 0; i < VSIZE; i++) { m_akTuple[i] = rkV.m_akTuple[i]; } } //---------------------------------------------------------------------------- template TRVector::operator const TRational* () const { return m_akTuple; } //---------------------------------------------------------------------------- template TRVector::operator TRational* () { return m_akTuple; } //---------------------------------------------------------------------------- template TRational TRVector::operator[] (int i) const { assert(0 <= i && i < VSIZE); return m_akTuple[i]; } //---------------------------------------------------------------------------- template TRational& TRVector::operator[] (int i) { assert(0 <= i && i < VSIZE); return m_akTuple[i]; } //---------------------------------------------------------------------------- template TRVector& TRVector::operator= (const TRVector& rkV) { for (int i = 0; i < VSIZE; i++) { m_akTuple[i] = rkV.m_akTuple[i]; } return *this; } //---------------------------------------------------------------------------- template bool TRVector::operator== (const TRVector& rkV) const { for (int i = 0; i < VSIZE; i++) { if (m_akTuple[i] != rkV.m_akTuple[i]) { return false; } } return true; } //---------------------------------------------------------------------------- template bool TRVector::operator!= (const TRVector& rkV) const { return !operator==(rkV); } //---------------------------------------------------------------------------- template int TRVector::CompareArrays (const TRVector& rkV) const { for (int i = 0; i < VSIZE; i++) { if (m_akTuple[i] < rkV.m_akTuple[i]) { return -1; } if (m_akTuple[i] > rkV.m_akTuple[i]) { return +1; } } return 0; } //---------------------------------------------------------------------------- template bool TRVector::operator< (const TRVector& rkV) const { return CompareArrays(rkV) < 0; } //---------------------------------------------------------------------------- template bool TRVector::operator<= (const TRVector& rkV) const { return CompareArrays(rkV) <= 0; } //---------------------------------------------------------------------------- template bool TRVector::operator> (const TRVector& rkV) const { return CompareArrays(rkV) > 0; } //---------------------------------------------------------------------------- template bool TRVector::operator>= (const TRVector& rkV) const { return CompareArrays(rkV) >= 0; } //---------------------------------------------------------------------------- template TRVector TRVector::operator+ (const TRVector& rkV) const { TRVector kSum; for (int i = 0; i < VSIZE; i++) { kSum.m_akTuple[i] = m_akTuple[i] + rkV.m_akTuple[i]; } return kSum; } //---------------------------------------------------------------------------- template TRVector TRVector::operator- (const TRVector& rkV) const { TRVector kDiff; for (int i = 0; i < VSIZE; i++) { kDiff.m_akTuple[i] = m_akTuple[i] - rkV.m_akTuple[i]; } return kDiff; } //---------------------------------------------------------------------------- template TRVector TRVector::operator* (const TRational& rkR) const { TRVector kProd; for (int i = 0; i < VSIZE; i++) { kProd.m_akTuple[i] = rkR*m_akTuple[i]; } return kProd; } //---------------------------------------------------------------------------- template TRVector TRVector::operator/ (const TRational& rkR) const { assert(rkR != 0); TRVector kProd; for (int i = 0; i < VSIZE; i++) { kProd.m_akTuple[i] = m_akTuple[i]/rkR; } return kProd; } //---------------------------------------------------------------------------- template TRVector TRVector::operator- () const { TRVector kNeg; for (int i = 0; i < VSIZE; i++) { kNeg.m_akTuple[i] = -m_akTuple[i]; } return kNeg; } //---------------------------------------------------------------------------- template TRVector operator* (const TRational& rkR, const TRVector& rkV) { TRVector kProd; for (int i = 0; i < VSIZE; i++) { kProd[i] = rkR*rkV[i]; } return kProd; } //---------------------------------------------------------------------------- template TRVector& TRVector::operator+= (const TRVector& rkV) { for (int i = 0; i < VSIZE; i++) { m_akTuple[i] += rkV.m_akTuple[i]; } return *this; } //---------------------------------------------------------------------------- template TRVector& TRVector::operator-= (const TRVector& rkV) { for (int i = 0; i < VSIZE; i++) { m_akTuple[i] -= rkV.m_akTuple[i]; } return *this; } //---------------------------------------------------------------------------- template TRVector& TRVector::operator*= (const TRational& rkR) { for (int i = 0; i < VSIZE; i++) { m_akTuple[i] *= rkR; } return *this; } //---------------------------------------------------------------------------- template TRVector& TRVector::operator/= (const TRational& rkR) { assert(rkR != 0); for (int i = 0; i < VSIZE; i++) { m_akTuple[i] /= rkR; } return *this; } //---------------------------------------------------------------------------- template TRational TRVector::SquaredLength () const { TRational kSqrLen = 0; for (int i = 0; i < VSIZE; i++) { kSqrLen += m_akTuple[i]*m_akTuple[i]; } return kSqrLen; } //---------------------------------------------------------------------------- template TRational TRVector::Dot (const TRVector& rkV) const { TRational kDot = 0; for (int i = 0; i < VSIZE; i++) { kDot += m_akTuple[i]*rkV.m_akTuple[i]; } return kDot; } //---------------------------------------------------------------------------- } //namespace Wm4