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.
103 lines
2.6 KiB
103 lines
2.6 KiB
#ifdef IGL_STATIC_LIBRARY
|
|
#undef IGL_STATIC_LIBRARY
|
|
#endif
|
|
|
|
#include <test_common.h>
|
|
#include <igl/delaunay_triangulation.h>
|
|
|
|
namespace git_issue {
|
|
|
|
constexpr static double EPSILON_LENGTH = 0.0005; // Sketchup support 1/1000 precision
|
|
constexpr static double EPSILON_ANGLE = 0.0000000000005;
|
|
constexpr static double INV_EPSILON_LENGTH = 2000.0;
|
|
|
|
template<typename T>
|
|
inline int orient2d(const T &pa, const T &pb, const T &pc) {
|
|
double acx, bcx, acy, bcy;
|
|
acx = pa[0] - pc[0];
|
|
bcx = pb[0] - pc[0];
|
|
acy = pa[1] - pc[1];
|
|
bcy = pb[1] - pc[1];
|
|
|
|
double val = acx * bcy - acy * bcx;
|
|
if (val < -EPSILON_LENGTH) {
|
|
return -1;
|
|
} else if (val > EPSILON_LENGTH) {
|
|
return 1;
|
|
} else {
|
|
return 0;
|
|
}
|
|
return 0;
|
|
}
|
|
|
|
template <typename T>
|
|
inline int incircle(const T &pa, const T &pb, const T &pc, const T &pd) {
|
|
double adx, ady, bdx, bdy, cdx, cdy;
|
|
double abdet, bcdet, cadet;
|
|
double alift, blift, clift;
|
|
|
|
adx = pa[0] - pd[0];
|
|
ady = pa[1] - pd[1];
|
|
bdx = pb[0] - pd[0];
|
|
bdy = pb[1] - pd[1];
|
|
cdx = pc[0] - pd[0];
|
|
cdy = pc[1] - pd[1];
|
|
|
|
abdet = adx * bdy - bdx * ady;
|
|
bcdet = bdx * cdy - cdx * bdy;
|
|
cadet = cdx * ady - adx * cdy;
|
|
alift = adx * adx + ady * ady;
|
|
blift = bdx * bdx + bdy * bdy;
|
|
clift = cdx * cdx + cdy * cdy;
|
|
|
|
double val = alift * bcdet + blift * cadet + clift * abdet;
|
|
if (val < -EPSILON_LENGTH) {
|
|
return -1;
|
|
} else if (val > EPSILON_LENGTH) {
|
|
return 1;
|
|
} else {
|
|
return 0;
|
|
}
|
|
return 0;
|
|
}
|
|
}
|
|
|
|
|
|
TEST_CASE("delaunay_triangulation_issue_521", "[igl]") {
|
|
using namespace Eigen;
|
|
using namespace git_issue;
|
|
MatrixXd V(16, 2);
|
|
MatrixXi F;
|
|
|
|
V << 4.55E-13, 2.33E-12,
|
|
248.718, 249.939,
|
|
463.602, 36.1059,
|
|
764.953, 338.937,
|
|
-1002.42, 2097.68,
|
|
-1303.78, 1794.85,
|
|
-1120.79, 1612.75,
|
|
-1369.5, 1362.81,
|
|
-1552.49, 1544.91,
|
|
-1843.04, 1252.94,
|
|
-75.6625, -505.806,
|
|
214.883, -213.834,
|
|
-191.721, 190.784,
|
|
-1166.14, 1160.44,
|
|
-917.424, 1410.38,
|
|
56.9975, 440.723;
|
|
|
|
const auto &orient2d_predicates = [](const double * pa, const double * pb, const double * pc) {
|
|
return orient2d(pa, pb, pc);
|
|
};
|
|
const auto &incircle_predicates = [](const double * pa, const double * pb, const double * pc, const double * pd) {
|
|
return incircle(pa, pb, pc, pd);
|
|
};
|
|
|
|
igl::delaunay_triangulation(V, orient2d_predicates, incircle_predicates, F);
|
|
|
|
REQUIRE(F.rows() > 0);
|
|
REQUIRE(F.cols() == 3);
|
|
REQUIRE(F.maxCoeff() < 16);
|
|
REQUIRE(F.minCoeff() == 0);
|
|
}
|
|
|
|
|