/** * \file * \author Lars Bilke * \date 2009-10-27 * \brief Definition of the Vector3 class. * From: http://www.strout.net * with modifications to derive from TemplatePoint * * \copyright * Copyright (c) 2012-2020, OpenGeoSys Community (http://www.opengeosys.org) * Distributed under a Modified BSD License. * See accompanying file LICENSE.txt or * http://www.opengeosys.org/project/license * */ #pragma once #include #include "TemplatePoint.h" #include "MathTools.h" namespace MathLib { /** * The Vector3 class defines a three-dimensional vector, with appropriate * operators. */ template class TemplateVector3 : public MathLib::TemplatePoint { public: /** * Default constructor. All coordinates are set to zero. */ TemplateVector3() = default; TemplateVector3(T x0, T x1, T x2) { this->_x[0] = x0; this->_x[1] = x1; this->_x[2] = x2; } /** * Copy constructor. */ TemplateVector3(TemplateVector3 const& /* v */) = default; TemplateVector3& operator=(TemplateVector3 const& /* v */) = default; /** * Construct Vector3 from TemplatePoint. */ explicit TemplateVector3(TemplatePoint const& p) : TemplatePoint(p) {} /** Constructs the vector \f$v=(b-a)\f$ from the given points, * which starts in point \f$a\f$ and ends in point \f$b\f$ */ TemplateVector3(const MathLib::TemplatePoint &a, const MathLib::TemplatePoint &b) : MathLib::TemplatePoint() { this->_x[0] = b[0] - a[0]; this->_x[1] = b[1] - a[1]; this->_x[2] = b[2] - a[2]; } // vector arithmetic TemplateVector3 operator+(TemplateVector3 const& v) const { return TemplateVector3(this->_x[0]+v[0], this->_x[1]+v[1], this->_x[2]+v[2]); } TemplateVector3 operator-(TemplateVector3 const& v) const { return TemplateVector3(this->_x[0]-v[0], this->_x[1]-v[1], this->_x[2]-v[2]); } TemplateVector3& operator+=(TemplateVector3 const& v) { for (std::size_t i(0); i < 3; i++) { this->_x[i] += v[i]; } return *this; } TemplateVector3& operator-=(const TemplateVector3 & pV) { for (std::size_t i(0); i < 3; i++) { this->_x[i] -= pV[i]; } return *this; } TemplateVector3& operator*=(double s) { for (std::size_t i(0); i < 3; i++) { this->_x[i] *= s; } return *this; } /** * After applying the normalize operator to the vector its length is 1.0. */ void normalize() { const double s(1/getLength()); for (std::size_t i(0); i < 3; i++) { this->_x[i] *= s; } } /// Returns a normalized version of this vector TemplateVector3 getNormalizedVector() const { if (getSqrLength() == 0) { return TemplateVector3(0, 0, 0); } TemplateVector3 norm_vec (this->_x[0], this->_x[1], this->_x[2]); norm_vec.normalize(); return norm_vec; } /// Returns the squared length double getSqrLength() const { return this->_x[0]*this->_x[0] + this->_x[1]*this->_x[1] + this->_x[2]*this->_x[2]; } /// Returns the length double getLength() const { return sqrt(getSqrLength()); } /** scalarProduct, implementation of scalar product, * sometimes called dot or inner product. */ template friend T1 scalarProduct(TemplateVector3 const& v, TemplateVector3 const& w); /** crossProduct: implementation of cross product, * sometimes called outer product. */ template friend TemplateVector3 crossProduct( TemplateVector3 const& v, TemplateVector3 const& w); /** multiplication with a scalar s */ template friend TemplateVector3 operator*( TemplateVector3 const& v, double s); template friend TemplateVector3 operator*( double s, TemplateVector3 const& v); }; template T scalarProduct(TemplateVector3 const& v, TemplateVector3 const& w) { return v._x[0] * w._x[0] + v._x[1] * w._x[1] + v._x[2] * w._x[2]; } template TemplateVector3 crossProduct( TemplateVector3 const& v, TemplateVector3 const& w) { return TemplateVector3( v._x[1] * w._x[2] - v._x[2] * w._x[1], v._x[2] * w._x[0] - v._x[0] * w._x[2], v._x[0] * w._x[1] - v._x[1] * w._x[0]); } template TemplateVector3 operator*( TemplateVector3 const& v, double s) { return TemplateVector3(v[0] * s, v[1] * s, v[2] * s); } template TemplateVector3 operator*( double s, TemplateVector3 const& v) { return v * s; } using Vector3 = TemplateVector3; /// Calculates the scalar triple (u x v) . w double scalarTriple(MathLib::Vector3 const& u, MathLib::Vector3 const& v, MathLib::Vector3 const& w); } // namespace MathLib