pacman/lib/include/Position.hpp

57 lines
1.4 KiB
C++
Raw Permalink Normal View History

2021-06-10 12:42:51 +00:00
#pragma once
2020-11-27 13:10:09 +00:00
2021-09-10 09:02:37 +00:00
#include <cassert>
#include <cmath>
2021-09-10 09:41:00 +00:00
#include <limits>
2021-06-16 11:59:16 +00:00
2021-07-05 12:10:01 +00:00
namespace pacman {
2020-11-27 13:10:09 +00:00
struct Position {
2021-10-11 10:16:28 +00:00
double x = 0.0;
double y = 0.0;
2020-11-27 13:10:09 +00:00
};
2021-06-16 11:59:16 +00:00
2021-07-05 09:46:49 +00:00
struct GridPosition {
2021-09-10 09:02:37 +00:00
size_t x;
size_t y;
constexpr GridPosition(size_t x, size_t y)
: x(x),
y(y) {}
};
2021-07-06 10:35:23 +00:00
inline GridPosition positionToGridPosition(Position pos) {
2021-09-10 09:02:37 +00:00
assert(pos.x >= 0 && pos.y >= 0 && "Position should have positive values");
return { size_t(std::round(pos.x)), size_t(std::round(pos.y)) };
2021-07-06 10:35:23 +00:00
}
inline Position gridPositionToPosition(GridPosition pos) {
return { double(pos.x), double(pos.y) };
}
2021-07-06 10:35:23 +00:00
constexpr bool operator==(const GridPosition & a, const GridPosition & b) {
2021-07-05 11:54:54 +00:00
return a.x == b.x && a.y == b.y;
}
2021-07-09 08:24:24 +00:00
constexpr bool operator!=(const GridPosition & a, const GridPosition & b) {
return !(a == b);
2021-06-16 11:59:16 +00:00
}
template<typename T>
inline double positionDistance(const T & a, const T & b) {
const double first = double(a.x) - double(b.x);
const double second = double(a.y) - double(b.y);
return std::sqrt((first * first) + (second * second));
}
inline bool operator==(const Position & a, const Position & b) {
// This is ok as a test unless x and y become very large.
constexpr double epsilon = std::numeric_limits<double>::epsilon();
return std::abs(a.x - b.x) <= epsilon && std::abs(a.y - b.y) <= epsilon;
}
inline bool operator!=(const Position & a, const Position & b) {
return !(a == b);
}
2021-07-05 12:10:01 +00:00
} // namespace pacman