17template <
typename T>
struct vec3 {
101 return vec3(
x - p.x,
y - p.y,
z - p.z);
105 return vec3(
x + p.x,
y + p.y,
z + p.z);
109 return vec3(
x * p.x,
y * p.y,
z * p.z);
113 return vec3(
x / p.x,
y / p.y,
z / p.z);
117 return vec3(
x + p,
y + p,
z + p);
121 return vec3(
x + p.x,
y + p.y,
z + p.z);
125 return vec3(
x - p,
y - p,
z - p);
129 return vec3(
x * p,
y * p,
z * p);
140 return (
x == p.x &&
y == p.y &&
z == p.z);
144 return (
x != p.x ||
y != p.y ||
z != p.z);
148 return (
x == p.x &&
y == p.y &&
z == p.z);
152 return (
x != p.x ||
y != p.y ||
z != p.z);
164 return vec3<U>(
static_cast<U
>(
x),
static_cast<U
>(
y),
static_cast<U
>(
z));
179 return fl::sqrt(dx * dx + dy * dy + dz * dz);
187template <
typename T>
struct vec2 {
275 return vec2(
x + p,
y + p);
279 return vec2(
x + p.x,
y + p.x);
283 return vec2(
x - p,
y - p);
287 return vec2(
x * p,
y * p);
301 return (
x == p.x &&
y == p.y);
305 return (
x != p.x ||
y != p.y);
313 return vec2<U>(
static_cast<U
>(
x),
static_cast<U
>(
y));
339template <
typename T,
typename V>
struct map_range_math<T,
vec2<V>> {
342 if (in_min == in_max) {
345 T
scale = (
value - in_min) / T(in_max - in_min);
346 V dx = out_max.x - out_min.x;
347 V dy = out_max.y - out_min.y;
348 V
x = out_min.x + V(dx *
scale);
349 V
y = out_min.y + V(dy *
scale);
379 :
start(start_x, start_y),
end(end_x, end_y) {}
399 vec2<T> &out_proj = out_projected ? *out_projected : maybe;
400 float dx = b.
x - a.x;
401 float dy = b.y - a.y;
402 float len_sq = dx * dx + dy * dy;
406 const bool is_zero = (len_sq == 0.0f);
418 float t = ((p.x - a.x) * dx + (p.y - a.y) * dy) / len_sq;
427 out_proj.
x = a.x +
t * dx;
428 out_proj.
y = a.y +
t * dy;
430 dx = p.x - out_proj.
x;
431 dy = p.y - out_proj.
y;
436template <
typename T>
struct rect {
444 :
mMin(min_x, min_y),
mMax(max_x, max_y) {}
480 return (
mMin == r.mMin &&
mMax == r.mMax);
486 return (
mMin == r.mMin &&
mMax == r.mMax);
490 return !(*
this == r);
fl::UISlider scale("Scale", 4,.1, 4,.1)
unsigned int xy(unsigned int x, unsigned int y)
#define constexpr
Declares that it is possible to evaluate a value at compile time, introduced in C++11.
FL_DISABLE_WARNING_PUSH U constexpr common_type_t< T, U > min(T a, U b) FL_NOEXCEPT
constexpr int type_rank< T >::value
constexpr common_type_t< T, U > max(T a, U b) FL_NOEXCEPT
constexpr enable_if< is_fixed_point< T >::value, T >::type sqrt(T x) FL_NOEXCEPT
vec2< float > pair_xy_float
bool equal(Iterator1 first1, Iterator1 last1, Iterator2 first2) FL_NOEXCEPT
vec3< float > pair_xyz_float
Base definition for an LED controller.
#define FL_DISABLE_WARNING(warning)
#define FL_DISABLE_WARNING_IMPLICIT_INT_CONVERSION
#define FL_DISABLE_WARNING_PUSH
#define FL_DISABLE_WARNING_SIGN_CONVERSION
#define FL_DISABLE_WARNING_POP
#define FL_DISABLE_WARNING_FLOAT_CONVERSION
static float distance_to_line_with_point(vec2< T > p, vec2< T > a, vec2< T > b, vec2< T > *out_projected) FL_NOEXCEPT
line_xy() FL_NOEXCEPT=default
line_xy(const line_xy &other) FL_NOEXCEPT=default
line_xy & operator=(line_xy &&other) noexcept=default
float distance_to(const vec2< T > &p, vec2< T > *out_projected=nullptr) const FL_NOEXCEPT
line_xy(T start_x, T start_y, T end_x, T end_y) FL_NOEXCEPT
line_xy(line_xy &&other) noexcept=default
line_xy & operator=(const line_xy &other)=default
bool empty() const FL_NOEXCEPT
static vec2< V > map(T value, T in_min, T in_max, vec2< V > out_min, vec2< V > out_max) FL_NOEXCEPT
pair_xy() FL_NOEXCEPT=default
void expand(const vec2< T > &p) FL_NOEXCEPT
rect() FL_NOEXCEPT=default
bool contains(const vec2< T > &p) const FL_NOEXCEPT
void expand(T x, T y) FL_NOEXCEPT
rect & operator=(rect &&other) noexcept=default
bool empty() const FL_NOEXCEPT
rect(T min_x, T min_y, T max_x, T max_y) FL_NOEXCEPT
bool operator==(const rect< U > &r) const FL_NOEXCEPT
bool contains(const T &x, const T &y) const FL_NOEXCEPT
u16 width() const FL_NOEXCEPT
rect(rect &&other) noexcept=default
bool operator==(const rect &r) const FL_NOEXCEPT
rect(const rect &other) FL_NOEXCEPT=default
bool operator!=(const rect &r) const FL_NOEXCEPT
void expand(const rect &r) FL_NOEXCEPT
rect & operator=(const rect &other)=default
bool operator!=(const rect< U > &r) const FL_NOEXCEPT
u16 height() const FL_NOEXCEPT
vec2 & operator/=(const double &f) FL_NOEXCEPT
constexpr vec2() FL_NOEXCEPT=default
vec2 & operator/=(const u16 &d) FL_NOEXCEPT
vec2< U > cast() const FL_NOEXCEPT
vec2 operator*(const NumberT &p) const FL_NOEXCEPT
vec2 & operator/=(const float &f) FL_NOEXCEPT
bool operator==(const vec2 &p) const FL_NOEXCEPT
vec2 operator+(const vec2 &p) const FL_NOEXCEPT
constexpr vec2(const vec2 &p)=default
vec2 operator/(const vec2 &p) const FL_NOEXCEPT
vec2 operator+(const vec2< U > &p) const FL_NOEXCEPT
vec2 operator/(const NumberT &p) const FL_NOEXCEPT
vec2 getMax(const vec2 &p) const FL_NOEXCEPT
vec2 & operator*=(const double &f) FL_NOEXCEPT
vec2 & operator=(vec2 &&p) FL_NOEXCEPT=default
vec2 & operator-=(const vec2 &p) FL_NOEXCEPT
vec2 & operator/=(const int &d) FL_NOEXCEPT
vec2 operator-(const NumberT &p) const FL_NOEXCEPT
bool operator!=(const vec2< U > &p) const FL_NOEXCEPT
vec2 & operator+=(const vec2 &p) FL_NOEXCEPT
vec2 getMax(const vec2< U > &p) const FL_NOEXCEPT
T distance(const vec2 &p) const FL_NOEXCEPT
vec2 & operator*=(const float &f) FL_NOEXCEPT
bool operator==(const vec2< U > &p) const FL_NOEXCEPT
bool operator!=(const vec2 &p) const FL_NOEXCEPT
vec2 & operator=(const vec2 &p) FL_NOEXCEPT
constexpr vec2(U xy) FL_NOEXCEPT
vec2 operator+(const NumberT &p) const FL_NOEXCEPT
vec2 operator-(const vec2 &p) const FL_NOEXCEPT
vec2 getMin(const vec2 &p) const FL_NOEXCEPT
vec2 & operator/=(const vec2 &p) FL_NOEXCEPT
constexpr vec2(vec2 &&p) FL_NOEXCEPT=default
vec2 operator*(const vec2 &p) const FL_NOEXCEPT
bool is_zero() const FL_NOEXCEPT
vec2 getMin(const vec2< U > &p) const FL_NOEXCEPT
vec3 & operator/=(const float &f) FL_NOEXCEPT
constexpr vec3(const vec3 &p)=default
bool operator!=(const vec3< U > &p) const FL_NOEXCEPT
vec3 & operator/=(const u16 &d) FL_NOEXCEPT
bool operator==(const vec3< U > &p) const FL_NOEXCEPT
vec3 & operator-=(const vec3 &p) FL_NOEXCEPT
vec3 operator*(const vec3 &p) const FL_NOEXCEPT
constexpr vec3() FL_NOEXCEPT=default
vec3 & operator/=(const int &d) FL_NOEXCEPT
vec3 & operator/=(const double &f) FL_NOEXCEPT
vec3 operator+(const vec3< U > &p) const FL_NOEXCEPT
vec3 operator-(const NumberT &p) const FL_NOEXCEPT
bool is_zero() const FL_NOEXCEPT
vec3 operator+(const NumberT &p) const FL_NOEXCEPT
vec3 operator/(const vec3 &p) const FL_NOEXCEPT
vec3 getMax(const vec3< U > &p) const FL_NOEXCEPT
vec3 & operator*=(const float &f) FL_NOEXCEPT
constexpr vec3(U xyz) FL_NOEXCEPT
vec3 getMin(const vec3< U > &p) const FL_NOEXCEPT
bool operator==(const vec3 &p) const FL_NOEXCEPT
vec3 operator+(const vec3 &p) const FL_NOEXCEPT
constexpr vec3(vec3 &&p) FL_NOEXCEPT=default
vec3 operator*(const NumberT &p) const FL_NOEXCEPT
T distance(const vec3 &p) const FL_NOEXCEPT
bool operator!=(const vec3 &p) const FL_NOEXCEPT
vec3 operator/(const NumberT &p) const FL_NOEXCEPT
vec3 & operator=(const vec3 &p) FL_NOEXCEPT
vec3< U > cast() const FL_NOEXCEPT
vec3 & operator=(vec3 &&p) FL_NOEXCEPT=default
vec3 & operator*=(const double &f) FL_NOEXCEPT
vec3 & operator/=(const vec3 &p) FL_NOEXCEPT
vec3 getMin(const vec3 &p) const FL_NOEXCEPT
vec3 & operator+=(const vec3 &p) FL_NOEXCEPT
vec3 operator-(const vec3 &p) const FL_NOEXCEPT
vec3 getMax(const vec3 &p) const FL_NOEXCEPT