delaunay_triangulation.cpp 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103
  1. #ifdef IGL_STATIC_LIBRARY
  2. #undef IGL_STATIC_LIBRARY
  3. #endif
  4. #include <test_common.h>
  5. #include <igl/delaunay_triangulation.h>
  6. namespace git_issue {
  7. constexpr static double EPSILON_LENGTH = 0.0005; // Sketchup support 1/1000 precision
  8. constexpr static double EPSILON_ANGLE = 0.0000000000005;
  9. constexpr static double INV_EPSILON_LENGTH = 2000.0;
  10. template<typename T>
  11. inline int orient2d(const T &pa, const T &pb, const T &pc) {
  12. double acx, bcx, acy, bcy;
  13. acx = pa[0] - pc[0];
  14. bcx = pb[0] - pc[0];
  15. acy = pa[1] - pc[1];
  16. bcy = pb[1] - pc[1];
  17. double val = acx * bcy - acy * bcx;
  18. if (val < -EPSILON_LENGTH) {
  19. return -1;
  20. } else if (val > EPSILON_LENGTH) {
  21. return 1;
  22. } else {
  23. return 0;
  24. }
  25. return 0;
  26. }
  27. template <typename T>
  28. inline int incircle(const T &pa, const T &pb, const T &pc, const T &pd) {
  29. double adx, ady, bdx, bdy, cdx, cdy;
  30. double abdet, bcdet, cadet;
  31. double alift, blift, clift;
  32. adx = pa[0] - pd[0];
  33. ady = pa[1] - pd[1];
  34. bdx = pb[0] - pd[0];
  35. bdy = pb[1] - pd[1];
  36. cdx = pc[0] - pd[0];
  37. cdy = pc[1] - pd[1];
  38. abdet = adx * bdy - bdx * ady;
  39. bcdet = bdx * cdy - cdx * bdy;
  40. cadet = cdx * ady - adx * cdy;
  41. alift = adx * adx + ady * ady;
  42. blift = bdx * bdx + bdy * bdy;
  43. clift = cdx * cdx + cdy * cdy;
  44. double val = alift * bcdet + blift * cadet + clift * abdet;
  45. if (val < -EPSILON_LENGTH) {
  46. return -1;
  47. } else if (val > EPSILON_LENGTH) {
  48. return 1;
  49. } else {
  50. return 0;
  51. }
  52. return 0;
  53. }
  54. }
  55. TEST_CASE("delaunay_triangulation_issue_521", "[igl]") {
  56. using namespace Eigen;
  57. using namespace git_issue;
  58. MatrixXd V(16, 2);
  59. MatrixXi F;
  60. V << 4.55E-13, 2.33E-12,
  61. 248.718, 249.939,
  62. 463.602, 36.1059,
  63. 764.953, 338.937,
  64. -1002.42, 2097.68,
  65. -1303.78, 1794.85,
  66. -1120.79, 1612.75,
  67. -1369.5, 1362.81,
  68. -1552.49, 1544.91,
  69. -1843.04, 1252.94,
  70. -75.6625, -505.806,
  71. 214.883, -213.834,
  72. -191.721, 190.784,
  73. -1166.14, 1160.44,
  74. -917.424, 1410.38,
  75. 56.9975, 440.723;
  76. const auto &orient2d_predicates = [](const double * pa, const double * pb, const double * pc) {
  77. return orient2d(pa, pb, pc);
  78. };
  79. const auto &incircle_predicates = [](const double * pa, const double * pb, const double * pc, const double * pd) {
  80. return incircle(pa, pb, pc, pd);
  81. };
  82. igl::delaunay_triangulation(V, orient2d_predicates, incircle_predicates, F);
  83. REQUIRE(F.rows() > 0);
  84. REQUIRE(F.cols() == 3);
  85. REQUIRE(F.maxCoeff() < 16);
  86. REQUIRE(F.minCoeff() == 0);
  87. }