Add geom::ray primitive

This commit is contained in:
Nikita Lisitsa 2020-09-23 22:23:37 +03:00
parent e53d5fba13
commit 4410597e44

View file

@ -0,0 +1,59 @@
#pragma once
#include <psemek/geom/vector.hpp>
#include <psemek/geom/point.hpp>
namespace psemek::geom
{
template <typename T, std::size_t N>
struct ray
{
point<T, N> origin;
vector<T, N> direction;
auto operator()(T const & t) const
{
return origin + t * direction;
}
ray & operator += (vector<T, N> const & v)
{
origin += v;
return *this;
}
ray & operator -= (vector<T, N> const & v)
{
origin -= v;
return *this;
}
};
template <typename T, std::size_t N>
ray(point<T, N>, vector<T, N>) -> ray<T, N>;
template <typename T, std::size_t N>
ray<T, N> advance(ray<T, N> r, T const & t)
{
r.origin = r(t);
return r;
}
template <typename T, std::size_t N>
ray<T, N> operator + (ray<T, N> const & r, vector<T, N> const & v)
{
auto res = r;
res += v;
return res;
}
template <typename T, std::size_t N>
ray<T, N> operator - (ray<T, N> const & r, vector<T, N> const & v)
{
auto res = r;
res -= v;
return res;
}
}