projected_delaunay.cpp 3.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889
  1. #include "projected_delaunay.h"
  2. #include "../REDRUM.h"
  3. #include <iostream>
  4. #include <cassert>
  5. template <typename Kernel>
  6. IGL_INLINE void igl::cgal::projected_delaunay(
  7. const CGAL::Triangle_3<Kernel> & A,
  8. const std::vector<CGAL::Object> & A_objects_3,
  9. CGAL::Constrained_triangulation_plus_2<
  10. CGAL::Constrained_Delaunay_triangulation_2<
  11. Kernel,
  12. CGAL::Triangulation_data_structure_2<
  13. CGAL::Triangulation_vertex_base_2<Kernel>,
  14. CGAL::Constrained_triangulation_face_base_2<Kernel> >,
  15. CGAL::Exact_intersections_tag> > & cdt)
  16. {
  17. using namespace std;
  18. // 3D Primitives
  19. typedef CGAL::Point_3<Kernel> Point_3;
  20. typedef CGAL::Segment_3<Kernel> Segment_3;
  21. typedef CGAL::Triangle_3<Kernel> Triangle_3;
  22. typedef CGAL::Plane_3<Kernel> Plane_3;
  23. typedef CGAL::Tetrahedron_3<Kernel> Tetrahedron_3;
  24. typedef CGAL::Point_2<Kernel> Point_2;
  25. typedef CGAL::Segment_2<Kernel> Segment_2;
  26. typedef CGAL::Triangle_2<Kernel> Triangle_2;
  27. typedef CGAL::Triangulation_vertex_base_2<Kernel> TVB_2;
  28. typedef CGAL::Constrained_triangulation_face_base_2<Kernel> CTFB_2;
  29. typedef CGAL::Triangulation_data_structure_2<TVB_2,CTFB_2> TDS_2;
  30. typedef CGAL::Exact_intersections_tag Itag;
  31. typedef CGAL::Constrained_Delaunay_triangulation_2<Kernel,TDS_2,Itag>
  32. CDT_2;
  33. typedef CGAL::Constrained_triangulation_plus_2<CDT_2> CDT_plus_2;
  34. // http://www.cgal.org/Manual/3.2/doc_html/cgal_manual/Triangulation_2/Chapter_main.html#Section_2D_Triangulations_Constrained_Plus
  35. // Plane of triangle A
  36. Plane_3 P(A.vertex(0),A.vertex(1),A.vertex(2));
  37. // Insert triangle into vertices
  38. typename CDT_plus_2::Vertex_handle corners[3];
  39. typedef size_t Index;
  40. for(Index i = 0;i<3;i++)
  41. {
  42. const Point_3 & p3 = A.vertex(i);
  43. const Point_2 & p2 = P.to_2d(p3);
  44. typename CDT_plus_2::Vertex_handle corner = cdt.insert(p2);
  45. corners[i] = corner;
  46. }
  47. // Insert triangle edges as constraints
  48. for(Index i = 0;i<3;i++)
  49. {
  50. cdt.insert_constraint( corners[(i+1)%3], corners[(i+2)%3]);
  51. }
  52. // Insert constraints for intersection objects
  53. for( const auto & obj : A_objects_3)
  54. {
  55. if(const Segment_3 *iseg = CGAL::object_cast<Segment_3 >(&obj))
  56. {
  57. // Add segment constraint
  58. cdt.insert_constraint(P.to_2d(iseg->vertex(0)),P.to_2d(iseg->vertex(1)));
  59. }else if(const Point_3 *ipoint = CGAL::object_cast<Point_3 >(&obj))
  60. {
  61. // Add point
  62. cdt.insert(P.to_2d(*ipoint));
  63. } else if(const Triangle_3 *itri = CGAL::object_cast<Triangle_3 >(&obj))
  64. {
  65. // Add 3 segment constraints
  66. cdt.insert_constraint(P.to_2d(itri->vertex(0)),P.to_2d(itri->vertex(1)));
  67. cdt.insert_constraint(P.to_2d(itri->vertex(1)),P.to_2d(itri->vertex(2)));
  68. cdt.insert_constraint(P.to_2d(itri->vertex(2)),P.to_2d(itri->vertex(0)));
  69. } else if(const std::vector<Point_3 > *polyp =
  70. CGAL::object_cast< std::vector<Point_3 > >(&obj))
  71. {
  72. //cerr<<REDRUM("Poly...")<<endl;
  73. const std::vector<Point_3 > & poly = *polyp;
  74. const Index m = poly.size();
  75. assert(m>=2);
  76. for(Index p = 0;p<m;p++)
  77. {
  78. const Index np = (p+1)%m;
  79. cdt.insert_constraint(P.to_2d(poly[p]),P.to_2d(poly[np]));
  80. }
  81. }else
  82. {
  83. cerr<<REDRUM("What is this object?!")<<endl;
  84. assert(false);
  85. }
  86. }
  87. }