1 // Copyright (c) 2005-2008 Max-Planck-Institute Saarbruecken (Germany). 2 // All rights reserved. 3 // 4 // This file is part of CGAL (www.cgal.org). 5 // 6 // $URL: https://github.com/CGAL/cgal/blob/v5.3/Convex_decomposition_3/include/CGAL/Convex_decomposition_3/External_structure_builder.h $ 7 // $Id: External_structure_builder.h 0779373 2020-03-26T13:31:46+01:00 Sébastien Loriot 8 // SPDX-License-Identifier: GPL-3.0-or-later OR LicenseRef-Commercial 9 // 10 // 11 // Author(s) : Peter Hachenberger <hachenberger@mpi-sb.mpg.de> 12 13 #ifndef CGAL_CD3_EXTERNAL_STRUCTURE_BUILDER_H 14 #define CGAL_CD3_EXTERNAL_STRUCTURE_BUILDER_H 15 16 #include <CGAL/license/Convex_decomposition_3.h> 17 18 19 #include <CGAL/Nef_3/SNC_decorator.h> 20 #include <CGAL/Nef_3/SNC_intersection.h> 21 22 #undef CGAL_NEF_DEBUG 23 #define CGAL_NEF_DEBUG 43 24 #include <CGAL/Nef_2/debug.h> 25 26 namespace CGAL { 27 28 template<typename Nef_> 29 class External_structure_builder : public Modifier_base<typename Nef_::SNC_and_PL> { 30 31 typedef Nef_ Nef_polyhedron; 32 typedef typename Nef_polyhedron::SNC_and_PL SNC_and_PL; 33 typedef typename Nef_polyhedron::SNC_structure SNC_structure; 34 typedef typename SNC_structure::Items Items; 35 typedef CGAL::SNC_decorator<SNC_structure> Base; 36 typedef CGAL::SNC_point_locator<Base> SNC_point_locator; 37 typedef CGAL::SNC_intersection<SNC_structure> SNC_intersection; 38 typedef CGAL::SNC_external_structure<Items, SNC_structure> 39 SNC_external_structure; 40 41 typedef typename SNC_structure::Sphere_map Sphere_map; 42 typedef CGAL::SM_decorator<Sphere_map> SM_decorator; 43 typedef CGAL::SM_point_locator<SM_decorator> SM_point_locator; 44 45 typedef typename Base::Segment_3 Segment_3; 46 typedef typename Base::Point_3 Point_3; 47 typedef typename Base::Ray_3 Ray_3; 48 typedef typename Base::Vector_3 Vector_3; 49 typedef typename Base::Sphere_point Sphere_point; 50 typedef typename Base::Sphere_circle Sphere_circle; 51 typedef typename Base::Sphere_segment Sphere_segment; 52 typedef typename Base::Vertex_handle Vertex_handle; 53 typedef typename Base::Halfedge_handle Halfedge_handle; 54 typedef typename Base::Halffacet_handle Halffacet_handle; 55 typedef typename Base::SVertex_handle SVertex_handle; 56 typedef typename Base::SHalfedge_handle SHalfedge_handle; 57 typedef typename Base::SHalfloop_handle SHalfloop_handle; 58 typedef typename Base::SFace_handle SFace_handle; 59 typedef typename Base::Object_handle Object_handle; 60 61 typedef typename Base::SFace_iterator SFace_iterator; 62 typedef typename Base::SHalfedge_iterator SHalfedge_iterator; 63 typedef typename Base::SFace_cycle_iterator SFace_cycle_iterator; 64 typedef typename Base::SHalfedge_around_sface_circulator 65 SHalfedge_around_sface_circulator; 66 67 Halfedge_handle ein; 68 Vector_3 dir; 69 70 public: External_structure_builder()71 External_structure_builder() {} 72 operator()73 void operator()(SNC_and_PL& sncpl) { 74 // CGAL_NEF_TRACEN(43); 75 76 SNC_structure* sncp(sncpl.sncp); 77 SNC_point_locator* pl(sncpl.pl); 78 79 80 81 Unique_hash_map<SHalfedge_handle, SFace_handle> sedge2sface; 82 /* 83 SFace_iterator sfi; 84 CGAL_forall_sfaces(sfi, *sncp) { 85 SFace_cycle_iterator sfc; 86 for(sfc = sfi->sface_cycles_begin(); sfc != sfi->sface_cycles_end(); ++sfc) { 87 if(sfc.is_shalfedge()){ 88 SHalfedge_around_sface_circulator eaf(sfc), end(eaf); 89 CGAL_For_all(eaf,end) { 90 SHalfedge_handle se(eaf); 91 sedge2sface[eaf] = sfi; 92 } 93 } 94 } 95 } 96 97 // CGAL::SNC_io_parser<SNC_structure> O0(std::cerr, *sncp, false); 98 // O0.print(); 99 100 SHalfedge_iterator sei; 101 CGAL_forall_shalfedges(sei, *sncp) { 102 SHalfedge_handle se(sei); 103 if(sedge2sface[se] == SFace_handle()) { 104 SM_decorator SD(&*sei->source()->source()); 105 SFace_handle sf_new = SD.new_sface(); 106 sf_new->mark() = sei->incident_sface()->mark(); 107 108 CGAL_NEF_TRACEN("new entry sedge " << sei->source()->point() 109 << "->" << sei->twin()->source()->point() 110 << " at " << sei->source()->source()->point()); 111 112 SD.link_as_face_cycle(sei, sf_new); 113 114 SHalfedge_around_sface_circulator eaf(se), end(eaf); 115 CGAL_For_all(eaf,end) { 116 SHalfedge_handle se(eaf); 117 sedge2sface[eaf] = sf_new; 118 } 119 120 // TODO: relink inner sface cycles 121 } 122 } 123 */ 124 SNC_point_locator* old_pl = pl; 125 pl = pl->clone(); 126 sncpl.pl = pl; 127 delete old_pl; 128 SNC_external_structure C(*sncp,pl); 129 C.clear_external_structure(); 130 C.build_external_structure(); 131 132 // CGAL::SNC_io_parser<SNC_structure> Ox(std::cerr, *sncp, false); 133 // Ox.print(); 134 } 135 }; 136 137 } //namespace CGAL 138 #endif //CGAL_CD3_EXTERNAL_STRUCTURE_BUILDER_H 139