Files
j3ml/tests/Geometry/TriangleTests.cpp
2024-05-08 09:23:20 -04:00

90 lines
3.6 KiB
C++

#include <gtest/gtest.h>
#include <J3ML/Geometry/Triangle.h>
using J3ML::Geometry::Interval;
using J3ML::Geometry::Triangle;
TEST(TriangleTests, FaceNormal)
{
Triangle t{
Vector3{-1, -1, -1},
Vector3{0, 1, 0},
Vector3{1, -1, 1}
};
EXPECT_EQ(t.FaceNormal(), (Vector3{4, 0, -4}));
}
TEST(TriangleTests, 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
EXPECT_EQ(Intersects(xyTriangle, xyTriangle), true);
// Translate 1 towards x -- should collide
EXPECT_EQ(Intersects(xyTriangle, xyTriangle.Translated(Vector3(1.0f, 0.0f, 0.0f))), true);
// Translate 2 towards x -- should collide exactly on V1
EXPECT_EQ(Intersects(xyTriangle, xyTriangle.Translated(Vector3(2.0f, 0.0f, 0.0f))), true);
// Translate 2 towards negative x -- should collide exactly on V0
EXPECT_EQ(Intersects(xyTriangle, xyTriangle.Translated(Vector3(-2.0f, 0.0f, 0.0f))), true);
// Translate 3 towards x -- should not collide
EXPECT_EQ(Intersects(xyTriangle, xyTriangle.Translated(Vector3(3.0f, 0.0f, 0.0f))), false);
// Translate 3 towards negative x -- should not collide
EXPECT_EQ(Intersects(xyTriangle, xyTriangle.Translated(Vector3(-3.0f, 0.0f, 0.0f))), false);
// Translate 1 towards z -- should not collide
EXPECT_EQ(Intersects(xyTriangle, xyTriangle.Translated(Vector3(0.0f, 0.0f, 1.0f))), false);
// Triangle collides with contained smaller triangle
EXPECT_EQ(Intersects(xyTriangle, xyTriangle.Scaled(Vector3(0.5f, 0.5f, 0.5f)).Translated(Vector3(0.25f, 0.25f, 0.0f))), true);
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
EXPECT_EQ(Intersects(xyTriangle, zxTriangle), true);
// Should collide across xyTriangle's edge and zxTriangle's face
EXPECT_EQ(Intersects(xyTriangle, zxTriangle.Translated(Vector3(0.0f, 0.0f, -1.0))), true);
// Should collide exactly on V1
EXPECT_EQ(Intersects(xyTriangle, zxTriangle.Translated(Vector3(0.0f, 0.0f, -2.0))), true);
// xyTriangle's face should be poked by zxTriangle's V0
EXPECT_EQ(Intersects(xyTriangle, zxTriangle.Translated(Vector3(1.0f, 1.0f, 0.0f))), true);
// xyTriangle's face should be cut by zxTriangle
EXPECT_EQ(Intersects(xyTriangle, zxTriangle.Translated(Vector3(1.0f, 1.0f, -0.5f))), true);
// Should not collide
EXPECT_EQ(Intersects(xyTriangle, zxTriangle.Translated(Vector3(1.0f, 1.0f, 1.0f))), false);
// Should not collide
EXPECT_EQ(Intersects(xyTriangle, zxTriangle.Translated(Vector3(0.0f, 0.0f, -3.0f))), false);
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
EXPECT_EQ(Intersects(yxTriangle, yxTriangle), true);
// Should not collide
EXPECT_EQ(Intersects(xyTriangle, yxTriangle.Translated(Vector3(0.0f, 1.0f, 0.0f))), false);
// Should not collide
EXPECT_EQ(Intersects(yxTriangle, yxTriangle.Translated(Vector3(0.0f, 0.0f, 1.0f))), false);
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
EXPECT_EQ(Intersects(xyTriangle, zyInvertedTriangle), true);
// Should not collide
EXPECT_EQ(Intersects(xyTriangle, zyInvertedTriangle.Translated(Vector3(0.0f, 1.0f, 0.0f))), false);
// Should not collide
EXPECT_EQ(Intersects(xyTriangle, zyInvertedTriangle.Translated(Vector3(0.25f, 0.75f, 0.0f))), false);
}