55 lines
1.4 KiB
C++
55 lines
1.4 KiB
C++
#ifndef BWIDGETS_MATH_HPP
|
|
#define BWIDGETS_MATH_HPP
|
|
|
|
#include <SDL2/SDL_rect.h>
|
|
|
|
#include <basic_widgets/core/type/size.hpp>
|
|
|
|
namespace bwidgets::core
|
|
{
|
|
static inline int center_rect(int container_size, int rect_size) noexcept
|
|
{
|
|
return (container_size - rect_size) / 2;
|
|
}
|
|
|
|
static inline float distance_sqrd(const SDL_Point& a, const SDL_Point& b) noexcept
|
|
{
|
|
return (a.x - b.x) * (a.x - b.x) + (a.y - b.y) * (a.y - b.y);
|
|
}
|
|
|
|
static inline float distance(const SDL_Point& a, const SDL_Point& b) noexcept
|
|
{
|
|
return std::sqrt(distance_sqrd(a, b));
|
|
}
|
|
|
|
static inline bool rect_in_rect(const SDL_Rect outer, const SDL_Rect inner) noexcept
|
|
{
|
|
SDL_Point top_left {inner.x, inner.y};
|
|
SDL_Point bottom_right {inner.x + inner.w, inner.y + inner.h};
|
|
|
|
return
|
|
SDL_PointInRect(&top_left, &outer) &&
|
|
SDL_PointInRect(&bottom_right, &outer);
|
|
}
|
|
|
|
static inline SDL_Rect rect_margin(const SDL_Rect& r, const Size& margin) noexcept
|
|
{
|
|
return {
|
|
r.x + margin.w,
|
|
r.y + margin.h,
|
|
r.w - 2 * margin.w,
|
|
r.h - 2 * margin.h
|
|
};
|
|
}
|
|
|
|
static inline SDL_Rect rect_offset(const SDL_Rect& r, const SDL_Rect& offset) noexcept
|
|
{
|
|
return {
|
|
r.x + offset.x,
|
|
r.y + offset.y,
|
|
r.w, r.h
|
|
};
|
|
}
|
|
}
|
|
|
|
#endif
|