Add triangle SAT intersection
This commit is contained in:
89
tests/Geometry/TriangleTests.cpp
Normal file
89
tests/Geometry/TriangleTests.cpp
Normal file
@@ -0,0 +1,89 @@
|
||||
#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);
|
||||
}
|
||||
|
Reference in New Issue
Block a user