header_utils
Loading...
Searching...
No Matches
direction.h
1
4
5#pragma once
6
7#include "geometry_common.h"
8
9#include <numbers>
10
11namespace ghassanpl::geometry
12{
13 enum class direction
14 {
15 none = -1,
16
17 right = 0,
18 right_down,
19 down,
20 left_down,
21 left,
22 left_up,
23 up,
24 right_up,
25
26 east = 0,
27 south_east,
28 south,
29 south_west,
30 west,
31 north_west,
32 north,
33 north_east
34 };
35
36 static constexpr auto direction_count = 8;
37
39
41
42 namespace detail
43 {
44 static constexpr const int direction_value[] = { 1, 1, 0, -1, -1, -1, 0, 1 };
45 }
46
47 constexpr direction operator+(direction dir, int d) { return (direction)((int(dir) + d) % 8); }
48 constexpr direction operator-(direction dir, int d) { return (direction)((int(dir) + (8 + (d % 8))) % 8); }
49
50 constexpr direction& operator++(direction& dir) { return dir = dir + 1; }
51 constexpr direction& operator--(direction& dir) { return dir = dir + 7; }
52
53 constexpr direction operator++(direction& dir, int) { auto res = dir; ++dir; return res; }
54 constexpr direction operator--(direction& dir, int) { auto res = dir; --dir; return res; }
55
56 constexpr direction opposite(direction dir) { return dir + 4; }
57 constexpr direction next_cardinal(direction dir) { return direction(int(dir) & (~1)) + 2; }
58 constexpr direction prev_cardinal(direction dir) { return direction(int(dir) & (~1)) + 6; }
59
60 constexpr inline static direction_set all_cardinal_directions{ direction::left, direction::right, direction::up, direction::down };
61 constexpr inline static direction_set all_diagonal_directions{ direction::left_up, direction::right_up, direction::right_down, direction::left_down };
62 constexpr inline static direction_set all_directions{ direction::left, direction::right, direction::up, direction::down, direction::left_up, direction::right_up, direction::right_down, direction::left_down };
63
64 constexpr bool is_valid(direction dir) { return int(dir) >= 0 && int(dir) <= 7; }
65 constexpr bool is_cardinal(direction dir) { return (int(dir) & 1) == 0; }
66 constexpr bool is_diagonal(direction dir) { return (int(dir) & 1) != 0; }
67
68 constexpr int horizontal(direction dir) { return detail::direction_value[(int)dir]; }
69 constexpr int vertical(direction dir) { return detail::direction_value[int(dir + 6)]; }
70
71 constexpr degrees to_angle(direction val)
72 {
73 return degrees{ (float(val) * 45.0f) };
74 }
75
79
80 constexpr glm::ivec2 to_ivec(direction val) { return { horizontal(val), vertical(val) }; }
81 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; }
82
83 constexpr ghassanpl::align to_alignment(direction val);
84
88
89 inline direction to_direction(degrees angle)
90 {
91 return direction(int(glm::mod(angle.get() + (45.0 / 2.0), 360.0) / 45.0) % 8);
92 }
93
94 inline direction to_direction(glm::vec2 val);
95 inline direction to_direction(glm::ivec2 vec)
96 {
97 constexpr const int vec_value[] = { 5, 6, 7, 4, -1, 0, 3, 2, 1 };
98 return (direction)vec_value[glm::sign(vec.x) + glm::sign(vec.y) * 3 + 4];
99 }
100
101}
align
Represents an alignment in both axes (horizontal and veritcal)
Definition align.h:47
constexpr auto bit_count
Equal to the number of bits in the type.
Definition bits.h:33
The below code is based on Sun's libm library code, which is licensed under the following license:
enum_flags< direction, uint8_t > direction_set
TODO: names, compass name.
Definition direction.h:40
A (constexpr) value struct that represents a set of bits mapped to an enum (implemented as a bitset)
Definition enum_flags.h:29