mirror of
https://github.com/Redot-Engine/redot-engine.git
synced 2025-12-05 23:07:42 -05:00
Merge pull request #103993 from aaronfranke/geometry-segment
Directly use segment points in Geometry2D/3D function parameters
This commit is contained in:
@@ -261,22 +261,25 @@ TEST_CASE("[Geometry2D] Segment intersection with polygon") {
|
||||
}
|
||||
|
||||
TEST_CASE("[Geometry2D] Closest point to segment") {
|
||||
constexpr Vector2 s[] = { Vector2(-4, -4), Vector2(4, 4) };
|
||||
CHECK(Geometry2D::get_closest_point_to_segment(Vector2(4.1, 4.1), s).is_equal_approx(Vector2(4, 4)));
|
||||
CHECK(Geometry2D::get_closest_point_to_segment(Vector2(-4.1, -4.1), s).is_equal_approx(Vector2(-4, -4)));
|
||||
CHECK(Geometry2D::get_closest_point_to_segment(Vector2(-1, 1), s).is_equal_approx(Vector2(0, 0)));
|
||||
Vector2 a = Vector2(-4, -4);
|
||||
Vector2 b = Vector2(4, 4);
|
||||
CHECK(Geometry2D::get_closest_point_to_segment(Vector2(4.1, 4.1), a, b).is_equal_approx(Vector2(4, 4)));
|
||||
CHECK(Geometry2D::get_closest_point_to_segment(Vector2(-4.1, -4.1), a, b).is_equal_approx(Vector2(-4, -4)));
|
||||
CHECK(Geometry2D::get_closest_point_to_segment(Vector2(-1, 1), a, b).is_equal_approx(Vector2(0, 0)));
|
||||
|
||||
constexpr Vector2 t[] = { Vector2(1, -2), Vector2(1, -2) };
|
||||
a = Vector2(1, -2);
|
||||
b = Vector2(1, -2);
|
||||
CHECK_MESSAGE(
|
||||
Geometry2D::get_closest_point_to_segment(Vector2(-3, 4), t).is_equal_approx(Vector2(1, -2)),
|
||||
Geometry2D::get_closest_point_to_segment(Vector2(-3, 4), a, b).is_equal_approx(Vector2(1, -2)),
|
||||
"Line segment is only a single point. This point should be the closest.");
|
||||
}
|
||||
|
||||
TEST_CASE("[Geometry2D] Closest point to uncapped segment") {
|
||||
constexpr Vector2 s[] = { Vector2(-4, -4), Vector2(4, 4) };
|
||||
CHECK(Geometry2D::get_closest_point_to_segment_uncapped(Vector2(-1, 1), s).is_equal_approx(Vector2(0, 0)));
|
||||
CHECK(Geometry2D::get_closest_point_to_segment_uncapped(Vector2(-4, -6), s).is_equal_approx(Vector2(-5, -5)));
|
||||
CHECK(Geometry2D::get_closest_point_to_segment_uncapped(Vector2(4, 6), s).is_equal_approx(Vector2(5, 5)));
|
||||
constexpr Vector2 a = Vector2(-4, -4);
|
||||
constexpr Vector2 b = Vector2(4, 4);
|
||||
CHECK(Geometry2D::get_closest_point_to_segment_uncapped(Vector2(-1, 1), a, b).is_equal_approx(Vector2(0, 0)));
|
||||
CHECK(Geometry2D::get_closest_point_to_segment_uncapped(Vector2(-4, -6), a, b).is_equal_approx(Vector2(-5, -5)));
|
||||
CHECK(Geometry2D::get_closest_point_to_segment_uncapped(Vector2(4, 6), a, b).is_equal_approx(Vector2(5, 5)));
|
||||
}
|
||||
|
||||
TEST_CASE("[Geometry2D] Closest points between segments") {
|
||||
|
||||
@@ -129,8 +129,9 @@ TEST_CASE("[Geometry3D] Compute Convex Mesh Points") {
|
||||
}
|
||||
|
||||
TEST_CASE("[Geometry3D] Get Closest Point To Segment") {
|
||||
constexpr Vector3 segment[2] = { Vector3(1, 1, 1), Vector3(5, 5, 5) };
|
||||
Vector3 output = Geometry3D::get_closest_point_to_segment(Vector3(2, 1, 4), segment);
|
||||
constexpr Vector3 a = Vector3(1, 1, 1);
|
||||
constexpr Vector3 b = Vector3(5, 5, 5);
|
||||
Vector3 output = Geometry3D::get_closest_point_to_segment(Vector3(2, 1, 4), a, b);
|
||||
CHECK(output.is_equal_approx(Vector3(2.33333, 2.33333, 2.33333)));
|
||||
}
|
||||
|
||||
@@ -189,13 +190,12 @@ TEST_CASE("[Geometry3D] Triangle and Box Overlap") {
|
||||
}
|
||||
|
||||
TEST_CASE("[Geometry3D] Triangle and Sphere Intersect") {
|
||||
Vector<Vector3> triangle;
|
||||
triangle.push_back(Vector3(3, 0, 0));
|
||||
triangle.push_back(Vector3(-3, 0, 0));
|
||||
triangle.push_back(Vector3(0, 3, 0));
|
||||
constexpr Vector3 triangle_a = Vector3(3, 0, 0);
|
||||
constexpr Vector3 triangle_b = Vector3(-3, 0, 0);
|
||||
constexpr Vector3 triangle_c = Vector3(0, 3, 0);
|
||||
Vector3 triangle_contact, sphere_contact;
|
||||
CHECK(Geometry3D::triangle_sphere_intersection_test(&triangle[0], Vector3(0, -1, 0), Vector3(0, 0, 0), 5, triangle_contact, sphere_contact) == true);
|
||||
CHECK(Geometry3D::triangle_sphere_intersection_test(&triangle[0], Vector3(0, 1, 0), Vector3(0, 0, 0), 5, triangle_contact, sphere_contact) == true);
|
||||
CHECK(Geometry3D::triangle_sphere_intersection_test(&triangle[0], Vector3(0, 1, 0), Vector3(20, 0, 0), 5, triangle_contact, sphere_contact) == false);
|
||||
CHECK(Geometry3D::triangle_sphere_intersection_test(triangle_a, triangle_b, triangle_c, Vector3(0, -1, 0), Vector3(0, 0, 0), 5, triangle_contact, sphere_contact) == true);
|
||||
CHECK(Geometry3D::triangle_sphere_intersection_test(triangle_a, triangle_b, triangle_c, Vector3(0, 1, 0), Vector3(0, 0, 0), 5, triangle_contact, sphere_contact) == true);
|
||||
CHECK(Geometry3D::triangle_sphere_intersection_test(triangle_a, triangle_b, triangle_c, Vector3(0, 1, 0), Vector3(20, 0, 0), 5, triangle_contact, sphere_contact) == false);
|
||||
}
|
||||
} // namespace TestGeometry3D
|
||||
|
||||
Reference in New Issue
Block a user