pacman/lib/include/Position.hpp

48 lines
1.1 KiB
C++
Raw Normal View History

2021-06-10 12:42:51 +00:00
#pragma once
2020-11-27 13:10:09 +00:00
2021-07-08 14:57:18 +00:00
#include <cmath>
2021-09-10 09:02:37 +00:00
#include <cassert>
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-08-02 14:43:18 +00:00
double x = 0;
double y = 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
}
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