mirror of
https://github.com/orange-cpp/omath.git
synced 2026-02-13 07:03:25 +00:00
back to static
This commit is contained in:
@@ -25,15 +25,6 @@ namespace omath::collision
|
|||||||
class Epa final
|
class Epa final
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
explicit Epa(std::shared_ptr<std::pmr::memory_resource> mem_resource = {std::shared_ptr<void>{},
|
|
||||||
std::pmr::get_default_resource()},
|
|
||||||
const int max_iterations = 64, const float tolerance = 1e-4f)
|
|
||||||
: m_memory_resource(std::move(mem_resource)), m_max_iterations(max_iterations), m_tolerance(tolerance)
|
|
||||||
{
|
|
||||||
}
|
|
||||||
std::shared_ptr<std::pmr::memory_resource> m_memory_resource;
|
|
||||||
int m_max_iterations{64};
|
|
||||||
float m_tolerance{1e-4f};
|
|
||||||
using VectorType = ColliderType::VectorType;
|
using VectorType = ColliderType::VectorType;
|
||||||
static_assert(EpaVector<VectorType>, "VertexType must satisfy EpaVector concept");
|
static_assert(EpaVector<VectorType>, "VertexType must satisfy EpaVector concept");
|
||||||
|
|
||||||
@@ -55,17 +46,19 @@ namespace omath::collision
|
|||||||
|
|
||||||
// Precondition: simplex.size()==4 and contains the origin.
|
// Precondition: simplex.size()==4 and contains the origin.
|
||||||
[[nodiscard]]
|
[[nodiscard]]
|
||||||
std::optional<Result> solve(const ColliderType& a, const ColliderType& b, const Simplex<VectorType>& simplex,
|
static std::optional<Result> solve(const ColliderType& a, const ColliderType& b,
|
||||||
const Params params = {})
|
const Simplex<VectorType>& simplex, const Params params = {},
|
||||||
|
std::shared_ptr<std::pmr::memory_resource> mem_resource = {
|
||||||
|
std::shared_ptr<void>{}, std::pmr::get_default_resource()})
|
||||||
{
|
{
|
||||||
// --- Build initial polytope from simplex (4 points) ---
|
// --- Build initial polytope from simplex (4 points) ---
|
||||||
std::pmr::vector<VectorType> vertexes{m_memory_resource.get()};
|
std::pmr::vector<VectorType> vertexes{mem_resource.get()};
|
||||||
vertexes.reserve(64);
|
vertexes.reserve(64);
|
||||||
for (std::size_t i = 0; i < simplex.size(); ++i)
|
for (std::size_t i = 0; i < simplex.size(); ++i)
|
||||||
vertexes.push_back(simplex[i]);
|
vertexes.push_back(simplex[i]);
|
||||||
|
|
||||||
// Initial tetra faces (windings corrected in make_face)
|
// Initial tetra faces (windings corrected in make_face)
|
||||||
std::pmr::vector<Face> faces{m_memory_resource.get()};
|
std::pmr::vector<Face> faces{mem_resource.get()};
|
||||||
faces.reserve(128);
|
faces.reserve(128);
|
||||||
faces.emplace_back(make_face(vertexes, 0, 1, 2));
|
faces.emplace_back(make_face(vertexes, 0, 1, 2));
|
||||||
faces.emplace_back(make_face(vertexes, 0, 2, 3));
|
faces.emplace_back(make_face(vertexes, 0, 2, 3));
|
||||||
@@ -118,8 +111,8 @@ namespace omath::collision
|
|||||||
vertexes.push_back(p);
|
vertexes.push_back(p);
|
||||||
|
|
||||||
// Mark faces visible from p and collect their horizon
|
// Mark faces visible from p and collect their horizon
|
||||||
std::pmr::vector<char> to_delete(faces.size(), 0, m_memory_resource.get());
|
std::pmr::vector<char> to_delete(faces.size(), 0, mem_resource.get());
|
||||||
std::pmr::vector<Edge> boundary{m_memory_resource.get()};
|
std::pmr::vector<Edge> boundary{mem_resource.get()};
|
||||||
boundary.reserve(faces.size() * 2);
|
boundary.reserve(faces.size() * 2);
|
||||||
|
|
||||||
for (int i = 0; i < static_cast<int>(faces.size()); ++i)
|
for (int i = 0; i < static_cast<int>(faces.size()); ++i)
|
||||||
@@ -137,7 +130,7 @@ namespace omath::collision
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Remove visible faces
|
// Remove visible faces
|
||||||
std::pmr::vector<Face> new_faces{m_memory_resource.get()};
|
std::pmr::vector<Face> new_faces{mem_resource.get()};
|
||||||
new_faces.reserve(faces.size() + boundary.size());
|
new_faces.reserve(faces.size() + boundary.size());
|
||||||
for (int i = 0; i < static_cast<int>(faces.size()); ++i)
|
for (int i = 0; i < static_cast<int>(faces.size()); ++i)
|
||||||
if (!to_delete[i])
|
if (!to_delete[i])
|
||||||
|
|||||||
@@ -45,7 +45,7 @@ TEST(UnitTestEpa, TestCollisionTrue)
|
|||||||
auto pool = std::make_shared<std::pmr::monotonic_buffer_resource>(1024);
|
auto pool = std::make_shared<std::pmr::monotonic_buffer_resource>(1024);
|
||||||
params.max_iterations = 64;
|
params.max_iterations = 64;
|
||||||
params.tolerance = 1e-4f;
|
params.tolerance = 1e-4f;
|
||||||
auto epa = EPA(pool).solve(A, B, gjk.simplex, params);
|
auto epa = EPA::solve(A, B, gjk.simplex, params, pool);
|
||||||
ASSERT_TRUE(epa.has_value()) << "EPA should converge";
|
ASSERT_TRUE(epa.has_value()) << "EPA should converge";
|
||||||
|
|
||||||
// Normal is unit
|
// Normal is unit
|
||||||
@@ -119,7 +119,7 @@ TEST(UnitTestEpa, TestCollisionTrue2)
|
|||||||
params.max_iterations = 64;
|
params.max_iterations = 64;
|
||||||
params.tolerance = 1e-4f;
|
params.tolerance = 1e-4f;
|
||||||
auto pool = std::make_shared<std::pmr::monotonic_buffer_resource>(1024);
|
auto pool = std::make_shared<std::pmr::monotonic_buffer_resource>(1024);
|
||||||
auto epa = EPA(pool).solve(A, B, gjk.simplex, params);
|
auto epa = EPA::solve(A, B, gjk.simplex, params, pool);
|
||||||
ASSERT_TRUE(epa.has_value()) << "EPA should converge";
|
ASSERT_TRUE(epa.has_value()) << "EPA should converge";
|
||||||
|
|
||||||
// Normal is unit-length
|
// Normal is unit-length
|
||||||
|
|||||||
Reference in New Issue
Block a user