triangulate.cpp 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106
  1. // This file is part of libigl, a simple c++ geometry processing library.
  2. //
  3. // Copyright (C) 2014 Daniele Panozzo <daniele.panozzo@gmail.com>
  4. //
  5. // This Source Code Form is subject to the terms of the Mozilla Public License
  6. // v. 2.0. If a copy of the MPL was not distributed with this file, You can
  7. // obtain one at http://mozilla.org/MPL/2.0/.
  8. #include "triangulate.h"
  9. #define REAL double
  10. #define VOID int
  11. extern "C"
  12. {
  13. #include <triangle.h>
  14. }
  15. IGL_INLINE void igl::triangulate(
  16. const Eigen::MatrixXd& V,
  17. const Eigen::MatrixXi& E,
  18. const Eigen::MatrixXd& H,
  19. Eigen::MatrixXd& V2,
  20. Eigen::MatrixXi& F2,
  21. const std::string flags)
  22. {
  23. using namespace std;
  24. using namespace Eigen;
  25. // Prepare the flags
  26. string full_flags = flags + "pzBV";
  27. // Prepare the input struct
  28. triangulateio in;
  29. assert(V.cols() == 2);
  30. in.numberofpoints = V.rows();
  31. in.pointlist = (double*)calloc(V.rows()*2,sizeof(double));
  32. for (unsigned i=0;i<V.rows();++i)
  33. for (unsigned j=0;j<2;++j)
  34. in.pointlist[i*2+j] = V(i,j);
  35. in.numberofpointattributes = 0;
  36. in.pointmarkerlist = (int*)calloc(V.rows(),sizeof(int));
  37. for (unsigned i=0;i<V.rows();++i)
  38. in.pointmarkerlist[i] = 1;
  39. in.trianglelist = NULL;
  40. in.numberoftriangles = 0;
  41. in.numberofcorners = 0;
  42. in.numberoftriangleattributes = 0;
  43. in.triangleattributelist = NULL;
  44. in.numberofsegments = E.rows();
  45. in.segmentlist = (int*)calloc(E.rows()*2,sizeof(int));
  46. for (unsigned i=0;i<E.rows();++i)
  47. for (unsigned j=0;j<2;++j)
  48. in.segmentlist[i*2+j] = E(i,j);
  49. in.segmentmarkerlist = (int*)calloc(E.rows(),sizeof(int));
  50. for (unsigned i=0;i<E.rows();++i)
  51. in.segmentmarkerlist[i] = 1;
  52. in.numberofholes = H.rows();
  53. in.holelist = (double*)calloc(H.rows()*2,sizeof(double));
  54. for (unsigned i=0;i<H.rows();++i)
  55. for (unsigned j=0;j<2;++j)
  56. in.holelist[i*2+j] = H(i,j);
  57. in.numberofregions = 0;
  58. // Prepare the output struct
  59. triangulateio out;
  60. out.pointlist = NULL;
  61. out.trianglelist = NULL;
  62. out.segmentlist = NULL;
  63. // Call triangle
  64. triangulate(const_cast<char*>(full_flags.c_str()), &in, &out, 0);
  65. // Cleanup in
  66. free(in.pointlist);
  67. free(in.pointmarkerlist);
  68. free(in.segmentlist);
  69. free(in.segmentmarkerlist);
  70. free(in.holelist);
  71. // Cleanup out
  72. free(out.pointlist);
  73. free(out.trianglelist);
  74. free(out.segmentlist);
  75. // Return the mesh
  76. V2.resize(out.numberofpoints,2);
  77. for (unsigned i=0;i<V2.rows();++i)
  78. for (unsigned j=0;j<2;++j)
  79. V2(i,j) = out.pointlist[i*2+j];
  80. F2.resize(out.numberoftriangles,3);
  81. for (unsigned i=0;i<F2.rows();++i)
  82. for (unsigned j=0;j<3;++j)
  83. F2(i,j) = out.trianglelist[i*3+j];
  84. }
  85. #ifndef IGL_HEADER_ONLY
  86. // Explicit template instanciation
  87. #endif