diff --git a/lib/include/artist/point.hpp b/lib/include/artist/point.hpp index 06f295f..49cd138 100755 --- a/lib/include/artist/point.hpp +++ b/lib/include/artist/point.hpp @@ -8,6 +8,16 @@ namespace cycfi::artist { + //////////////////////////////////////////////////////////////////////////// + // Axis + //////////////////////////////////////////////////////////////////////////// + enum class axis : bool { x = false, y = true}; + + inline constexpr axis other(axis a) + { + return axis(! bool(a)); + } + //////////////////////////////////////////////////////////////////////////// // Points //////////////////////////////////////////////////////////////////////////// @@ -25,6 +35,9 @@ namespace cycfi::artist constexpr point move_to(float x, float y) const; constexpr point reflect(point p) const; + constexpr float& operator[](axis a); + constexpr float operator[](axis a) const; + float x; float y; }; @@ -86,6 +99,16 @@ namespace cycfi::artist { return {x + (x - p.x), y + (y - p.y)}; } + + constexpr float& point::operator[](axis a) + { + return a==axis::x ? x : y; + } + + constexpr float point::operator[](axis a) const + { + return a==axis::x ? x : y; + } } #endif diff --git a/lib/include/artist/rect.hpp b/lib/include/artist/rect.hpp index f810710..8df5433 100755 --- a/lib/include/artist/rect.hpp +++ b/lib/include/artist/rect.hpp @@ -242,6 +242,41 @@ namespace cycfi::artist r.right = 0.0; r.bottom = 0.0; } + + inline constexpr float axis_extent(rect const &r, axis a) + { + return a == axis::x ? r.width() : r.height(); + } + + inline constexpr float axis_min(rect const &r, axis a) + { + return a == axis::x ? r.left : r.top; + } + + inline constexpr float axis_max(rect const &r, axis a) + { + return a == axis::x ? r.right : r.bottom; + } + + inline constexpr float& axis_min(rect &r, axis a) + { + return a == axis::x ? r.left : r.top; + } + + inline constexpr float& axis_max(rect &r, axis a) + { + return a == axis::x ? r.right : r.bottom; + } + + inline constexpr auto make_rect(axis a, float this_axis_min, float other_axis_min, float this_axis_max, float other_axis_max) -> rect + { + if (a == axis::x) { + return rect(this_axis_min, other_axis_min, this_axis_max, other_axis_max); + } + else { + return rect(other_axis_min, this_axis_min, other_axis_max, this_axis_max); + } + } } #endif