summaryrefslogtreecommitdiffhomepage
path: root/src/hole-cut.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/hole-cut.cpp')
-rw-r--r--src/hole-cut.cpp89
1 files changed, 53 insertions, 36 deletions
diff --git a/src/hole-cut.cpp b/src/hole-cut.cpp
index 1ecf96ce..a7736762 100644
--- a/src/hole-cut.cpp
+++ b/src/hole-cut.cpp
@@ -2,6 +2,7 @@
#include "compat/array-size.hpp"
#include "compat/iota.hpp"
#include "compat/map.hpp"
+#include "hole-cut.hpp"
//#include <mg/Functions.h>
#ifdef __GNUG__
@@ -32,7 +33,7 @@ struct coords
struct element
{
- uint8_t size;
+ uint8_t s, size;
std::array<coords, 8> array;
};
@@ -45,9 +46,9 @@ constexpr element make_element(uint8_t s)
switch (s)
{
using enum location;
- case x0|x1|y0|y1: return element{0, {{ // 9.1
+ case x0|x1|y0|y1: return element{s, 0, {{ // 9.1
}}};
- case __|__|__|__: return element{8, {{ // 14.1
+ case __|__|__|__: return element{s, 8, {{ // 14.1
{R0, H0, R0, H0},
{H0, H1, R0, H0},
{H1, R1, R0, H0},
@@ -58,62 +59,62 @@ constexpr element make_element(uint8_t s)
{H1, R1, H1, R1},
}}};
- case x0|x1|__|__: return element{2, {{ // 13.1
+ case x0|x1|__|__: return element{s, 2, {{ // 13.1
{R0, R1, R0, H0},
{R0, R1, H1, R1},
}}};
- case __|__|y0|y1: return element{2, {{ // 13.2
+ case __|__|y0|y1: return element{s, 2, {{ // 13.2
{R0, H0, R0, R1},
{H1, R1, R0, R1},
}}};
- case x0|x1|y0|__: return element{1, {{ // 12.1
+ case x0|x1|y0|__: return element{s, 1, {{ // 12.1
{R0, R1, H1, R1},
}}};
- case x0|x1|__|y1: return element{1, {{ // 12.2
+ case x0|x1|__|y1: return element{s, 1, {{ // 12.2
{R0, R1, R0, H0},
}}};
- case x0|__|y0|y1: return element{1, {{ // 12.3
+ case x0|__|y0|y1: return element{s, 1, {{ // 12.3
{H1, R1, R0, R1},
}}};
- case __|x1|y0|y1: return element{1, {{ // 12.4
+ case __|x1|y0|y1: return element{s, 1, {{ // 12.4
{R0, H0, R0, R1},
}}};
- case x0|__|__|__: return element{3, {{ // 10.1
+ case x0|__|__|__: return element{s, 3, {{ // 10.1
{R0, R1, R0, H0},
{H1, R1, H0, H1},
{R0, R1, H1, R1},
}}};
- case __|x1|__|__: return element{3, {{ // 10.2
+ case __|x1|__|__: return element{s, 3, {{ // 10.2
{R0, R1, R0, H0},
{R0, H0, H0, H1},
{R0, R1, H1, R1},
}}};
- case __|__|y0|__: return element{3, {{ // 10.3
+ case __|__|y0|__: return element{s, 3, {{ // 10.3
{R0, H0, R0, R1},
{H0, H1, H1, R1},
{H1, R1, R0, R1},
}}};
- case __|__|__|y1: return element{3, {{ // 10.4
+ case __|__|__|y1: return element{s, 3, {{ // 10.4
{R0, H0, R0, R1},
{H0, H1, R0, H0},
{H1, R1, R0, R1},
}}};
- case x0|__|y0|__: return element{2, {{ // 11.1
+ case x0|__|y0|__: return element{s, 2, {{ // 11.1
{H1, R1, R0, H1},
{R0, R1, H1, R1},
}}};
- case __|x1|y0|__: return element{2, {{ // 11.2
+ case __|x1|y0|__: return element{s, 2, {{ // 11.2
{R0, H0, R0, H1},
{R0, R1, H1, R1},
}}};
- case x0|__|__|y1: return element{2, {{ // 11.3
+ case x0|__|__|y1: return element{s, 2, {{ // 11.3
{R0, R1, R0, H0},
{H1, R1, H0, R1},
}}};
- case __|x1|__|y1: return element{2, {{ // 11.4
+ case __|x1|__|y1: return element{s, 2, {{ // 11.4
{R0, R1, R0, H0},
{R0, H0, H0, R1},
}}};
@@ -123,8 +124,6 @@ constexpr element make_element(uint8_t s)
fm_assert(false);
}
-constexpr auto elements = map(make_element, iota_array<uint8_t, 16>);
-
template<typename T>
constexpr auto get_value_from_coord(Vec2ʹ<T> r0, Vec2ʹ<T> r1, Vec2ʹ<T> h0, Vec2ʹ<T> h1, coords c)
{
@@ -141,13 +140,32 @@ template<typename T>
[[nodiscard]]
constexpr bool check_empty(Vec2ʹ<T> r0, Vec2ʹ<T> r1, Vec2ʹ<T> h0, Vec2ʹ<T> h1)
{
- bool iempty = r0.x() == r1.x() | r0.y() == r1.y();
+ //bool iempty = r0.x() == r1.x() | r0.y() == r1.y();
bool hempty = h0.x() == h1.x() | h0.y() == h1.y();
bool empty_before_x = h1.x() <= r0.x();
bool empty_after_x = h0.x() >= r1.x();
bool empty_before_y = h1.y() <= r0.y();
bool empty_after_y = h0.y() >= r1.y();
- return iempty | hempty | empty_before_x | empty_after_x | empty_before_y | empty_after_y;
+ return /*iempty |*/ hempty | empty_before_x | empty_after_x | empty_before_y | empty_after_y;
+}
+
+template<typename T>
+constexpr Cr<T> cut_rectangleʹ(Vec2ʹ<T> r0, Vec2ʹ<T> r1, Vec2ʹ<T> h0, Vec2ʹ<T> h1, uint8_t val)
+{
+ constexpr auto table = map(make_element, iota_array<uint8_t, 16>);
+
+ CORRADE_ASSUME(val < 16);
+ const auto elt = table[val];
+ const auto sz = elt.size;
+ Cr<T> res = {
+ .s = val,
+ .size = sz,
+ .array = {},
+ };
+
+ for (auto i = 0u; i < 8; i++)
+ res.array[i] = get_value_from_coord<T>(r0, r1, h0, h1, elt.array[i]);
+ return res;
}
template<typename T>
@@ -155,9 +173,9 @@ constexpr Cr<T> cut_rectangle(Vec2ʹ<T> r0, Vec2ʹ<T> r1, Vec2ʹ<T> h0, Vec2ʹ<T
{
if (check_empty<T>(r0, r1, h0, h1))
return {
- .array = {{ { r0, r1 }, }},
+ .s = (uint8_t)-1,
.size = 1,
- .found = false,
+ .array = {{ { r0, r1 }, }},
};
const bool sx = h0.x() <= r0.x();
@@ -165,18 +183,9 @@ constexpr Cr<T> cut_rectangle(Vec2ʹ<T> r0, Vec2ʹ<T> r1, Vec2ʹ<T> h0, Vec2ʹ<T
const bool sy = h0.y() <= r0.y();
const bool ey = h1.y() >= r1.y();
- auto val = uint8_t(sx << 0 | ex << 1 | sy << 2 | ey << 3);
+ const auto val = uint8_t(sx << 0 | ex << 1 | sy << 2 | ey << 3);
CORRADE_ASSUME(val < 16);
- const auto elt = elements[val];
- const auto sz = elt.size;
- Cr<T> res = {
- .array = {},
- .size = sz,
- .found = true,
- };
-
- for (auto i = 0u; i < 8; i++)
- res.array[i] = get_value_from_coord<T>(r0, r1, h0, h1, elt.array[i]);
+ const auto res = cut_rectangleʹ<T>(r0, r1, h0, h1, val);
return res;
}
@@ -199,10 +208,18 @@ constexpr Cr<T> cut_rectangle(bbox<T> input, bbox<T> hole)
} // namespace
-template<typename T> Cr<T> CutResult<T>::cut(bbox input, bbox hole) { return cut_rectangle<T>(input, hole); }
+template<typename T> Cr<T> CutResult<T>::cutʹ(Vec2 r0, Vec2 r1, Vec2 h0, Vec2 h1, uint8_t s)
+{
+ return cut_rectangleʹ<T>(r0, r1, h0, h1, s);
+}
+
+template<typename T> Cr<T> CutResult<T>::cut(bbox input, bbox hole) requires std::is_signed_v<T> { return cut_rectangle<T>(input, hole); }
template<typename T> Cr<T> CutResult<T>::cut(Vec2 r0, Vec2 r1, Vec2 h0, Vec2 h1) { return cut_rectangle<T>(r0, r1, h0, h1); }
-template struct CutResult<Int>;
+template<typename T> bool CutResult<T>::found() const { return s != (uint8_t)-1; }
+
+template struct CutResult<uint32_t>;
+template struct CutResult<int32_t>;
template struct CutResult<float>;
} // namespace floormat