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.
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 private:
102
104 axis_{axis},
105 direction_{direction}
106 {}
107
108 CoordinateAxis axis_;
109 int8_t direction_ = 1;
110 };
111
112 // writes the `CoordinateDirection` to the ouptut stream in a human-readable form (e.g. "x", "-x")
113 std::ostream& operator<<(std::ostream&, CoordinateDirection);
114
115 // returns the equivalent `CoordinateDirection` that `cross(normalize(Vector3{x}), normalize(Vector3{y}))` would point along,
116 // or `x` if both `x` and `y` point along the same axis (i.e. have a zero cross product)
118 {
119 if (x.axis() == y.axis()) {
120 return x;
121 }
122 else if (x.axis().next() == y.axis()) {
123 return CoordinateDirection{y.axis().next(), static_cast<int8_t>(x.direction<int>()*y.direction<int>())};
124 }
125 else {
126 return CoordinateDirection{x.axis().next(), static_cast<int8_t>(-1*x.direction<int>()*y.direction<int>())};
127 }
128 }
129}
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
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:117
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
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 &)
constexpr U to(T &&value)
Definition conversion.h:56
and
Definition algorithms.h:158
constexpr CoordinateDirection cross(CoordinateDirection x, CoordinateDirection y)
Definition coordinate_direction.h:117