17template <
typename T>
struct vec3 {
23 constexpr vec3() =
default;
27 explicit constexpr vec3(U xyz) :
x(xyz),
y(xyz),
z(xyz) {}
117 return vec3(
x + p,
y + p,
z + p);
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 sqrt(dx * dx + dy * dy + dz * dz);
182 bool is_zero()
const {
return (
x == 0 &&
y == 0 &&
z == 0); }
187template <
typename T>
struct vec2 {
275 return vec2(
x + p,
y + p);
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));
327 return sqrt(dx * dx + dy * dy);
360 line_xy(T start_x, T start_y, T end_x, T end_y)
361 :
start(start_x, start_y),
end(end_x, end_y) {}
371 vec2<T> *out_projected =
nullptr)
const {
381 vec2<T> &out_proj = out_projected ? *out_projected : maybe;
382 float dx = b.
x - a.
x;
383 float dy = b.
y - a.
y;
384 float len_sq = dx * dx + dy * dy;
388 const bool is_zero = (len_sq == 0.0f);
396 return sqrt(dx * dx + dy * dy);
400 float t = ((p.
x - a.
x) * dx + (p.
y - a.
y) * dy) / len_sq;
409 out_proj.
x = a.
x +
t * dx;
410 out_proj.
y = a.
y +
t * dy;
412 dx = p.
x - out_proj.
x;
413 dy = p.
y - out_proj.
y;
414 return sqrt(dx * dx + dy * dy);
418template <
typename T>
struct rect {
425 rect(T min_x, T min_y, T max_x, T max_y)
426 :
mMin(min_x, min_y),
mMax(max_x, max_y) {}
472 return !(*
this == r);
unsigned int xy(unsigned int x, unsigned int y)
#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
vec2< float > pair_xy_float
bool equal(Iterator1 first1, Iterator1 last1, Iterator2 first2)
vec3< float > pair_xyz_float
static float distance_to_line_with_point(vec2< T > p, vec2< T > a, vec2< T > b, vec2< T > *out_projected)
line_xy(const line_xy &other)=default
line_xy & operator=(line_xy &&other) noexcept=default
line_xy(line_xy &&other) noexcept=default
float distance_to(const vec2< T > &p, vec2< T > *out_projected=nullptr) const
line_xy(const vec2< T > &start, const vec2< T > &end)
line_xy & operator=(const line_xy &other)=default
line_xy(T start_x, T start_y, T end_x, T end_y)
pair_xy(const vec2< T > &p)
bool operator==(const rect &r) const
rect(const vec2< T > &min, const vec2< T > &max)
bool operator!=(const rect< U > &r) const
rect & operator=(rect &&other) noexcept=default
rect(const rect &other)=default
void expand(const rect &r)
rect(T min_x, T min_y, T max_x, T max_y)
bool contains(const vec2< T > &p) const
void expand(const vec2< T > &p)
rect(rect &&other) noexcept=default
bool operator==(const rect< U > &r) const
rect & operator=(const rect &other)=default
bool operator!=(const rect &r) const
bool contains(const T &x, const T &y) const
bool operator==(const vec2< U > &p) const
vec2 operator/(const vec2 &p) const
vec2 operator/(const NumberT &p) const
constexpr vec2(const vec2 &p)=default
vec2 & operator/=(const u16 &d)
vec2 & operator/=(const double &f)
vec2 operator-(const NumberT &p) const
vec2 & operator/=(const float &f)
vec2 getMin(const vec2 &p) const
T distance(const vec2 &p) const
vec2 operator*(const vec2 &p) const
vec2 operator+(const NumberT &p) const
vec2 & operator=(const vec2 &p)
vec2 getMax(const vec2< U > &p) const
vec2 getMax(const vec2 &p) const
vec2 & operator/=(const vec2 &p)
constexpr vec2(vec2 &&p) noexcept=default
vec2 operator-(const vec2 &p) const
vec2 operator+(const vec2 &p) const
bool operator==(const vec2 &p) const
bool operator!=(const vec2 &p) const
vec2 & operator*=(const double &f)
vec2 & operator+=(const vec2 &p)
vec2 operator*(const NumberT &p) const
vec2 & operator=(vec2 &&p) noexcept=default
vec2 getMin(const vec2< U > &p) const
vec2 & operator-=(const vec2 &p)
vec2 & operator*=(const float &f)
vec2 operator+(const vec2< U > &p) const
vec2 & operator/=(const int &d)
bool operator!=(const vec2< U > &p) const
constexpr vec3(const vec3 &p)=default
vec3 operator-(const vec3 &p) const
vec3 getMin(const vec3 &p) const
vec3 operator+(const vec3< U > &p) const
vec3 & operator/=(const vec3 &p)
vec3 operator-(const NumberT &p) const
vec3 operator*(const vec3 &p) const
constexpr vec3(vec3 &&p) noexcept=default
constexpr vec3(T x, T y, T z)
vec3 getMax(const vec3 &p) const
vec3 & operator=(const vec3 &p)
bool operator==(const vec3< U > &p) const
bool operator!=(const vec3 &p) const
vec3 operator/(const vec3 &p) const
vec3 & operator/=(const double &f)
bool operator==(const vec3 &p) const
vec3 operator/(const NumberT &p) const
vec3 operator*(const NumberT &p) const
vec3 & operator/=(const u16 &d)
vec3 & operator*=(const double &f)
vec3 & operator/=(const int &d)
vec3 operator+(const vec3 &p) const
T distance(const vec3 &p) const
vec3 & operator*=(const float &f)
vec3 & operator/=(const float &f)
vec3 & operator-=(const vec3 &p)
vec3 operator+(const NumberT &p) const
vec3 & operator+=(const vec3 &p)
vec3 getMin(const vec3< U > &p) const
bool operator!=(const vec3< U > &p) const
vec3 & operator=(vec3 &&p) noexcept=default
vec3 getMax(const vec3< U > &p) const