# HG changeset patch # User Teemu Piippo # Date 1681119649 -10800 # Node ID 57de8fab22371f56755e8759bddce05f0fd9f759 # Parent 9444de9762c30a58578f4c15f85803b16b331bc3 isConvex renamed to quadrilateral_convexity, refactor, now returns an enum instead of bool diff -r 9444de9762c3 -r 57de8fab2237 src/geometry.cpp --- a/src/geometry.cpp Sun Apr 09 17:05:40 2023 +0300 +++ b/src/geometry.cpp Mon Apr 10 12:40:49 2023 +0300 @@ -198,23 +198,33 @@ }; } -bool isConvex(const Quadrilateral& quad) +static convexity_e determine_convexity(const glm::vec3* begin, const glm::vec3* end) { - glm::vec3 crosses[4] = { + auto test_concave_dot_product = [begin](const glm::vec3& vector) { + return glm::dot(*begin, vector) < 1e-6; + }; + if (std::any_of(begin + 1, end, test_concave_dot_product)) + { + return convexity_e::concave; + } + else + { + return convexity_e::convex; + } +} + +convexity_e quadrilateral_convexity(const Quadrilateral& quad) +{ + const glm::vec3 crosses[4] = { glm::cross(quad.p4 - quad.p1, quad.p2 - quad.p1), glm::cross(quad.p1 - quad.p2, quad.p3 - quad.p2), glm::cross(quad.p2 - quad.p3, quad.p4 - quad.p3), glm::cross(quad.p3 - quad.p4, quad.p1 - quad.p4), }; - return not std::any_of( - &crosses[1], - &crosses[4], - [&crosses](const glm::vec3& vector) { - return glm::dot(crosses[0], vector) < 1e-6; - }); + return determine_convexity(&crosses[0], &crosses[4]); } -bool isConvex(const std::vector& polygon) +convexity_e polygon_convexity(const std::vector& polygon) { const std::size_t n = polygon.size(); std::vector crosses; @@ -226,13 +236,7 @@ const glm::vec3 v3 = polygon[(i + 1) % n]; crosses[i] = glm::cross(v1 - v2, v3 - v2); } - return not std::any_of( - crosses.begin() + 1, - crosses.end(), - [&crosses](const glm::vec3& vector) - { - return glm::dot(crosses[0], vector) < 1e-6; - }); + return determine_convexity(&crosses[0], &crosses[n]); } /** diff -r 9444de9762c3 -r 57de8fab2237 src/geometry.h --- a/src/geometry.h Sun Apr 09 17:05:40 2023 +0300 +++ b/src/geometry.h Mon Apr 10 12:40:49 2023 +0300 @@ -138,8 +138,9 @@ LineSegment2D bottom(const QRectF& rectangle); LineSegment2D left(const QRectF& rectangle); LineSegment2D right(const QRectF& rectangle); -bool isConvex(const Quadrilateral& quad); -bool isConvex(const std::vector& polygon); +enum class convexity_e { concave, convex }; +convexity_e quadrilateral_convexity(const Quadrilateral& quad); +convexity_e polygon_convexity(const std::vector& polygon); Winding winding(const QPolygonF& polygon); struct ScalingExtract { diff -r 9444de9762c3 -r 57de8fab2237 src/triangulate.cpp --- a/src/triangulate.cpp Sun Apr 09 17:05:40 2023 +0300 +++ b/src/triangulate.cpp Mon Apr 10 12:40:49 2023 +0300 @@ -96,7 +96,7 @@ *(polyBegin + shared_boundary.second), *(polyBegin + earcut_triangle_1.third_vertex), }; - if (isConvex(quad)) { + if (quadrilateral_convexity(quad) == convexity_e::convex) { result.quadrilaterals.push_back(quad); result.cutTriangles.insert(earcut_triangle_1.triangleid); result.cutTriangles.insert(earcut_triangle_2.triangleid);