/* * This file is part of libgim. * * libgim is free software: you can redistribute it and/or modify it under the * terms of the GNU General Public License as published by the Free Software * Foundation, either version 3 of the License, or (at your option) any later * version. * * libgim is distributed in the hope that it will be useful, but WITHOUT ANY * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more * details. * * You should have received a copy of the GNU General Public License * along with libgim. If not, see . * * Copyright 2011 Danny Robson */ #ifndef __UTIL_VECTOR_HPP #define __UTIL_VECTOR_HPP #include "json.hpp" #include "detail/coord.hpp" #include #include #include namespace util { template struct vector : public detail::coord { static_assert (S > 0, "vector dimensions must be strictly positive"); vector (); template explicit vector (U ...u): detail::coord {std::forward (u)...} { ; } // arithmetic operators vector operator* (T) const; vector& operator*=(T); vector operator/ (T) const; vector& operator/=(T); vector operator+ (T) const; vector& operator+=(T); vector operator- (T) const; vector& operator-=(T); // element operators vector operator* (const vector&) const; vector& operator*=(const vector&); vector operator+ (const vector&) const; vector& operator+=(const vector&); vector operator- (void) const; vector operator- (const vector&) const; vector& operator-=(const vector&); vector& operator =(const vector&); // logical operators bool operator== (const vector&) const; bool is_zero (void) const; // vector operators T magnitude (void) const; T magnitude2 (void) const; T dot (const vector&) const; vector& normalise (void); vector normalised [[gnu::warn_unused_result]] (void) const; template vector redim (void) const; void sanity (void) const; }; // free vector operators template vector<2,T> polar_to_cartesian (const vector<2,T>&); template vector<3,T> cross (const vector<3,T>&, const vector<3,T>&); template vector<3,T> spherical_to_cartesian (const vector<3,T>&); template vector<3,T> cartesian_to_spherical (const vector<3,T>&); template vector operator* (T, const vector&); template vector operator+ (T, const vector&); template vector operator- (T, const vector&); // output and serialisation operators template std::ostream& operator<< (std::ostream&, const vector&); template const json::node& operator>> (const json::node&, vector&); // convenience typedefs typedef vector<2,float> vector2f; typedef vector<3,float> vector3f; typedef vector<2,double> vector2d; typedef vector<3,double> vector3d; } #endif