7#include "geometry_common.h"
42 static constexpr auto direction_count = 8;
44 using direction_set = enum_flags<direction, uint8_t>;
48 static constexpr const int direction_value[] = { 1, 1, 0, -1, -1, -1, 0, 1 };
51 constexpr direction operator+(direction dir,
int d) {
return (direction)((int(dir) + d) % 8); }
52 constexpr direction operator-(direction dir,
int d) {
return (direction)((int(dir) + (8 + (d % 8))) % 8); }
54 constexpr direction& operator++(direction& dir) {
return dir = dir + 1; }
55 constexpr direction& operator--(direction& dir) {
return dir = dir + 7; }
57 constexpr direction operator++(direction& dir,
int) {
auto res = dir; ++dir;
return res; }
58 constexpr direction operator--(direction& dir,
int) {
auto res = dir; --dir;
return res; }
60 constexpr direction opposite(direction dir) {
return dir + 4; }
61 constexpr direction next_cardinal(direction dir) {
return direction(
int(dir) & (~1)) + 2; }
62 constexpr direction prev_cardinal(direction dir) {
return direction(
int(dir + 1) & (~1)) + 6; }
64 constexpr inline direction_set all_cardinal_directions{ direction::left, direction::right, direction::up, direction::down };
65 constexpr inline direction_set all_diagonal_directions{ direction::left_up, direction::right_up, direction::right_down, direction::left_down };
66 constexpr inline direction_set all_directions{ direction::left, direction::right, direction::up, direction::down, direction::left_up, direction::right_up, direction::right_down, direction::left_down };
72 constexpr inline const char* cardinal_directions[] = {
"east",
"south",
"west",
"north" };
73 constexpr inline const char* diagonal_directions[] = {
"south east",
"south west",
"north west",
"north east" };
74 constexpr inline const char* all_directions[] = {
"east",
"south east",
"south",
"south west",
"west",
"north west",
"north",
"north east" };
77 constexpr inline const char* cardinal_directions[] = {
"right",
"down",
"left",
"up" };
78 constexpr inline const char* diagonal_directions[] = {
"right down",
"left down",
"left up",
"right up" };
79 constexpr inline const char* all_directions[] = {
"right",
"right down",
"down",
"left down",
"left",
"left up",
"up",
"right up" };
82 constexpr const char* to_name(direction dir) {
return names::all_directions[int(dir)]; }
83 constexpr const char* to_compass_name(direction dir) {
return names::compass::all_directions[int(dir)]; }
85 constexpr bool is_valid(direction dir) {
return int(dir) >= 0 && int(dir) <= 7; }
86 constexpr bool is_cardinal(direction dir) {
return (
int(dir) & 1) == 0; }
87 constexpr bool is_diagonal(direction dir) {
return (
int(dir) & 1) != 0; }
92 if (is_cardinal(dir))
return { dir };
93 return { next_cardinal(dir), prev_cardinal(dir) };
97 constexpr int horizontal(direction dir) {
return detail::direction_value[(int)dir]; }
100 constexpr int vertical(direction dir) {
return detail::direction_value[int(dir + 6)]; }
102 constexpr degrees to_angle(direction val)
104 return degrees{ (float(val) * 45.0f) };
111 constexpr glm::ivec2 to_ivec(direction val) {
return {
horizontal(val),
vertical(val) }; }
112 constexpr glm::vec2 to_vec(direction val) {
const glm::vec2 d = to_ivec(val);
return is_diagonal(val) ? d * std::numbers::sqrt2_v<float> : d; }
114 constexpr align to_alignment(direction val)
126 default:
return align::center;
130 constexpr direction to_direction(
align val)
142 default:
return direction::none;
146 constexpr direction to_direction(degrees angle)
148 return direction(
int(cem::fmod(angle.get() + (45.0 / 2.0), 360.0) / 45.0) % 8);
151 constexpr direction to_direction(glm::vec2 val)
153 return to_direction(geometry::angles::ensure_positive(degrees{ glm::degrees(glm::atan(val.y, val.x)) }));
156 constexpr direction to_direction(glm::ivec2 vec)
158 constexpr const int vec_value[] = { 5, 6, 7, 4, -1, 0, 3, 2, 1 };
159 return (direction)vec_value[glm::sign(vec.x) + glm::sign(vec.y) * 3 + 4];
align
Represents an alignment in both axes (horizontal and veritcal).
@ bottom_center
Bottom center.
@ bottom_left
Bottom left.
@ middle_left
Middle left.
@ bottom_right
Bottom right.
@ middle_right
Middle right.
constexpr direction_set to_cardinal_set(direction dir)
Turns a diagonal direction into a set of cardinals (e.g. to_cardinal_set(north_west) -> direction_set...
constexpr int horizontal(direction dir)
Returns the horizontal offset (-1, 0, or 1) of dir.
constexpr int vertical(direction dir)
Returns the vertical offset (-1, 0, or 1) of dir.