diff --git a/2d.hpp b/2d.hpp index 444f967..71eeba5 100644 --- a/2d.hpp +++ b/2d.hpp @@ -32,6 +32,7 @@ struct Circle { template struct Polygon { + static_assert(n >= 3, "Polygon must have at least 3 edges"); std::array vertex; Polygon() = delete; diff --git a/test/cases/2d.cpp b/test/cases/2d.cpp index 109d562..1eae2be 100644 --- a/test/cases/2d.cpp +++ b/test/cases/2d.cpp @@ -1,6 +1,7 @@ #include "2d.hpp" #include "test/u.hpp" #include +#include namespace { @@ -16,8 +17,35 @@ AddTestCase _(1, "2d.hpp", [](TestCase& t) { t.expectTrue([] { return Circle({1, 1}, 1.42).contain({0, 0}); }); t.expectEq([] { return Polygon<3>{{0, 0}, {1, 0}, {1, 1}}.vertex[0]; }, {0, 0}); + t.expectTrue([] { return Polygon<3>{{0, 0}, {1, 0}, {1, 1}}.contain({.1, .05}); }); t.expectFalse([] { return Polygon<3>{{0, 0}, {1, 0}, {1, 1}}.contain({.1, .2}); }); -}); + Polygon<9> pA{{-2, -2}, {-1, -2}, {2, 0}, {1, -2}, {2, -1}, {2, -3}, {3, 1}, {1, 1}, {0, 0}}; + t.expectTrue([pA] { return pA.contain({1, 0}); }); + t.expectTrue([pA] { return pA.contain({0, 0}); }); + t.expectTrue([pA] { return pA.contain({0, -1}); }); + t.expectTrue([pA] { return pA.contain({1.52, -1.26}); }); + t.expectTrue([pA] { return pA.contain({2.16, -1.9}); }); + t.expectFalse([pA] { return pA.contain({1.28, -.8}); }); + t.expectFalse([pA] { return pA.contain({1.68, -1.94}); }); + + t.expectTrue([] { return intersect(Circle({1, 1}, 2), Circle({1, 1}, 1)); }); + t.expectTrue([] { return intersect(Circle({1, 1}, 1.5), Circle({3, 1}, 1.5)); }); + t.expectFalse([] { return intersect(Circle({1, 1}, 1.5), Circle({3, 4}, 1.5)); }); + t.expectFalse([] { return intersect(Circle({0, 0}, 1.5), Circle({-3, -4}, 1.5)); }); + + t.expectTrue([] { return intersect(Circle({1, 1}, 2), Polygon<3>{{0, 0}, {2, 2}, {0, 2}}); }); + t.expectTrue([] { return intersect(Polygon<3>{{0, 0}, {2, 2}, {0, 2}}, Circle({1, 1}, 2)); }); + + t.expectTrue([] { return intersect(Circle({0, 0}, 5), Polygon<4>{{-1, -1}, {-1, 1}, {1, 1}, {1, -1}}); }); + t.expectTrue([] { return intersect(Circle({0, 0}, 1), Polygon<4>{{-1, -1}, {-1, 1}, {1, 1}, {1, -1}}); }); + t.expectTrue([] { return intersect(Circle({0, 0}, 1), Polygon<4>{{-1, -1}, {-1, 1}, {1, 1}, {1, -1}}); }); + t.expectTrue([] { return intersect(Circle({0, 0}, 1), Polygon<3>{{-1, -1}, {-1, 1}, {1, 1}}); }); + t.expectFalse([] { return intersect(Circle({0, 0}, 2), Polygon<3>{{0, -3}, {14, -3}, {0, -5}}); }); + t.expectFalse([pA] { return intersect(Circle({-1, 1}, 1.4), pA); }); + t.expectTrue([pA] { return intersect(Circle({-3, -2}, 1.2), pA); }); + t.expectTrue([pA] { return intersect(Circle({1.83649, -.07532}, .05484), pA); }); + t.expectFalse([pA] { return intersect(Circle({1.5595, -.42437}, .08794), pA); }); +}); } diff --git a/test/u.hpp b/test/u.hpp index 059c278..4c14bbb 100644 --- a/test/u.hpp +++ b/test/u.hpp @@ -117,17 +117,17 @@ private: void onPass() noexcept { ok += 1; - std::putchar('.'); + putchar('.'); } void onFail() noexcept { fail += 1; - std::putchar('F'); + putchar('F'); } void onError() noexcept { fail += 1; - std::putchar('E'); + putchar('E'); } template diff --git a/xmake.lua b/xmake.lua index e2f3b4e..b23e643 100644 --- a/xmake.lua +++ b/xmake.lua @@ -12,4 +12,5 @@ target("test") add_includedirs(".") set_optimize("none") set_symbols("debug") - add_defines("DEBUG") \ No newline at end of file + add_defines("DEBUG") + set_prefixname("test-") \ No newline at end of file