From 54ee39ffd75421c4489d2b473de4a65ff541f21c Mon Sep 17 00:00:00 2001
From: Dan Goodliffe <dan@randomdan.homeip.net>
Date: Mon, 29 Aug 2022 19:57:43 +0100
Subject: Ray function a calculate how close it passes to a line defined by 2
 points

---
 test/test-maths.cpp | 29 +++++++++++++++++++++++++++++
 1 file changed, 29 insertions(+)

(limited to 'test')

diff --git a/test/test-maths.cpp b/test/test-maths.cpp
index 1f2a096..70cf206 100644
--- a/test/test-maths.cpp
+++ b/test/test-maths.cpp
@@ -287,3 +287,32 @@ BOOST_AUTO_TEST_CASE(camera_clicks)
 	BOOST_CHECK_CLOSE_VEC(camera.unProject({right, centre}).direction, glm::normalize(::north));
 	BOOST_CHECK_CLOSE_VEC(camera.unProject({left, centre}).direction, glm::normalize(::west));
 }
+
+template<typename T = float>
+auto
+n_test_points_between(std::size_t n = 2, T min = -100.F, T max = 100.F)
+{
+	return boost::unit_test::data::xrange(n) ^ boost::unit_test::data::random(min, max);
+}
+
+BOOST_DATA_TEST_CASE(rayLineDistance,
+		n_test_points_between() * // n1x
+				n_test_points_between() * // n1y
+				n_test_points_between() * // n1z
+				n_test_points_between() * // n2x
+				n_test_points_between() * // n2y
+				n_test_points_between() * // n2z
+				n_test_points_between() * // cx
+				n_test_points_between() * // cy
+				n_test_points_between(), // cz
+		i1, n1x, i2, n1y, i3, n1z, i4, n2x, i5, n2y, i6, n2z, i7, cx, i8, cy, i9, cz)
+{
+	const glm::vec3 n1 {n1x, n1y, n1z}, n2 {n2x, n2y, n2z}, c {cx, cy, cz};
+
+	const auto nstep = n2 - n1;
+	for (float along = 0.2F; along <= 0.8F; along += 0.1F) {
+		const auto target = n1 + (along * nstep);
+		const auto direction = glm::normalize(target - c);
+		BOOST_CHECK_LE(Ray(c, direction).distanceToLine(n1, n2), 0.01F);
+	}
+}
-- 
cgit v1.2.3