coord: move free maths func from point to vector
This commit is contained in:
parent
50b0bc37b2
commit
6abfd252d9
22
bezier.cpp
22
bezier.cpp
@ -26,6 +26,22 @@
|
||||
#include <iterator>
|
||||
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
// HACK: point multiplication isn't defined, but it's way more convenient than
|
||||
// casting between vector/coord
|
||||
namespace util {
|
||||
template <typename T>
|
||||
util::point2f
|
||||
operator* (T a, util::point2f b)
|
||||
{
|
||||
return {
|
||||
a * b.data[0],
|
||||
a * b.data[1]
|
||||
};
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
template <size_t S>
|
||||
util::bezier<S>::bezier (const util::point2f (&_points)[S+1])
|
||||
@ -65,7 +81,7 @@ namespace util {
|
||||
|
||||
auto v0 = pow2 (1 - t) * m_points[0];
|
||||
auto v1 = 2 * (1 - t) * t * m_points[1];
|
||||
auto v2 = pow2 (t) * m_points[2];
|
||||
auto v2 = pow2 (t) * m_points[2];
|
||||
|
||||
return {
|
||||
v0.x + v1.x + v2.x,
|
||||
@ -84,10 +100,10 @@ namespace util {
|
||||
CHECK_GE (t, 0);
|
||||
CHECK_LE (t, 1);
|
||||
|
||||
auto v0 = pow (1 - t, 3) * m_points[0];
|
||||
auto v0 = pow (1 - t, 3) * m_points[0];
|
||||
auto v1 = 3 * pow2 (1 - t) * t * m_points[1];
|
||||
auto v2 = 3 * pow2 (1 - t) * t * m_points[2];
|
||||
auto v3 = pow (t, 3) * m_points[3];
|
||||
auto v3 = pow (t, 3) * m_points[3];
|
||||
|
||||
return {
|
||||
v0.x + v1.x + v2.x + v3.x,
|
||||
|
29
point.cpp
29
point.cpp
@ -159,32 +159,6 @@ template <size_t S, typename T>
|
||||
const util::point<S,T> util::point<S,T>::ORIGIN (T {0});
|
||||
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
template <size_t S, typename T>
|
||||
util::point<S,T>
|
||||
util::operator* (const vector<S,T> &v, const point<S,T> &p) {
|
||||
point<S,T> out;
|
||||
for (size_t i = 0; i < S; ++i)
|
||||
out.data[i] = p.data[i] + v.data[i];
|
||||
|
||||
return out;
|
||||
}
|
||||
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
template <size_t S, typename T>
|
||||
util::point<S,T>
|
||||
util::operator* (const point<S,T> &p, const vector<S,T> &v)
|
||||
{ return v * p; }
|
||||
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
template <size_t S, typename T>
|
||||
util::point<S,T>
|
||||
util::operator* (T a, const point<S,T> &b)
|
||||
{ return b * a; }
|
||||
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
template <size_t S, typename T>
|
||||
std::ostream&
|
||||
@ -204,9 +178,6 @@ util::operator<< (std::ostream &os, const util::point<S,T> &p) {
|
||||
#define INSTANTIATE_S_T(S,T) \
|
||||
template struct util::point<S,T>; \
|
||||
template std::ostream& util::operator<< (std::ostream &os, const util::point<S,T>&); \
|
||||
template util::point<S,T> util::operator* (const point<S,T>&, const vector<S,T>&); \
|
||||
template util::point<S,T> util::operator* (const vector<S,T>&, const point<S,T>&); \
|
||||
template util::point<S,T> util::operator* (T, const point<S,T>&);
|
||||
|
||||
#define INSTANTIATE(T) \
|
||||
INSTANTIATE_S_T(1,T) \
|
||||
|
@ -46,7 +46,7 @@ namespace util {
|
||||
point<S,T> operator* (T) const;
|
||||
point<S,T> operator/ (T) const;
|
||||
|
||||
vector<S,T> operator- (const point<S,T>&) const;
|
||||
vector<S,T> operator- (const point<S,T>&) const;
|
||||
|
||||
point<S,T> operator- (const vector<S,T>&) const;
|
||||
point<S,T>& operator-= (const vector<S,T>&);
|
||||
@ -66,11 +66,6 @@ namespace util {
|
||||
void sanity (void) const;
|
||||
};
|
||||
|
||||
// free maths operators
|
||||
template <size_t S, typename T> point<S,T> operator* (const vector<S,T>&, const point<S,T>&);
|
||||
template <size_t S, typename T> point<S,T> operator* (const point<S,T>&, const vector<S,T>&);
|
||||
template <size_t S, typename T> point<S,T> operator* (T, const point<S,T>&);
|
||||
|
||||
// iostream operators
|
||||
template <size_t S, typename T>
|
||||
std::ostream& operator<< (std::ostream&, const point<S,T>&);
|
||||
|
29
vector.cpp
29
vector.cpp
@ -230,6 +230,7 @@ util::vector<S,T>::magnitude (void) const {
|
||||
}
|
||||
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
template <size_t S, typename T>
|
||||
T
|
||||
util::vector<S,T>::magnitude2 (void) const {
|
||||
@ -353,24 +354,30 @@ util::vector<S,T>::sanity (void) const {
|
||||
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
template <size_t S, typename T>
|
||||
template <size_t S, typename T, typename U>
|
||||
util::vector<S,T>
|
||||
util::operator* (T a, const util::vector<S,T> &b)
|
||||
{ return b * a; }
|
||||
util::operator* (U a, const util::vector<S,T> &b)
|
||||
{
|
||||
return b * T(a);
|
||||
}
|
||||
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
template <size_t S, typename T>
|
||||
template <size_t S, typename T, typename U>
|
||||
util::vector<S,T>
|
||||
util::operator+ (T a, const util::vector<S,T> &b)
|
||||
{ return b + a; }
|
||||
util::operator+ (U a, const util::vector<S,T> &b)
|
||||
{
|
||||
return b + T(a);
|
||||
}
|
||||
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
template <size_t S, typename T>
|
||||
template <size_t S, typename T, typename U>
|
||||
util::vector<S,T>
|
||||
util::operator- (T a, const util::vector<S,T> &b)
|
||||
{ return a + (-b); }
|
||||
util::operator- (U a, const util::vector<S,T> &b)
|
||||
{
|
||||
return a + (-b);
|
||||
}
|
||||
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
@ -407,7 +414,9 @@ util::operator>> (const json::node &node, util::vector<S,T> &v) {
|
||||
|
||||
#define INSTANTIATE_S_T(S,T) \
|
||||
template struct util::vector<S,T>; \
|
||||
template util::vector<S,T> util::operator* (T, const util::vector<S,T>&); \
|
||||
template util::vector<S,T> util::operator* (int, const util::vector<S,T>&); \
|
||||
template util::vector<S,T> util::operator* (unsigned, const util::vector<S,T>&); \
|
||||
template util::vector<S,T> util::operator* (float, const util::vector<S,T>&); \
|
||||
template util::vector<S,T> util::operator+ (T, const util::vector<S,T>&); \
|
||||
template util::vector<S,T> util::operator- (T, const util::vector<S,T>&); \
|
||||
template std::ostream& util::operator<< (std::ostream&, const util::vector<S,T> &v);\
|
||||
|
@ -72,9 +72,11 @@ namespace util {
|
||||
vector<S,T>& normalise (void);
|
||||
vector<S,T> normalised [[gnu::warn_unused_result]] (void) const;
|
||||
|
||||
// size operations
|
||||
template <size_t D> vector<D,T> redim (void) const;
|
||||
template <size_t D> vector<D,T> redim (const util::vector<D,T> &fill) const;
|
||||
|
||||
// constants
|
||||
static const vector<S,T> ZERO;
|
||||
|
||||
void sanity (void) const;
|
||||
@ -87,9 +89,9 @@ namespace util {
|
||||
template <typename T> vector<3,T> spherical_to_cartesian (const vector<3,T>&);
|
||||
template <typename T> vector<3,T> cartesian_to_spherical (const vector<3,T>&);
|
||||
|
||||
template <size_t S, typename T> vector<S,T> operator* (T, const vector<S,T>&);
|
||||
template <size_t S, typename T> vector<S,T> operator+ (T, const vector<S,T>&);
|
||||
template <size_t S, typename T> vector<S,T> operator- (T, const vector<S,T>&);
|
||||
template <size_t S, typename T, typename U> vector<S,T> operator* (U, const vector<S,T>&);
|
||||
template <size_t S, typename T, typename U> vector<S,T> operator+ (U, const vector<S,T>&);
|
||||
template <size_t S, typename T, typename U> vector<S,T> operator- (U, const vector<S,T>&);
|
||||
|
||||
// output and serialisation operators
|
||||
template <size_t S, typename T> std::ostream& operator<< (std::ostream&, const vector<S,T>&);
|
||||
|
Loading…
Reference in New Issue
Block a user