Skip to content

File ccd.h

File List > distance > ccd.h

Go to the documentation of this file

#pragma once
#include <muda/muda_def.h>
#include <muda/ext/geo/distance/distance_type.h>
#include <muda/ext/geo/distance/distance_unclassified.h>
#include <cmath>

//ref: https://github.com/ipc-sim/Codim-IPC/tree/main/Library/Math/Distance
namespace muda::distance
{
template <typename T, int dim>
MUDA_GENERIC bool point_edge_cd_broadphase(const Eigen::Matrix<T, dim, 1>& x0,
                                           const Eigen::Matrix<T, dim, 1>& x1,
                                           const Eigen::Matrix<T, dim, 1>& x2,
                                           T dist);

template <typename T>
MUDA_GENERIC bool point_edge_ccd_broadphase(const Eigen::Matrix<T, 2, 1>& p,
                                            const Eigen::Matrix<T, 2, 1>& e0,
                                            const Eigen::Matrix<T, 2, 1>& e1,
                                            const Eigen::Matrix<T, 2, 1>& dp,
                                            const Eigen::Matrix<T, 2, 1>& de0,
                                            const Eigen::Matrix<T, 2, 1>& de1,
                                            T                             dist);

template <typename T>
MUDA_GENERIC bool point_triangle_cd_broadphase(const Eigen::Matrix<T, 3, 1>& p,
                                               const Eigen::Matrix<T, 3, 1>& t0,
                                               const Eigen::Matrix<T, 3, 1>& t1,
                                               const Eigen::Matrix<T, 3, 1>& t2,
                                               T dist);
template <typename T>
MUDA_GENERIC bool edge_edge_cd_broadphase(const Eigen::Matrix<T, 3, 1>& ea0,
                                          const Eigen::Matrix<T, 3, 1>& ea1,
                                          const Eigen::Matrix<T, 3, 1>& eb0,
                                          const Eigen::Matrix<T, 3, 1>& eb1,
                                          T                             dist);

template <typename T>
MUDA_GENERIC bool point_triangle_ccd_broadphase(const Eigen::Matrix<T, 3, 1>& p,
                                                const Eigen::Matrix<T, 3, 1>& t0,
                                                const Eigen::Matrix<T, 3, 1>& t1,
                                                const Eigen::Matrix<T, 3, 1>& t2,
                                                const Eigen::Matrix<T, 3, 1>& dp,
                                                const Eigen::Matrix<T, 3, 1>& dt0,
                                                const Eigen::Matrix<T, 3, 1>& dt1,
                                                const Eigen::Matrix<T, 3, 1>& dt2,
                                                T dist);

template <typename T>
MUDA_GENERIC bool edge_edge_ccd_broadphase(const Eigen::Matrix<T, 3, 1>& ea0,
                                           const Eigen::Matrix<T, 3, 1>& ea1,
                                           const Eigen::Matrix<T, 3, 1>& eb0,
                                           const Eigen::Matrix<T, 3, 1>& eb1,
                                           const Eigen::Matrix<T, 3, 1>& dea0,
                                           const Eigen::Matrix<T, 3, 1>& dea1,
                                           const Eigen::Matrix<T, 3, 1>& deb0,
                                           const Eigen::Matrix<T, 3, 1>& deb1,
                                           T                             dist);

template <typename T>
MUDA_GENERIC bool point_edge_ccd_broadphase(const Eigen::Matrix<T, 3, 1>& p,
                                            const Eigen::Matrix<T, 3, 1>& e0,
                                            const Eigen::Matrix<T, 3, 1>& e1,
                                            const Eigen::Matrix<T, 3, 1>& dp,
                                            const Eigen::Matrix<T, 3, 1>& de0,
                                            const Eigen::Matrix<T, 3, 1>& de1,
                                            T                             dist);
template <typename T>
MUDA_GENERIC bool point_point_ccd_broadphase(const Eigen::Matrix<T, 3, 1>& p0,
                                             const Eigen::Matrix<T, 3, 1>& p1,
                                             const Eigen::Matrix<T, 3, 1>& dp0,
                                             const Eigen::Matrix<T, 3, 1>& dp1,
                                             T dist);

template <typename T>
MUDA_GENERIC bool point_triangle_ccd(Eigen::Matrix<T, 3, 1> p,
                                     Eigen::Matrix<T, 3, 1> t0,
                                     Eigen::Matrix<T, 3, 1> t1,
                                     Eigen::Matrix<T, 3, 1> t2,
                                     Eigen::Matrix<T, 3, 1> dp,
                                     Eigen::Matrix<T, 3, 1> dt0,
                                     Eigen::Matrix<T, 3, 1> dt1,
                                     Eigen::Matrix<T, 3, 1> dt2,
                                     T                      eta,
                                     T                      thickness,
                                     int                    max_iter,
                                     T&                     toc);

template <typename T>
MUDA_GENERIC bool edge_edge_ccd(Eigen::Matrix<T, 3, 1> ea0,
                                Eigen::Matrix<T, 3, 1> ea1,
                                Eigen::Matrix<T, 3, 1> eb0,
                                Eigen::Matrix<T, 3, 1> eb1,
                                Eigen::Matrix<T, 3, 1> dea0,
                                Eigen::Matrix<T, 3, 1> dea1,
                                Eigen::Matrix<T, 3, 1> deb0,
                                Eigen::Matrix<T, 3, 1> deb1,
                                T                      eta,
                                T                      thickness,
                                int                    max_iter,
                                T&                     toc);

template <typename T>
MUDA_GENERIC bool point_edge_ccd(const Eigen::Matrix<T, 2, 1>& x0,
                                 const Eigen::Matrix<T, 2, 1>& x1,
                                 const Eigen::Matrix<T, 2, 1>& x2,
                                 const Eigen::Matrix<T, 2, 1>& d0,
                                 const Eigen::Matrix<T, 2, 1>& d1,
                                 const Eigen::Matrix<T, 2, 1>& d2,
                                 T                             eta,
                                 T&                            toc);

template <typename T>
MUDA_GENERIC bool point_edge_ccd(Eigen::Matrix<T, 3, 1> p,
                                 Eigen::Matrix<T, 3, 1> e0,
                                 Eigen::Matrix<T, 3, 1> e1,
                                 Eigen::Matrix<T, 3, 1> dp,
                                 Eigen::Matrix<T, 3, 1> de0,
                                 Eigen::Matrix<T, 3, 1> de1,
                                 T                      eta,
                                 T                      thickness,
                                 int                    max_iter,
                                 T&                     toc);
template <typename T>
MUDA_GENERIC bool point_point_ccd(Eigen::Matrix<T, 3, 1> p0,
                                  Eigen::Matrix<T, 3, 1> p1,
                                  Eigen::Matrix<T, 3, 1> dp0,
                                  Eigen::Matrix<T, 3, 1> dp1,
                                  T                      eta,
                                  T                      thickness,
                                  int                    max_iter,
                                  T&                     toc);
}  // namespace muda

#include "details/ccd.inl"