diff --git a/test/geometry/test_distance.cc b/test/geometry/test_distance.cc index ab8860492823f74c27852afa0780e727fe39ade4..9effe8f5ba024471159a1734243973cbc58314ba 100644 --- a/test/geometry/test_distance.cc +++ b/test/geometry/test_distance.cc @@ -35,6 +35,7 @@ #include <dumux/geometry/distance.hh> #include <dumux/geometry/normal.hh> +#include "transformation.hh" // helper function to make point geometry from field vector template<class Point, int dimWorld> @@ -127,6 +128,33 @@ void runTests() checkGeometryDistance(scale, distancePointLine(p.corner(0), segment.corner(0), segment.corner(1)), "segment-segment"); checkGeometryDistance(scale, distancePointLine(p.corner(0), segment2.corner(0), segment2.corner(1)), "segment-segment"); checkGeometryDistance(scale, distancePointLine(p.corner(0), segment3.corner(0), segment3.corner(1)), "segment-segment"); + + // check distance point-triangle + if constexpr(GlobalPosition::dimension == 3) + { + // create a triangle whose normal is aligned with (p-origin), touching the sphere + using Triangle = std::array<GlobalPosition, 3>; + auto rotationAxis = p.corner(0); rotationAxis /= rotationAxis.two_norm(); + const auto rotate1 = make3DTransformation(1.0, origin.corner(0), rotationAxis, 2.0/3.0*M_PI, /*verbose*/false); + const auto rotate2 = make3DTransformation(1.0, origin.corner(0), rotationAxis, 4.0/3.0*M_PI, /*verbose*/false); + const Triangle firstTriangle = {p.corner(0) + n, + rotate1(n) + p.corner(0), + rotate2(n) + p.corner(0)}; + checkGeometryDistance(scale, distancePointTriangle(origin.corner(0), firstTriangle[0], firstTriangle[1], firstTriangle[2]), "point-triangle"); + + // create a triangle with one edge touching the sphere + const Triangle secondTriangle = {segment.corner(0), + segment.corner(1), + 0.5*(segment.corner(0) + segment.corner(1)) + n}; + checkGeometryDistance(scale, distancePointTriangle(origin.corner(0), secondTriangle[0], secondTriangle[1], secondTriangle[2]), "point-triangle"); + checkGeometryDistance(scale, distancePointTriangle(p.corner(0), secondTriangle[0], secondTriangle[1], secondTriangle[2]), "point-triangle"); + + // create a triangle not touching the sphere + const Triangle thirdTriangle = {segment2.corner(0), + segment2.corner(1), + 0.5*(segment2.corner(0) + segment2.corner(1)) + n}; + checkGeometryDistance(sqrt(2.0)*scale, distancePointTriangle(p.corner(0), thirdTriangle[0], thirdTriangle[1], thirdTriangle[2]), "point-triangle"); + } } } }