| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103 |
- #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);
- }
|