Skip to content
Snippets Groups Projects
Commit 8877f55d authored by Brandon Lai-Cheong's avatar Brandon Lai-Cheong
Browse files

added degenerate case detection

parent 8b8700c5
No related branches found
No related tags found
No related merge requests found
......@@ -7,9 +7,15 @@
#include <intersections.h>
#include <split_triangle.h>
#include <convex_triangulation.h>
#include <orientation.h>
std::vector<Triangle> unionizeTopAndBottom(const Triangle &top, const Triangle &bot)
{
// degenerate line / point case
if (orientation(top) == Collinear) {
return {bot, top};
}
std::vector<Triangle> result;
TriangleEdges topEdges = TriangleEdges(top);
......
......@@ -41,7 +41,7 @@ std::vector<Point> contourize(const std::vector<Point> &points) {
// infinite loop detection
int seen = 0;
while (!candidates.empty()) {
while (candidates.size() > 1) {
// detect infinite loop
if (seen >= candidates.size()) {
throw ContourizeException();
......@@ -59,5 +59,7 @@ std::vector<Point> contourize(const std::vector<Point> &points) {
seen++;
}
}
result.push_back(candidates.front());
return result;
}
......@@ -39,7 +39,9 @@ INSTANTIATE_TEST_SUITE_P(EdgeUnionTests, InstantiateUnionEdgeTests, testing::Val
// Point on edge of triangle
UnionParams{Triangle({0, 0, 6}, {5, 0, 6}, {2, 3, 6}, 1), Triangle({0, 2, 3}, {0, 2, 3}, {0, 2, 3}, 2), {Triangle({0, 0, 6}, {5, 0, 6}, {2, 3, 6}, 1), Triangle({0, 2, 3}, {0, 2, 3}, {0, 2, 3}, 2)}},
// Point on vertex of triangle
UnionParams{Triangle({0, 0, 2}, {5,0,2}, {2,3,2}, 1), Triangle({0,0,0}, {0,0,0}, {0,0,0}, 2), {Triangle({0, 0, 2}, {5,0,2}, {2,3,2}, 1), Triangle({0,0,0}, {0,0,0}, {0,0,0}, 2)}}
UnionParams{Triangle({0, 0, 2}, {5,0,2}, {2,3,2}, 1), Triangle({0,0,0}, {0,0,0}, {0,0,0}, 2), {Triangle({0, 0, 2}, {5,0,2}, {2,3,2}, 1), Triangle({0,0,0}, {0,0,0}, {0,0,0}, 2)}},
// Line and Triangle
UnionParams{Triangle({0,0,5}, {5,0,5}, {2,3,5}, 1), Triangle({0,0,0}, {1,1,0}, {6,6,0}, 2), {Triangle({0,0,5}, {5,0,5}, {2,3,5}, 1), Triangle({0,0,0}, {1,1,0}, {6,6,0}, 2)}}
));
TEST(UnionEdgeTests, TriangleVertexOnEdge)
......
......@@ -63,9 +63,11 @@ TEST(UnionTests, FoldTriangleTest)
auto results = unionize(bottom, top);
std::vector<Triangle> expected_results_1 = {
Triangle({0.1, 9,1}, {1.91038, 4.23585,1}, {5,5}, 2),
Triangle({1.91038,4.23585,1}, {2.27273,4.09091,1}, {5, 5}, 2),
Triangle({0,5}, {3,2}, {5,3}, 1)
Triangle({0, 5,3}, {2.6129, 2.3871,3}, {1.91038,4.23585,3}, 1),
Triangle({3, 2,3}, {5, 3,3}, {2.27273,4.09091,3}, 1),
Triangle({3,2,3}, {2.27273,4.09091,3}, {2.6129,2.3871,3}, 1),
Triangle({2.6129,2.3871,3}, {2.27273,4.09091,3}, {2,4,3}, 1),
Triangle({0.1,9,1}, {2,4,1}, {5,5,1}, 2)
};
EXPECT_EQ(results, expected_results_1);
......@@ -75,10 +77,10 @@ TEST(UnionTests, FoldTriangleTest)
results = unionize(bottom, top);
std::vector<Triangle> expected_results_2 = {
Triangle({0,5}, {2.6129, 2.3871}, {1.91038, 4.23585}, 1),
Triangle({3,2}, {5, 3}, {2.6129, 2.3871}, 1),
Triangle({5,3}, {2.27273, 4.09091}, {2.6129, 2.3871}, 1),
Triangle({2.27273,4.09091}, {2, 4}, {2.6129, 2.3871}, 1),
Triangle({0,5, 3}, {2.6129, 2.3871, 3}, {1.91038, 4.23585, 3}, 1),
Triangle({3,2, 3}, {5, 3, 3}, {2.6129, 2.3871, 3}, 1),
Triangle({5,3, 3}, {2.27273, 4.09091, 3}, {2.6129, 2.3871, 3}, 1),
Triangle({2.27273,4.09091, 3}, {2, 4, 3}, {2.6129, 2.3871, 3}, 1),
Triangle({0.1,9}, {2, 4}, {5, 5}, 2)
};
......
......@@ -12,6 +12,11 @@ TEST(ContourizeTest, Simple) {
EXPECT_EQ(result, expected);
}
TEST (ContourizeTest, Collinear) {
std::vector<Point> points {{2,3,5}, {0,0,5}, {2.5,2.5,5}, {-0,0,5}};
auto result = contourize(points);
}
TEST(ContourizeTest, Triangle) {
std::vector<Point> points{{3,1}, {4,1}, {3.33333, 1.6666}};
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment