#include "tap.hpp" #include "geom/sphere.hpp" using util::geom::ray2f; using util::geom::ray3f; /////////////////////////////////////////////////////////////////////////////// void test_intersect (util::TAP::logger &tap) { using util::geom::sphere3f; static const struct { float d; sphere3f s; ray3f r; const char *message; } TESTS[] = { { 1.f, { util::point3f {0.f}, 1.f }, { util::point3f {0, 2, 0}, util::vector3f {0,-1,0} }, "straight towards unit-origin sphere" }, { 0.f, { util::point3f {0}, 1.f }, { util::point3f {0,1,0}, util::vector3f {0,1,0} }, "ray origin coincides with unit-origin sphere", }, { INFINITY, { util::point3f {0}, 1 }, { util::point3f {0,2,0}, util::vector3f {0,1,0} }, "offset ray never intersects unit-origin sphere" }, { 1.f, { util::point3f {1,1,1}, 1 }, { util::point3f {2,2,1}, util::vector3f{-1,0,0} }, "glancing ray at unit distance" } }; for (const auto &[d,s,r,msg]: TESTS) { tap.expect_eq (d, distance (r, s), "%!", msg); } } /////////////////////////////////////////////////////////////////////////////// int main () { util::TAP::logger tap; test_intersect (tap); return tap.status (); }