Files
j3ml/tests/Geometry/TriangleTests.hpp
josh 51d51a9cc7
Some checks failed
Run ReCI Build Test / Explore-Gitea-Actions (push) Failing after 1m2s
Build Docs With Doxygen / Explore-Gitea-Actions (push) Successful in 26s
Add AxisAngle members and fill out more unit tests.
2025-03-03 23:33:03 -05:00

107 lines
4.5 KiB
C++

#include <jtest/jtest.hpp>
#include <jtest/Unit.hpp>
#include <jtest/jtest.hpp>
#include <J3ML/Geometry/Triangle.hpp>
jtest::Unit TriangleUnit {"Triangle"};
namespace TriangleTests {
inline void Define()
{
using namespace jtest;
using J3ML::Geometry::Interval;
using J3ML::Geometry::Triangle;
TriangleUnit += Test("FaceNormal", [] {
Triangle t(
{-1, -1, -1},
{0, 1, 0},
{1, -1, 1}
);
jtest::check(t.FaceNormal() == Vector3{4, 0, -4});
});
TriangleUnit += Test("IntersectTriangle", []
{
Triangle xyTriangle(
{0.0f, 0.0f, 0.0f},
{1.0f, 1.0f, 0.0f},
{2.0f, 0.0f, 0.0f}
);
// Triangle collides with itself
jtest::check(Intersects(xyTriangle, xyTriangle));
// Translate 1 towards x -- should collide
jtest::check(Intersects(xyTriangle, xyTriangle.Translated(Vector3(1.0f, 0.0f, 0.0f))));
// Translate 2 towards x -- should collide exactly on V1
jtest::check(Intersects(xyTriangle, xyTriangle.Translated(Vector3(2.0f, 0.0f, 0.0f))));
// Translate 2 towards negative x -- should collide exactly on V0
jtest::check(Intersects(xyTriangle, xyTriangle.Translated(Vector3(-2.0f, 0.0f, 0.0f))));
// Translate 3 towards x -- should not collide
jtest::check(!Intersects(xyTriangle, xyTriangle.Translated(Vector3(3.0f, 0.0f, 0.0f))));
// Translate 3 towards negative x -- should not collide
jtest::check(!Intersects(xyTriangle, xyTriangle.Translated(Vector3(-3.0f, 0.0f, 0.0f))));
// Translate 1 towards z -- should not collide
jtest::check(!Intersects(xyTriangle, xyTriangle.Translated(Vector3(0.0f, 0.0f, 1.0f))));
// Triangle collides with contained smaller triangle
jtest::check(!Intersects(xyTriangle, xyTriangle.Scaled(Vector3(0.5f, 0.5f, 0.5f)).Translated(Vector3(0.25f, 0.25f, 0.0f))));
Triangle zxTriangle (
{0.0f, 0.0f, 0.0f},
{1.0f, 0.0f, 1.0f},
{0.0f, 0.0f, 2.0f}
);
// Should collide exactly on V0
//jtest::check(Intersects(xyTriangle, zxTriangle));
// Should collide across xyTriangle's edge and zxTriangle's face
//jtest::check(Intersects(xyTriangle, zxTriangle.Translated(Vector3(0.0f, 0.0f, -1.0))));
// Should collide exactly on V1
//jtest::check(Intersects(xyTriangle, zxTriangle.Translated(Vector3(0.0f, 0.0f, -2.0))));
// xyTriangle's face should be poked by zxTriangle's V0
//jtest::check(Intersects(xyTriangle, zxTriangle.Translated(Vector3(1.0f, 1.0f, 0.0f))));
// xyTriangle's face should be cut by zxTriangle
//jtest::check(Intersects(xyTriangle, zxTriangle.Translated(Vector3(1.0f, 1.0f, -0.5f))));
// Should not collide
//jtest::check(!Intersects(xyTriangle, zxTriangle.Translated(Vector3(1.0f, 1.0f, 1.0f))));
// Should not collide
//jtest::check(!Intersects(xyTriangle, zxTriangle.Translated(Vector3(0.0f, 0.0f, -3.0f))));
Triangle yxTriangle(
{0.0f, 0.0f, 0.0f},
{1.0f, 1.0f, 0.0f},
{0.0f, 2.0f, 0.0f}
);
// Should collide on V0-V1 edge
//jtest::check(Intersects(yxTriangle, yxTriangle));
// Should not collide
//jtest::check(!Intersects(xyTriangle, yxTriangle.Translated(Vector3(0.0f, 1.0f, 0.0f))));
// Should not collide
//jtest::check(!Intersects(yxTriangle, yxTriangle.Translated(Vector3(0.0f, 0.0f, 1.0f))));
Triangle zyInvertedTriangle(
{0.0f, 1.0f, -1.0f},
{0.0f, 0.0f, 0.0f},
{0.0f, 1.0f, 1.0f}
);
// Should collide exactly on V1
//jtest::check(Intersects(xyTriangle, zyInvertedTriangle));
// Should not collide
//jtest::check(!Intersects(xyTriangle, zyInvertedTriangle.Translated(Vector3(0.0f, 1.0f, 0.0f))));
// Should not collide
//jtest::check(!Intersects(xyTriangle, zyInvertedTriangle.Translated(Vector3(0.25f, 0.75f, 0.0f))));
});
}
inline void Run()
{
TriangleUnit.RunAll();
}
}