summaryrefslogtreecommitdiff
path: root/test/test-maths.cpp
diff options
context:
space:
mode:
authorDan Goodliffe <dan@randomdan.homeip.net>2024-12-31 12:52:10 +0000
committerDan Goodliffe <dan@randomdan.homeip.net>2024-12-31 15:02:32 +0000
commit06e64d7ccf053dbb11547edf3ba986d096b50045 (patch)
treea5d3429e7c3af313b5fcd5d69b30e63c211fe61e /test/test-maths.cpp
parentPass lots more information during GeoData::walk (diff)
downloadilt-06e64d7ccf053dbb11547edf3ba986d096b50045.tar.bz2
ilt-06e64d7ccf053dbb11547edf3ba986d096b50045.tar.xz
ilt-06e64d7ccf053dbb11547edf3ba986d096b50045.zip
Add ArcSegment
Extends Arc, with method for determining intersection point with line segment
Diffstat (limited to 'test/test-maths.cpp')
-rw-r--r--test/test-maths.cpp31
1 files changed, 31 insertions, 0 deletions
diff --git a/test/test-maths.cpp b/test/test-maths.cpp
index 1278c44..aa2b9c8 100644
--- a/test/test-maths.cpp
+++ b/test/test-maths.cpp
@@ -375,3 +375,34 @@ BOOST_AUTO_TEST_CASE(triangle3d_helpers)
BOOST_CHECK_CLOSE(t.area(), 12.5F, 0.01F);
}
+
+using ArcLineIntersectData = std::tuple<GlobalPosition2D, GlobalPosition2D, GlobalPosition2D, GlobalPosition2D,
+ GlobalPosition2D, std::optional<GlobalPosition2D>>;
+
+BOOST_DATA_TEST_CASE(arcline_intersection,
+ boost::unit_test::data::make<ArcLineIntersectData>({
+ {{0, 0}, {0, 100}, {100, 0}, {200, 0}, {0, 200}, std::nullopt},
+ {{0, 0}, {0, 100}, {100, 0}, {0, 0}, {10, 10}, std::nullopt},
+ {{0, 0}, {0, 100}, {100, 0}, {0, 0}, {100, 100}, GlobalPosition2D {71, 71}},
+ {{15, 27}, {15, 127}, {115, 27}, {15, 27}, {115, 127}, GlobalPosition2D {86, 98}},
+ {{0, 0}, {0, 100}, {100, 0}, {0, 0}, {-100, -100}, std::nullopt},
+ {{0, 0}, {0, 100}, {100, 0}, {-10, 125}, {125, -10}, GlobalPosition2D {16, 99}},
+ {{0, 0}, {0, 100}, {100, 0}, {125, -10}, {-10, 125}, GlobalPosition2D {99, 16}},
+ {{0, 0}, {0, 100}, {100, 0}, {10, 125}, {125, -10}, GlobalPosition2D {38, 93}},
+ {{0, 0}, {0, 100}, {100, 0}, {12, 80}, {125, -10}, GlobalPosition2D {99, 10}},
+ {{0, 0}, {0, 100}, {100, 0}, {40, 80}, {125, -10}, GlobalPosition2D {98, 18}},
+ {{0, 0}, {0, 100}, {100, 0}, {40, 80}, {80, 20}, std::nullopt},
+ {{0, 0}, {0, 100}, {100, 0}, {40, 80}, {80, 80}, GlobalPosition2D {60, 80}},
+ {{0, 0}, {0, 100}, {100, 0}, {80, 40}, {80, 80}, GlobalPosition2D {80, 60}},
+ {{310002000, 490203000}, {310202000, 490203000}, {310002000, 490003000}, {310200000, 490150000},
+ {310150000, 490150000}, GlobalPosition2D {310194850, 490150000}},
+ }),
+ centre, arcStart, arcEnd, lineStart, lineEnd, intersection)
+{
+ const ArcSegment arc {centre, arcStart, arcEnd};
+ BOOST_TEST_INFO(arc.first);
+ BOOST_TEST_INFO(arc.second);
+ BOOST_TEST_INFO(arc.length());
+
+ BOOST_CHECK_EQUAL(arc.crossesLineAt(lineStart, lineEnd), intersection);
+}