161 lines
3.2 KiB
C++

#include <iostream>
#include <cmath>
#include "Geometry/Vector.hpp"
namespace geo
{
template<typename T, std::size_t N>
Vector<T,N>::Vector() : data{}
{
}
template<typename T, std::size_t N>
template<typename...Types>
constexpr Vector<T,N>::Vector(Types... l) : data{{static_cast<T>(l)...}}
{
}
template<typename T, std::size_t N>
template<typename U>
Vector<T,N>::Vector(Vector<U,N> const& v) : data(v.data)
{
}
template<typename T, std::size_t N>
T Vector<T,N>::norm2() const
{
return (*this) * (*this);
}
template<typename T, std::size_t N>
T Vector<T,N>::norm() const
{
return std::sqrt(norm2());
}
template<typename T, std::size_t N>
std::istream& operator>>(std::istream& stream, Vector<T,N>& v)
{
for (auto& d : v.data)
stream >> d;
return stream;
}
template<typename T, std::size_t N>
std::ostream& operator<<(std::ostream& stream, Vector<T,N> const& v)
{
stream << "[" << v.data[0];
for (std::size_t i = 1; i < N; i++)
stream << ", " << v.data[i];
return stream << "]";
}
template<typename T, std::size_t N>
bool operator==(Vector<T,N> const& l, Vector<T,N> const& r)
{
bool ret = true;
for (std::size_t i = 0; i < N; i++)
ret = ret && (l.data[i] == r.data[i]);
return ret;
}
template<typename T, std::size_t N>
bool operator!=(Vector<T,N> const& l, Vector<T,N> const& r)
{
return !(l == r);
}
template<typename T, std::size_t N>
Vector<T,N> Vector<T,N>::operator-()
{
Vector<T,N> ret;
for (std::size_t i = 0; i < N; i++)
{
ret.data[i] = -data[i];
}
return ret;
}
template<typename T, std::size_t N>
Vector<T,N>& Vector<T,N>::operator+=(Vector<T,N> const& v)
{
for (std::size_t i = 0; i < N; i++)
data[i] += v.data[i];
return *this;
}
template<typename T, std::size_t N>
Vector<T,N>& Vector<T,N>::operator-=(Vector<T,N> const& v)
{
for (std::size_t i = 0; i < N; i++)
data[i] -= v.data[i];
return *this;
}
template<typename T, std::size_t N>
Vector<T,N>& Vector<T,N>::operator*=(float f)
{
for (std::size_t i = 0; i < N; i++)
data[i] *= f;
return *this;
}
template<typename T, std::size_t N>
Vector<T,N>& Vector<T,N>::operator/=(float f)
{
for (std::size_t i = 0; i < N; i++)
data[i] /= f;
return *this;
}
template<typename T, std::size_t N>
Vector<T,N> operator+(Vector<T,N> t, Vector<T,N> const& r) { return t+=r; }
template<typename T, std::size_t N>
Vector<T,N> operator-(Vector<T,N> t, Vector<T,N> const& r) { return t-=r; }
template<typename T, std::size_t N>
Vector<T,N> operator*(Vector<T,N> l, float r) { return l*=r; }
template<typename T, std::size_t N>
Vector<T,N> operator*(float r, Vector<T,N> l) { return l*r; }
template<typename T, std::size_t N>
Vector<T,N> operator/(Vector<T,N> l, float r) { return l/=r; }
template<typename T, std::size_t N>
T operator*(Vector<T,N> const& l, Vector<T,N> const& r)
{
T ret = 0;
for (std::size_t i = 0; i < N; i++)
ret += (l.data[i] * r.data[i]);
return ret;
}
template <typename T>
Vector<T,3> crossProduct(Vector<T,3> const& v1, Vector<T,3> const& v2)
{
return Vector<T,3>{
v1.y() * v2.z() - v1.z() * v2.y(),
v1.z() * v2.x() - v1.x() * v2.z(),
v1.x() * v2.y() - v1.y() * v2.x()
};
}
} // namespace geo