You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
63 lines
2.0 KiB
63 lines
2.0 KiB
#include "is_self_intersecting.h"
|
|
#include "../../find.h"
|
|
#include "../../doublearea.h"
|
|
#include "../../remove_unreferenced.h"
|
|
#include "RemeshSelfIntersectionsParam.h"
|
|
#include "remesh_self_intersections.h"
|
|
#include "../../collapse_edge.h"
|
|
|
|
template <
|
|
typename DerivedV,
|
|
typename DerivedF>
|
|
bool igl::copyleft::cgal::is_self_intersecting(
|
|
const Eigen::PlainObjectBase<DerivedV> & V,
|
|
const Eigen::PlainObjectBase<DerivedF> & F)
|
|
{
|
|
assert(V.cols() == 3);
|
|
assert(F.cols() == 3);
|
|
using MatrixV = Eigen::Matrix<typename DerivedV::Scalar, Eigen::Dynamic, 3>;
|
|
using MatrixF = Eigen::Matrix<typename DerivedF::Scalar, Eigen::Dynamic, 3>;
|
|
const auto valid =
|
|
igl::find((F.array() != IGL_COLLAPSE_EDGE_NULL).rowwise().any().eval());
|
|
// Extract only the valid faces
|
|
MatrixF FF = F(valid, Eigen::all);
|
|
// Remove unreferneced vertices
|
|
MatrixV VV;
|
|
{
|
|
Eigen::VectorXi I;
|
|
igl::remove_unreferenced(V,MatrixF(FF),VV,FF,I);
|
|
}
|
|
Eigen::Matrix<typename DerivedV::Scalar,Eigen::Dynamic,1> A;
|
|
igl::doublearea(VV,FF,A);
|
|
if(A.minCoeff() <= 0)
|
|
{
|
|
return true;
|
|
}
|
|
if(
|
|
(FF.array().col(0) == FF.array().col(1)).any() ||
|
|
(FF.array().col(1) == FF.array().col(2)).any() ||
|
|
(FF.array().col(2) == FF.array().col(0)).any())
|
|
|
|
{
|
|
return true;
|
|
}
|
|
|
|
// check for self-intersections VV,FF
|
|
igl::copyleft::cgal::RemeshSelfIntersectionsParam params;
|
|
params.detect_only = true;
|
|
params.first_only = true;
|
|
Eigen::MatrixXi IF;
|
|
Eigen::VectorXi J,IM;
|
|
{
|
|
MatrixV tempV;
|
|
MatrixF tempF;
|
|
igl::copyleft::cgal::remesh_self_intersections(
|
|
V,F,params,tempV,tempF,IF,J,IM);
|
|
}
|
|
return IF.rows() > 0;
|
|
}
|
|
|
|
#ifdef IGL_STATIC_LIBRARY
|
|
// Explicit template specialization
|
|
template bool igl::copyleft::cgal::is_self_intersecting<Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, -1, 0, -1, -1> >(Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> > const&);
|
|
#endif
|
|
|