diff --git a/src/utilities/convex_triangulation.cpp b/src/utilities/convex_triangulation.cpp index 5dd8ca969da7cbe75ec85c2cde12d2f9e2bae99e..0ff1a483c63531e6edffad392f6dded216f1a98d 100644 --- a/src/utilities/convex_triangulation.cpp +++ b/src/utilities/convex_triangulation.cpp @@ -1,4 +1,13 @@ #include <convex_triangulation.h> +#include <orientation.h> + +// filters out degenerate triangles +void appendResults(std::vector<Triangle> &results, const Triangle &t) { + if (orientation(t) == Collinear) { + return; + } + results.push_back(t); +} std::vector<Triangle> convexTriangulation(const std::vector<Point> &points, int triangleId) { const int size = points.size(); @@ -7,14 +16,19 @@ std::vector<Triangle> convexTriangulation(const std::vector<Point> &points, int } const Triangle t1 = Triangle(points[0], points[1], points[2], triangleId); - std::vector<Triangle> results = {t1}; + std::vector<Triangle> results; + + appendResults(results, t1); Point first = points[0]; for (int i = size - 1; i >= 3; i--) { - results.push_back(Triangle(first, points[2], points[i], triangleId)); + const Triangle t = Triangle(first, points[2], points[i], triangleId); + appendResults(results, t); + first = points[i]; } return results; } +