From c0df8ede31122beb96eec01b518d588b868dcf83 Mon Sep 17 00:00:00 2001
From: Aaron Grabowy <aaron.grabowy@rwth-aachen.de>
Date: Mon, 7 Dec 2020 22:42:38 +0100
Subject: [PATCH] Added intersection tests for ellipse and pyramids

---
 extern/typed-geometry                        |  2 +-
 tests/feature/intersections/ray-intersect.cc | 15 +++++++++++++--
 tests/feature/objects/aabb.cc                |  2 +-
 tests/feature/objects/any_point.cc           |  4 ++--
 tests/feature/objects/centroid.cc            |  4 ++--
 tests/feature/objects/project.cc             |  4 ++--
 tests/feature/random/uniform.cc              |  4 ++--
 7 files changed, 23 insertions(+), 12 deletions(-)

diff --git a/extern/typed-geometry b/extern/typed-geometry
index 05a2576..674fb11 160000
--- a/extern/typed-geometry
+++ b/extern/typed-geometry
@@ -1 +1 @@
-Subproject commit 05a25760acd58e2a87d3627a2f6d3d9f40ecc95e
+Subproject commit 674fb112732a1a08d5abd237abc0f2a45580ad7f
diff --git a/tests/feature/intersections/ray-intersect.cc b/tests/feature/intersections/ray-intersect.cc
index 0c79c41..bc352d8 100644
--- a/tests/feature/intersections/ray-intersect.cc
+++ b/tests/feature/intersections/ray-intersect.cc
@@ -8,7 +8,7 @@ TG_FUZZ_TEST(TypedGeometry, Intersections)
         for (const auto& t : ts)
         {
             const auto ip = ray[t];
-            CHECK(contains(obj, ip, tolerance));
+            CHECK(contains(obj, ip, tolerance * tg::sqrt(t)));
         }
         const auto t = tg::closest_intersection_parameter(ray, obj);
         if (t.has_value())
@@ -38,7 +38,7 @@ TG_FUZZ_TEST(TypedGeometry, Intersections)
             const auto ip3 = ray[interval.end];
             CHECK(contains(obj, ip1, tolerance));
             CHECK(contains(obj, ip2, tolerance));
-            CHECK(contains(obj, ip3, tolerance));
+            CHECK(contains(obj, ip3, tolerance * tg::sqrt(interval.end)));
 
             const auto t = tg::closest_intersection_parameter(ray, obj);
             CHECK(t.has_value());
@@ -126,6 +126,7 @@ TG_FUZZ_TEST(TypedGeometry, Intersections)
     const auto pos41 = uniform(rng, range4);
 
     const auto axis0 = tg::segment3(pos30, pos31);
+    const auto disk0 = tg::sphere2in3(pos30, r, n3);
 
     const auto d1 = tg::uniform<tg::dir1>(rng);
     auto m1 = tg::mat1();
@@ -170,6 +171,10 @@ TG_FUZZ_TEST(TypedGeometry, Intersections)
     // cylinder
     test_obj_and_boundary_no_caps(ray3, tg::cylinder<3, float>(axis0, r));
     // ellipse
+    test_obj_and_boundary(ray1, tg::ellipse1(pos10, m1));
+    test_obj_and_boundary(ray2, tg::ellipse2(pos20, m2));
+    test_obj_and_boundary(ray3, tg::ellipse3(pos30, m3));
+    // TODO: ellipse4
     test_obj(ray3, tg::ellipse2in3(pos30, m23));
     // halfspace
     test_solid_obj(ray1, tg::halfspace1(n1, h));
@@ -194,6 +199,12 @@ TG_FUZZ_TEST(TypedGeometry, Intersections)
     test_obj(ray2, tg::plane2(n2, h));
     test_obj(ray3, tg::plane3(n3, h));
     test_obj(ray4, tg::plane4(n4, h));
+    // pyramid
+    test_obj_and_boundary_no_caps(ray3, tg::pyramid<tg::box2in3>(tg::box2in3(pos30, m23), h));
+    test_obj_and_boundary_no_caps(ray3, tg::pyramid<tg::sphere2in3>(disk0, h)); // == cone
+    test_obj_and_boundary_no_caps(ray3, tg::pyramid<tg::triangle3>(tg::triangle3(pos30, pos31, pos32), h));
+    test_obj(ray3, tg::pyramid_boundary_no_caps<tg::quad3>(tg::quad3(pos30, pos31, pos32, pos32 + (pos30 - pos31)), h));
+    // test_obj_and_boundary_no_caps(ray3, tg::pyramid<tg::quad3>(tg::quad3(pos30, pos31, pos32, pos32 + (pos30 - pos31)), h));
     // ray
     test_obj(ray2, tg::ray2(pos20, n2));
     // segment
diff --git a/tests/feature/objects/aabb.cc b/tests/feature/objects/aabb.cc
index 9d1e848..6836286 100644
--- a/tests/feature/objects/aabb.cc
+++ b/tests/feature/objects/aabb.cc
@@ -111,7 +111,7 @@ TG_FUZZ_TEST(TypedGeometry, ObjectAABB)
     // test_obj(p4, tg::hemisphere4(pos40, r, n4));
     // pyramid
     test_obj(tg::pyramid<tg::box2in3>(tg::box2in3(pos30, m23), h));
-    //test_obj(tg::pyramid<tg::quad3>(tg::quad3(pos30, pos31, pos32, pos32 + (pos31 - pos30)), h)); // TODO: uniform(quad) missing
+    //test_obj(tg::pyramid<tg::quad3>(tg::quad3(pos30, pos31, pos32, pos32 + (pos30 - pos31)), h)); // TODO: uniform(quad) missing
     test_obj(tg::pyramid<tg::sphere2in3>(tg::sphere2in3(pos30, r, n3), h)); // == cone
     test_obj(tg::pyramid<tg::triangle3>(tg::triangle3(pos30, pos31, pos32), h));
     // TODO: test for quad require uniform(quad)
diff --git a/tests/feature/objects/any_point.cc b/tests/feature/objects/any_point.cc
index b616a1e..00109c3 100644
--- a/tests/feature/objects/any_point.cc
+++ b/tests/feature/objects/any_point.cc
@@ -122,8 +122,8 @@ TG_FUZZ_TEST(TypedGeometry, AnyPoint)
     test_obj_and_boundary_no_caps(tg::pyramid<tg::box2in3>(tg::box2in3(pos30, m23), h));
     test_obj_and_boundary_no_caps(tg::pyramid<tg::sphere2in3>(disk0, h)); // == cone
     test_obj_and_boundary_no_caps(tg::pyramid<tg::triangle3>(tg::triangle3(pos30, pos31, pos32), h));
-    test_obj(tg::pyramid_boundary_no_caps<tg::quad3>(tg::quad3(pos30, pos31, pos32, pos32 + (pos31 - pos30)), h));
-    // test_obj_and_boundary_no_caps(tg::pyramid<tg::quad3>(tg::quad3(pos30, pos31, pos32, pos32 + (pos31 - pos30)), h));
+    test_obj(tg::pyramid_boundary_no_caps<tg::quad3>(tg::quad3(pos30, pos31, pos32, pos32 + (pos30 - pos31)), h));
+    // test_obj_and_boundary_no_caps(tg::pyramid<tg::quad3>(tg::quad3(pos30, pos31, pos32, pos32 + (pos30 - pos31)), h));
     // TODO: quad
     // test_obj(tg::quad2(pos20, pos21, pos22, pos23));
     // test_obj(tg::quad3(pos30, pos31, pos32, pos32 + (pos31 - pos30)));
diff --git a/tests/feature/objects/centroid.cc b/tests/feature/objects/centroid.cc
index 901734f..03b7055 100644
--- a/tests/feature/objects/centroid.cc
+++ b/tests/feature/objects/centroid.cc
@@ -173,8 +173,8 @@ TG_FUZZ_TEST(TypedGeometry, CentroidByUniform)
     test_obj_and_boundary_no_caps(tg::pyramid<tg::box2in3>(tg::box2in3(pos30, m23), h));
     test_obj_and_boundary_no_caps(tg::pyramid<tg::sphere2in3>(disk0, h)); // == cone
     test_obj_and_boundary_no_caps(tg::pyramid<tg::triangle3>(tg::triangle3(pos30, pos31, pos32), h));
-    // test_obj_and_boundary_no_caps(tg::pyramid<tg::quad3>(tg::quad3(pos30, pos31, pos32, pos32 + (pos31 - pos30)), h)); // TODO: area(quad) missing
-    test_obj(tg::pyramid_boundary_no_caps<tg::quad3>(tg::quad3(pos30, pos31, pos32, pos32 + (pos31 - pos30)), h));
+    // test_obj_and_boundary_no_caps(tg::pyramid<tg::quad3>(tg::quad3(pos30, pos31, pos32, pos32 + (pos30 - pos31)), h)); // TODO: area(quad) missing
+    test_obj(tg::pyramid_boundary_no_caps<tg::quad3>(tg::quad3(pos30, pos31, pos32, pos32 + (pos30 - pos31)), h));
     // TODO: quad
     // segment
     test_obj(tg::segment1(pos10, pos11));
diff --git a/tests/feature/objects/project.cc b/tests/feature/objects/project.cc
index 99ade85..72bb5d2 100644
--- a/tests/feature/objects/project.cc
+++ b/tests/feature/objects/project.cc
@@ -121,8 +121,8 @@ TG_FUZZ_TEST_MAX_ITS_MAX_CYCLES(TypedGeometry, Project, 25, 100'000'000'000)
     test_obj_and_boundary_no_caps(p3, tg::pyramid<tg::box2in3>(tg::box2in3(pos30, m23), h));
     test_obj_and_boundary_no_caps(p3, tg::pyramid<tg::sphere2in3>(disk0, h)); // == cone
     test_obj_and_boundary_no_caps(p3, tg::pyramid<tg::triangle3>(tg::triangle3(pos30, pos31, pos32), h));
-    // test_obj_and_boundary_no_caps(p3, tg::pyramid<tg::quad3>(tg::quad3(pos30, pos31, pos32, pos32 + (pos31 - pos30)), h)); // TODO: project(quad) missing
-    test_obj(p3, tg::pyramid_boundary_no_caps<tg::quad3>(tg::quad3(pos30, pos31, pos32, pos32 + (pos31 - pos30)), h));
+    // test_obj_and_boundary_no_caps(p3, tg::pyramid<tg::quad3>(tg::quad3(pos30, pos31, pos32, pos32 + (pos30 - pos31)), h)); // TODO: project(quad) missing
+    test_obj(p3, tg::pyramid_boundary_no_caps<tg::quad3>(tg::quad3(pos30, pos31, pos32, pos32 + (pos30 - pos31)), h));
     // TODO: quad
     // segment
     test_obj(p1, tg::segment1(pos10, pos11));
diff --git a/tests/feature/random/uniform.cc b/tests/feature/random/uniform.cc
index 26413c5..fbba9ec 100644
--- a/tests/feature/random/uniform.cc
+++ b/tests/feature/random/uniform.cc
@@ -152,8 +152,8 @@ TG_FUZZ_TEST_MAX_ITS(TypedGeometry, UniformGeneralProperties, 100)
     test_obj_and_boundary_no_caps(samples3, tg::pyramid<tg::box2in3>(tg::box2in3(pos30, m23), h));
     test_obj_and_boundary_no_caps(samples3, tg::pyramid<tg::sphere2in3>(disk0, h)); // == cone
     test_obj_and_boundary_no_caps(samples3, tg::pyramid<tg::triangle3>(tg::triangle3(pos30, pos31, pos32), h));
-    // test_obj_and_boundary_no_caps(samples3, tg::pyramid<tg::quad3>(tg::quad3(pos30, pos31, pos32, pos32 + (pos31 - pos30)), h)); // TODO: uniform(quad) missing
-    test_obj(samples3, tg::pyramid_boundary_no_caps<tg::quad3>(tg::quad3(pos30, pos31, pos32, pos32 + (pos31 - pos30)), h));
+    // test_obj_and_boundary_no_caps(samples3, tg::pyramid<tg::quad3>(tg::quad3(pos30, pos31, pos32, pos32 + (pos30 - pos31)), h)); // TODO: uniform(quad) missing
+    test_obj(samples3, tg::pyramid_boundary_no_caps<tg::quad3>(tg::quad3(pos30, pos31, pos32, pos32 + (pos30 - pos31)), h));
     // TODO: quad
     // segment
     test_obj(samples1, tg::segment1(pos10, pos11));
-- 
GitLab