opynsim
Unofficial C++ Documentation
Loading...
Searching...
No Matches
coordinate_direction.h
Go to the documentation of this file.
1#pragma once
2
6
7#include <cstdint>
8#include <iosfwd>
9#include <optional>
10#include <string_view>
11#include <type_traits>
12
13namespace osc
14{
15 // A `CoordinateAxis` plus a direction along that axis.
16 class CoordinateDirection final {
17 public:
18 // returns a `CoordinateDirection` parsed from a `std::string_view`, the format should be [direction]axis, e.g.:
19 //
20 // "-x", "+x", "x", "-X", "+X", "X", "-y", etc...
21 //
22 // returns `std::nullopt` if the input string is incorrect
23 static std::optional<CoordinateDirection> try_parse(std::string_view);
24
25 // returns a `CoordinateDirection` that represents the positive X direction
26 static constexpr CoordinateDirection x()
27 {
29 }
30
31 // returns a `CoordinateDirection` that represents the negative X direction
32 static constexpr CoordinateDirection minus_x()
33 {
35 }
36
37 // returns a `CoordinateDirection` that represents the positive Y direction
38 static constexpr CoordinateDirection y()
39 {
41 }
42
43 // returns a `CoordinateDirection` that represents the negative Y direction
44 static constexpr CoordinateDirection minus_y()
45 {
47 }
48
49 // returns a `CoordinateDirection` that represents the positive Z direction
50 static constexpr CoordinateDirection z()
51 {
53 }
54
55 // returns a `CoordinateDirection` that represents the negative Z direction
56 static constexpr CoordinateDirection minus_z()
57 {
59 }
60
61 // default-constructs a `CoordinateDirection` that points in the positive X direction
62 constexpr CoordinateDirection() = default;
63
64 // constructs a `CoordinateDirection` that points positively along `axis`
66
67 // constructs a `CoordinateDirection` that points negatively along `axis`
68 constexpr CoordinateDirection(CoordinateAxis axis, Negative) : axis_{axis}, direction_{-1} {}
69
70 // `CoordinateDirection`s are equality comparable and totally ordered as -X < +X < -Y < +Y < -Z < +Z
71 friend constexpr auto operator<=>(const CoordinateDirection&, const CoordinateDirection&) = default;
72
73 // returns the `CoordinateAxis` that this `CoordinateDirection` points along
74 constexpr CoordinateAxis axis() const { return axis_; }
75
76 // tests if the `CoordinateDirection` is pointing negatively along its axis
77 constexpr bool is_negated() const { return direction_ == -1; }
78
79 // returns T{-1} if this `CoordinateDirection` points negatively along its axis; otherwise, returns `T{1}`
80 template<typename T = float>
81 requires std::is_arithmetic_v<T> and std::is_signed_v<T>
82 constexpr T direction() const
83 {
84 return static_cast<T>(direction_);
85 }
86
87 // returns a unit-length direction vector that points in the direction stored by this `CoordinateDirection`
88 template<typename T = float>
89 requires std::is_arithmetic_v<T>
91 {
92 return Vector<T, 3>{}.with_element(axis().index(), direction<T>());
93 }
94
95 // returns a `CoordinateDirection` that points along the same `CoordinateAxis`, but with its direction negated
97 {
98 return CoordinateDirection{axis_, static_cast<int8_t>(-1 * direction_)};
99 }
100
101 // returns the index of the direction (i.e. X == 0, Y == 1, Z == 2,
102 // -X == 3, -Y == 4, -Z == 5).
103 constexpr size_t index() const
104 {
105 return axis_.index() + (direction_ < 0 ? 3 : 0);
106 }
107 private:
109
110 explicit constexpr CoordinateDirection(CoordinateAxis axis, int8_t direction) :
111 axis_{axis},
112 direction_{direction}
113 {}
114
115 CoordinateAxis axis_;
116 int8_t direction_ = 1;
117 };
118
119 // writes the `CoordinateDirection` to the ouptut stream in a human-readable form (e.g. "x", "-x")
120 std::ostream& operator<<(std::ostream&, CoordinateDirection);
121
122 // returns the equivalent `CoordinateDirection` that `cross(normalize(Vector3{x}), normalize(Vector3{y}))` would point along,
123 // or `x` if both `x` and `y` point along the same axis (i.e. have a zero cross product)
125 {
126 if (x.axis() == y.axis()) {
127 return x;
128 }
129 else if (x.axis().next() == y.axis()) {
130 return CoordinateDirection{y.axis().next(), static_cast<int8_t>(x.direction<int>()*y.direction<int>())};
131 }
132 else {
133 return CoordinateDirection{x.axis().next(), static_cast<int8_t>(-1*x.direction<int>()*y.direction<int>())};
134 }
135 }
136}
Definition coordinate_axis.h:13
static constexpr CoordinateAxis z()
Definition coordinate_axis.h:35
constexpr CoordinateAxis next() const
Definition coordinate_axis.h:68
static constexpr CoordinateAxis x()
Definition coordinate_axis.h:23
constexpr size_t index() const
Definition coordinate_axis.h:56
static constexpr CoordinateAxis y()
Definition coordinate_axis.h:29
Definition coordinate_direction.h:16
constexpr CoordinateDirection()=default
and std::is_signed_v< T > constexpr T direction() const
Definition coordinate_direction.h:82
constexpr CoordinateDirection operator-() const
Definition coordinate_direction.h:96
friend constexpr auto operator<=>(const CoordinateDirection &, const CoordinateDirection &)=default
friend constexpr CoordinateDirection cross(CoordinateDirection, CoordinateDirection)
Definition coordinate_direction.h:124
static std::optional< CoordinateDirection > try_parse(std::string_view)
constexpr CoordinateDirection(CoordinateAxis axis)
Definition coordinate_direction.h:65
static constexpr CoordinateDirection minus_y()
Definition coordinate_direction.h:44
static constexpr CoordinateDirection x()
Definition coordinate_direction.h:26
constexpr size_t index() const
Definition coordinate_direction.h:103
static constexpr CoordinateDirection z()
Definition coordinate_direction.h:50
constexpr Vector< T, 3 > direction_vector() const
Definition coordinate_direction.h:90
constexpr bool is_negated() const
Definition coordinate_direction.h:77
static constexpr CoordinateDirection minus_x()
Definition coordinate_direction.h:32
constexpr CoordinateAxis axis() const
Definition coordinate_direction.h:74
constexpr CoordinateDirection(CoordinateAxis axis, Negative)
Definition coordinate_direction.h:68
static constexpr CoordinateDirection minus_z()
Definition coordinate_direction.h:56
static constexpr CoordinateDirection y()
Definition coordinate_direction.h:38
Definition negative.h:7
Definition vector.h:63
constexpr Vector with_element(size_type pos, U value) const
Definition vector.h:351
Definition custom_decoration_generator.h:5
std::ostream & operator<<(std::ostream &, const Object &)
and
Definition algorithms.h:158
constexpr CoordinateDirection cross(CoordinateDirection x, CoordinateDirection y)
Definition coordinate_direction.h:124