Rocstar  1.0
Rocstar multiphysics simulation application
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
CGAL/include/CGAL/Halfedge_data_structure_using_vector.h
Go to the documentation of this file.
1 // ======================================================================
2 //
3 // Copyright (c) 1997 The CGAL Consortium
4 
5 // This software and related documentation is part of the Computational
6 // Geometry Algorithms Library (CGAL).
7 // This software and documentation is provided "as-is" and without warranty
8 // of any kind. In no event shall the CGAL Consortium be liable for any
9 // damage of any kind.
10 //
11 // Every use of CGAL requires a license.
12 //
13 // Academic research and teaching license
14 // - For academic research and teaching purposes, permission to use and copy
15 // the software and its documentation is hereby granted free of charge,
16 // provided that it is not a component of a commercial product, and this
17 // notice appears in all copies of the software and related documentation.
18 //
19 // Commercial licenses
20 // - A commercial license is available through Algorithmic Solutions, who also
21 // markets LEDA (http://www.algorithmic-solutions.de).
22 // - Commercial users may apply for an evaluation license by writing to
23 // Algorithmic Solutions (contact@algorithmic-solutions.com).
24 //
25 // The CGAL Consortium consists of Utrecht University (The Netherlands),
26 // ETH Zurich (Switzerland), Free University of Berlin (Germany),
27 // INRIA Sophia-Antipolis (France), Martin-Luther-University Halle-Wittenberg
28 // (Germany), Max-Planck-Institute Saarbrucken (Germany), RISC Linz (Austria),
29 // and Tel-Aviv University (Israel).
30 //
31 // ----------------------------------------------------------------------
32 //
33 // release : CGAL-2.2
34 // release_date : 2000, September 30
35 //
36 // file : include/CGAL/Halfedge_data_structure_using_vector.h
37 // package : Halfedge_DS (2.8)
38 // chapter : $CGAL_Chapter: Halfedge Data Structures $
39 // source : hds.fw
40 // revision : $Revision: 1.1.1.1 $
41 // revision_date : $Date: 2001/07/05 22:17:47 $
42 // author(s) : Lutz Kettner
43 //
44 // coordinator : MPI Saarbruecken (Stefan Schirra)
45 //
46 // Halfedge Data Structure Using a Vector Implementation.
47 // email : contact@cgal.org
48 // www : http://www.cgal.org
49 //
50 // ======================================================================
51 
52 #ifndef CGAL_HALFEDGE_DATA_STRUCTURE_USING_VECTOR_H
53 #define CGAL_HALFEDGE_DATA_STRUCTURE_USING_VECTOR_H 1
54 #ifndef CGAL_BASIC_H
55 #include <CGAL/basic.h>
56 #endif // CGAL_BASIC_H
57 #ifndef CGAL_PROTECT_CSTDDEF
58 #include <cstddef>
59 #define CGAL_PROTECT_CSTDDEF
60 #endif
61 #ifndef CGAL_PROTECT_ALGORITHM
62 #include <algorithm>
63 #define CGAL_PROTECT_ALGORITHM
64 #endif
65 #ifndef CGAL_PROTECT_VECTOR
66 #include <vector>
67 #define CGAL_PROTECT_VECTOR
68 #endif
69 #ifndef CGAL_CIRCULATOR_H
70 #include <CGAL/circulator.h>
71 #endif
72 #ifndef CGAL_N_STEP_ADAPTOR_H
73 #include <CGAL/N_step_adaptor.h>
74 #endif
75 
76 #ifndef CGAL_HALFEDGE_DATA_STRUCTURE_DECORATOR_H
78 #endif
79 
80 // Define shorter names to please linker (g++/egcs)
81 #define _HDS_vector_vertex _Hvv
82 #define _HDS_vector_halfedge _Hvh
83 #define _HDS_vector_facet _Hvf
84 
86 
87 
88 template <class V, class H, class F> class _HDS_vector_vertex;
89 template <class V, class H, class F> class _HDS_vector_halfedge;
90 template <class V, class H, class F> class _HDS_vector_facet;
91 
92 template <class V, class H, class F>
93 class _HDS_vector_vertex : public V {
94 public:
95  typedef V Base;
99 
100  // Point needed for Vertex constructor for efficiency reasons.
101  typedef typename V::Point Point;
102 
104  _HDS_vector_vertex( const Point& p) : V(p) {}
105 
106  Halfedge* halfedge() {return (Halfedge*)(V::halfedge());}
107  const Halfedge* halfedge() const {return (const Halfedge*)(V::halfedge());}
108  void set_halfedge( Halfedge* h) { V::set_halfedge(h);}
109 };
110 
111 template <class V, class H, class F>
112 class _HDS_vector_halfedge : public H {
113 public:
114  typedef H Base;
118 
119  typedef typename H::Supports_halfedge_prev Supports_halfedge_prev;
120  typedef typename H::Supports_halfedge_vertex Supports_halfedge_vertex;
121  typedef typename H::Supports_halfedge_facet Supports_halfedge_facet;
122 
124  Halfedge* next() {return (Halfedge*)(H::next());}
125  Halfedge* prev() {return (Halfedge*)(H::prev());}
126  Vertex* vertex() {return (Vertex*)(H::vertex());}
127  Facet* facet() {return (Facet*)(H::facet());}
128 
129  const Halfedge* opposite() const {return (const Halfedge*)(H::opposite());}
130  const Halfedge* next() const {return (const Halfedge*)(H::next());}
131  const Halfedge* prev() const {return (const Halfedge*)(H::prev());}
132  const Vertex* vertex() const {return (const Vertex*)(H::vertex());}
133  const Facet* facet() const {return (const Facet*)(H::facet());}
134 
135  void set_next( Halfedge* h) { H::set_next(h);}
136  void set_prev( Halfedge* h) { H::set_prev(h);}
137  void set_vertex( Vertex* ve) { H::set_vertex(ve);}
138  void set_facet( Facet* facet) { H::set_facet(facet);}
139 
140 private:
141  void set_opposite( void* h) { H::set_opposite(h);}
142 };
143 
144 
145 template <class V, class H, class F>
146 class _HDS_vector_facet : public F {
147 public:
148  typedef F Base;
152 
153  Halfedge* halfedge() {return (Halfedge*)(F::halfedge());}
154  const Halfedge* halfedge() const {return (const Halfedge*)(F::halfedge());}
155  void set_halfedge( Halfedge* h) { F::set_halfedge(h);}
156 };
157 
158 
159 // A Halfedge Data Structure Using Vectors
160 // -------------------------------------------
161 //
162 // DEFINITION
163 //
164 // The class Halfedge_data_structure_using_vector<Vertex,Halfedge,Facet>
165 // is a halfedge data structure parameterized with vertex, halfedge,
166 // and facet types. The base classes defined in the previous subsection
167 // could be used therefore. It is sufficient for the parameter classes to
168 // implement the pointers as `void*'. They do not have to know the types
169 // of their relatives.
170 
171 template < class V, class H, class F>
173 public:
178 
179  // Point needed for Vertex constructor for efficiency reasons.
180  typedef typename Vertex::Point Point;
181  typedef typename Facet::Normal Normal;
182  typedef typename Facet::Plane Plane;
183 
184 protected:
185  // Three vectors for the elements.
186  typedef std::vector<Vertex> Vertex_vector;
187  typedef std::vector<Halfedge> Halfedge_vector;
188  typedef std::vector<Facet> Facet_vector;
189 public:
190  typedef typename Halfedge_vector::size_type Size;
191  // typedef typename Halfedge_vector::size_type size_type;
192  typedef typename Halfedge_vector::difference_type
194 
195  typedef typename Vertex::Supports_vertex_halfedge Supports_vertex_halfedge;
197  typedef typename Halfedge::Supports_halfedge_vertex
199  typedef typename Halfedge::Supports_halfedge_facet
201  typedef typename Facet::Supports_facet_halfedge Supports_facet_halfedge;
202 
203  typedef typename Vertex::Supports_vertex_point Supports_vertex_point;
204  typedef typename Facet::Supports_facet_plane Supports_facet_plane;
205  typedef typename Facet::Supports_facet_normal Supports_facet_normal;
206 
208  typedef std::random_access_iterator_tag iterator_category;
209 
210  typedef typename Vertex_vector::iterator Vertex_iterator;
211  typedef typename Halfedge_vector::iterator Halfedge_iterator;
212  typedef typename Facet_vector::iterator Facet_iterator;
214  2,
215  Halfedge&,
216  Halfedge*,
217  Halfedge,
218  std::ptrdiff_t,
220 
221  typedef typename Vertex_vector::const_iterator Vertex_const_iterator;
222  typedef typename Halfedge_vector::const_iterator Halfedge_const_iterator;
223  typedef typename Facet_vector::const_iterator Facet_const_iterator;
225  2,
226  const Halfedge&,
227  const Halfedge*,
228  Halfedge,
229  std::ptrdiff_t,
231 
232 protected :
239 
240 // CREATION
241 
242 private:
245  Facet_const_iterator f_old);
246  // Update own pointers assuming that they lived previously
247  // in a halfedge data structure with vector starting addresses
248  // as given as parameters v_old, h_old, f_old.
249 
250 public:
254  // the empty polyhedron `P'.
255 
259  // a polyhedron `P' with storage reserved for v vertices, h
260  // halfedges, and f facets. The reservation sizes are a hint for
261  // optimizing storage allocation. They are not used here.
262  vertices.reserve(v);
263  halfedges.reserve(h);
264  facets.reserve(f);
265  }
266 
267  void reserve( Size v, Size h, Size f) {
268  // reserve storage for v vertices, h halfedges, and f facets. The
269  // reservation sizes are a hint for optimizing storage allocation.
270  // If the `capacity' is already greater than the requested size
271  // nothing happens. If the `capacity' changes all iterators and
272  // circulators invalidates. Function is void here.
273  Vertex_iterator v_old = vertices.begin();
274  Halfedge_iterator h_old = halfedges.begin();
275  Facet_iterator f_old = facets.begin();
277  vertices.reserve(v);
278  halfedges.reserve(h);
280  facets.reserve(f);
281  pointer_update( v_old, h_old, f_old);
282  }
283 
285  : vertices( hds.vertices),
286  halfedges( hds.halfedges),
287  facets( hds.facets),
291  {
292  pointer_update( hds.vertices.begin(),
293  hds.halfedges.begin(),
294  hds.facets.begin());
295  }
296 
297  Self& operator=( const Self& hds) {
298  if ( this != &hds) {
299  delete_all();
300  vertices = hds.vertices;
301  halfedges = hds.halfedges;
302  facets = hds.facets;
306  pointer_update( hds.vertices.begin(),
307  hds.halfedges.begin(),
308  hds.facets.begin());
309  }
310  return *this;
311  }
312 
313 
314 // Access Member Functions
315 
316  Size size_of_vertices() const { return vertices.size();}
317  Size size_of_halfedges() const { return halfedges.size();}
318  // number of all halfedges (including border halfedges).
319  Size size_of_facets() const { return facets.size();}
320 
321  Size capacity_of_vertices() const { return vertices.capacity();}
322  Size capacity_of_halfedges() const { return halfedges.capacity();}
323  Size capacity_of_facets() const { return facets.capacity();}
324 
325  std::size_t bytes() const {
326  return sizeof(Self)
327  + vertices.size() * sizeof( Vertex)
328  + halfedges.size() * sizeof( Halfedge)
329  + facets.size() * sizeof( Facet);
330  }
331  std::size_t bytes_reserved() const {
332  return sizeof(Self)
333  + vertices.capacity() * sizeof( Vertex)
334  + halfedges.capacity() * sizeof( Halfedge)
335  + facets.capacity() * sizeof( Facet);
336  }
337 
342  Facet_iterator facets_begin() { return facets.begin();}
343  Facet_iterator facets_end() { return facets.end();}
344 
346  // iterator over all edges. The iterator refers to halfedges, but
347  // enumerates only one of the two corresponding opposite
348  // halfedges.
349 
351  // end of the range over all edges.
352 
353  // The constant iterators and circulators.
354 
359  Facet_const_iterator facets_begin() const{ return facets.begin();}
360  Facet_const_iterator facets_end() const{ return facets.end();}
361 
364  }
367  }
368 
369 // Insertion
370 //
371 // The following operations simply allocate a new element of that type.
372 // Halfedges are always allocated in pairs of opposite halfedges. The
373 // opposite pointers are automatically set.
374 
376  CGAL_assertion( vertices.size() < vertices.capacity());
377  vertices.push_back( Vertex());
378  return & (vertices.back());
379  }
380 
381  Vertex* new_vertex( const Vertex* v) {
382  CGAL_assertion( vertices.size() < vertices.capacity());
383  vertices.push_back( *v);
384  return & (vertices.back());
385  }
386 
387  Vertex* new_vertex( const Point& p) {
388  CGAL_assertion( vertices.size() < vertices.capacity());
389  vertices.push_back( Vertex(p));
390  return & (vertices.back());
391  }
392 
394  CGAL_assertion( halfedges.size() + 1 < halfedges.capacity());
395  // creates a new pair of opposite border halfedges.
396  halfedges.push_back( Halfedge());
397  Halfedge* h = & (halfedges.back());
398  halfedges.push_back( Halfedge());
399  Halfedge* g = & (halfedges.back());
400  CGAL_assertion( h + 1 == g);
401  CGAL_assertion( (char*)g - (char*)h == sizeof( Halfedge));
402  h->H::set_opposite(g);
403  g->H::set_opposite(h);
404  return h;
405  }
406 
407  Halfedge* new_edge( const Halfedge* he) {
408  CGAL_assertion( halfedges.size() + 1 < halfedges.capacity());
409  // creates a new pair of opposite border halfedges.
410  halfedges.push_back( *he);
411  Halfedge* h = & (halfedges.back());
412  halfedges.push_back( *(he->opposite()));
413  Halfedge* g = & (halfedges.back());
414  h->H::set_opposite(g);
415  g->H::set_opposite(h);
416  return h;
417  }
418 
420  CGAL_assertion( facets.size() < facets.capacity());
421  facets.push_back( Facet());
422  return & (facets.back());
423  }
424 
425  Facet* new_facet( const Facet* f) {
426  facets.push_back( *f);
427  return & (facets.back());
428  }
429 
430 // Removal
431 //
432 // The following operations erase an element referenced by a pointer.
433 // Halfedges are always deallocated in pairs of opposite halfedges. Erase
434 // of single elements is optional. The deletion of all is mandatory.
435 
436  void delete_all() {
437  vertices.erase( vertices.begin(), vertices.end());
438  halfedges.erase( halfedges.begin(), halfedges.end());
439  facets.erase( facets.begin(), facets.end());
441  nb_border_edges = 0;
443  }
444 
445  void vertex_pop_back() { vertices.pop_back(); }
446 
447  void edge_pop_back() {
448  halfedges.pop_back();
449  halfedges.pop_back();
450  }
451 
452  void facet_pop_back() { facets.pop_back(); }
453 
454 // Special Operations on Polyhedral Surfaces
455 protected:
457  Halfedge_iterator g = h + 1;
458  h->H::set_opposite( &*g);
459  g->H::set_opposite( &*h);
460  }
463  }
464 
466  std::vector<Halfedge_iterator>,Tag_false){}
468  std::vector<Halfedge_iterator> inv, Tag_true){
469  h->set_prev( &*(inv[ Halfedge_iterator(h->prev()) - base]));
470  }
475  h->vertex()->set_halfedge(&*h);
476  }
481  h->facet()->set_halfedge(&*h);
482  }
483 
484 public:
485 // Operations with Border Halfedges
486 
488  // number of border halfedges. An edge with no incident facet
489  // counts as two border halfedges. Precondition: `normalize_border()'
490  // has been called and no halfedge insertion or removal and no
491  // change in border status of the halfedges have occured since
492  // then.
493 
495  // number of border edges. If `size_of_border_edges() ==
496  // size_of_border_halfedges()' all border edges are incident to a
497  // facet on one side and to a hole on the other side.
498  // Precondition: `normalize_border()' has been called and no
499  // halfedge insertion or removal and no change in border status of
500  // the halfedges have occured since then.
501 
503  // halfedge iterator starting with the border edges. The range [
504  // `halfedges_begin(), border_halfedges_begin()') denotes all
505  // non-border edges. The range [`border_halfedges_begin(),
506  // halfedges_end()') denotes all border edges. Precondition:
507  // `normalize_border()' has been called and no halfedge insertion
508  // or removal and no change in border status of the halfedges have
509  // occured since then.
511  }
512 
514  // ... trial to make Edge_iterator obsolete.
516  }
517 
519  // CGAL_assertion( border_halfedges);
520  // return Halfedge_const_iterator( border_halfedges);
521  return // static_cast -- MSVC identity loss... DVP
522  Halfedge_const_iterator(static_cast<Halfedge_iterator>
523  (border_halfedges));
524  }
525 
528  }
529 
530  void normalize_border();
531  // sorts halfedges such that the non-border edges precedes the
532  // border edges. For each border edge that is incident to a facet
533  // the halfedge iterator will reference the halfedge incident to
534  // the facet right before the halfedge incident to the hole.
535 };
536 
537 #define CGAL_V_UPDATE(v) (&*(v_new + (Vertex_const_iterator(v) - v_old)))
538 #define CGAL_H_UPDATE(h) (&*(h_new + (Halfedge_const_iterator(h) - h_old)))
539 #define CGAL_H_UPDATE_I(h) (h_new + (Halfedge_const_iterator(h) - h_old))
540 #define CGAL_F_UPDATE(f) (&*(f_new + (Facet_const_iterator(f) - f_old)))
541 
542 template < class V, class H, class F>
543 void
547  Facet_const_iterator f_old) {
548  // Update own pointers assuming that they lived previously
549  // in a halfedge data structure with vector starting addresses
550  // as given as parameters v_old, h_old, f_old.
552  Vertex_iterator v_new = vertices.begin();
553  Halfedge_iterator h_new = halfedges.begin();
554  Facet_iterator f_new = facets.begin();
555  for ( Halfedge_iterator h = halfedges.begin(); h != halfedges.end(); ++h) {
556  h->set_next( CGAL_H_UPDATE( h->next()));
557  h->H::set_opposite( CGAL_H_UPDATE( h->opposite()));
558  D.set_prev( &*h, CGAL_H_UPDATE( D.get_prev( &*h)));
559  D.set_vertex( &*h, CGAL_V_UPDATE( D.get_vertex( &*h)));
560  D.set_vertex_halfedge( &*h);
561  D.set_facet( &*h, CGAL_F_UPDATE( D.get_facet( &*h)));
562  if ( ! h->is_border())
563  D.set_facet_halfedge( &*h);
564  }
565  border_halfedges = CGAL_H_UPDATE_I( border_halfedges);
566 }
567 #undef CGAL_V_UPDATE
568 #undef CGAL_H_UPDATE
569 #undef CGAL_H_UPDATE_I
570 #undef CGAL_F_UPDATE
571 
572 template < class V, class H, class F>
573 void
575  nb_border_halfedges = 0;
576  nb_border_edges = 0;
577  border_halfedges = halfedges_end();
578  // Lets run one partition step over the array of halfedges.
579  // First find a pivot -- that means a border edge.
580  Edge_iterator ll = edges_begin();
581  while ( ll != edges_end() && (! (*ll).is_border()) &&
582  (!(*ll).opposite()->is_border() ))
583  ++ll;
584  if ( ll == edges_end())
585  // Done. No border edges found.
586  return;
587 
588  // An array of pointers to update the changed halfedge pointers.
589  typedef std::vector<Halfedge_iterator> HVector;
590  HVector hvector;
591  hvector.reserve( halfedges.size());
592  // Initialize it.
593  for ( Halfedge_iterator i = halfedges_begin(); i!=halfedges_end();++i){
594  hvector.push_back( i);
595  }
596  CGAL_assertion( hvector.size() == halfedges.size());
597  typename HVector::iterator llhv = hvector.begin()+2*(ll-edges_begin());
598  // Start with the partitioning.
599  Edge_iterator rr = edges_end();
600  --rr;
601  typename HVector::iterator rrhv = hvector.end();
602  --rrhv;
603  --rrhv;
604  // Pivot is in *ll
605  // Elements in [rr+1..end) >= pivot (border)
606  // Elements in [begin..ll) < pivot (non border)
607  while (ll < rr) {
608  // Pivot is in *ll, ll <= rr.
609  while ( rr > ll && ((*rr).is_border() ||
610  (*rr).opposite()->is_border())) {
611  if ( ! (*rr).opposite()->is_border()) {
612  std::swap( *rr, *((*rr).opposite()));
613  update_opposite( rr);
614  std::swap( *rrhv, *(rrhv+1));
615  }
616  --rr;
617  --rrhv;
618  --rrhv;
619  }
620  // Elements in [rr+1..end) >= pivot (border)
621  // *rr <= pivot, ll <= rr.
622  std::swap( *((*ll).opposite()), *((*rr).opposite()));
623  std::swap( *ll, *rr);
624  update_opposite( ll);
625  update_opposite( rr);
626  std::swap( *(llhv+1), *(rrhv+1));
627  std::swap( *llhv, *rrhv);
628  // Elements in [begin..ll) < pivot
629  // Pivot is in *rr, ll <= rr.
630  while ( !(*ll).is_border() && !(*ll).opposite()->is_border()) {
631  ++ll;
632  ++llhv;
633  ++llhv;
634  }
635  // Elements in [begin..ll) < pivot
636  // *ll >= pivot
637  // ll <= rr (since *rr is pivot.)
638  CGAL_assertion( ll <= rr);
639  CGAL_assertion( llhv <= rrhv);
640  std::swap( *((*ll).opposite()), *((*rr).opposite()));
641  std::swap( *ll, *rr);
642  update_opposite( ll);
643  update_opposite( rr);
644  std::swap( *(llhv+1), *(rrhv+1));
645  std::swap( *llhv, *rrhv);
646  if ( ! (*rr).opposite()->is_border()) {
647  std::swap( *rr, *((*rr).opposite()));
648  update_opposite( rr);
649  std::swap( *rrhv, *(rrhv+1));
650  }
651  --rr;
652  --rrhv;
653  --rrhv;
654  // Elements in [rr+1..end) >= pivot
655  // Pivot is in *ll
656  }
657  CGAL_assertion( llhv >= rrhv);
658  // rr + 1 >= ll >= rr
659  // Elements in [rr+1..end) >= pivot
660  // Elemente in [begin..ll) < pivot
661  // Pivot is in a[ll]
662  if ( ll == rr) {
663  // Check for the possibly missed swap.
664  if ( (*rr).is_border() && ! ((*rr).opposite()->is_border())) {
665  std::swap( *rr, *((*rr).opposite()));
666  update_opposite( rr);
667  std::swap( *rrhv, *(rrhv+1));
668  }
669  }
670  CGAL_assertion( (*ll).opposite()->is_border());
671  CGAL_assertion( ll == edges_begin() || ! (*(ll-1)).is_border());
672  CGAL_assertion( ll == edges_begin() ||
673  ! (*(ll-1)).opposite()->is_border());
674  border_halfedges = Halfedge_iterator( &*ll);
675  nb_border_edges = (edges_end() - ll);
676  nb_border_halfedges = 0;
677 
678  HVector inv_vector( halfedges.size());
679  // Initialize inverse index.
680  for ( typename HVector::iterator k = hvector.begin();
681  k != hvector.end(); ++k){
682  inv_vector[*k - halfedges_begin()] =
683  halfedges_begin() + (k - hvector.begin());
684  }
685 
686  // Update halfedge pointers.
687  for (Halfedge_iterator h =halfedges_begin(); h != halfedges_end();++h){
688  (*h).set_next( &* (inv_vector[ (*h).next() - &(halfedges.front())]));
689  update_prev( h, halfedges.begin(), inv_vector,
691  update_vertex( h, Supports_halfedge_vertex(),
693  if ( (*h).is_border())
694  nb_border_halfedges++;
695  else
696  update_facet( h, Supports_halfedge_facet(),
698  }
699 }
700 
702 
703 // Undef shorter names (g++/egcs)
704 //#undef _HDS_vector_vertex
705 //#undef _HDS_vector_halfedge
706 //#undef _HDS_vector_facet
707 #endif // CGAL_HALFEDGE_DATA_STRUCTURE_USING_VECTOR_H //
708 // EOF //
void swap(int &a, int &b)
Definition: buildface.cpp:88
#define CGAL_assertion(EX)
Definition: assertions.h:87
N_step_adaptor< Halfedge_iterator, 2, Halfedge &, Halfedge *, Halfedge, std::ptrdiff_t, iterator_category > Edge_iterator
j indices k indices k
Definition: Indexing.h:6
void update_prev(Halfedge_iterator h, Halfedge_iterator base, std::vector< Halfedge_iterator > inv, Tag_true)
Definition: face.cpp:178
void set_facet_halfedge(Facet *f, Halfedge *g) const
void update_prev(Halfedge_iterator, Halfedge_iterator, std::vector< Halfedge_iterator >, Tag_false)
*********************************************************************Illinois Open Source License ****University of Illinois NCSA **Open Source License University of Illinois All rights reserved ****Developed free of to any person **obtaining a copy of this software and associated documentation to deal with the Software without including without limitation the rights to and or **sell copies of the and to permit persons to whom the **Software is furnished to do subject to the following this list of conditions and the following disclaimers ****Redistributions in binary form must reproduce the above **copyright this list of conditions and the following **disclaimers in the documentation and or other materials **provided with the distribution ****Neither the names of the Center for Simulation of Advanced the University of nor the names of its **contributors may be used to endorse or promote products derived **from this Software without specific prior written permission ****THE SOFTWARE IS PROVIDED AS WITHOUT WARRANTY OF ANY **EXPRESS OR INCLUDING BUT NOT LIMITED TO THE WARRANTIES **OF FITNESS FOR A PARTICULAR PURPOSE AND **NONINFRINGEMENT IN NO EVENT SHALL THE CONTRIBUTORS OR **COPYRIGHT HOLDERS BE LIABLE FOR ANY DAMAGES OR OTHER WHETHER IN AN ACTION OF TORT OR **ARISING OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE **USE OR OTHER DEALINGS WITH THE SOFTWARE v
Definition: roccomf90.h:20
N_step_adaptor< Halfedge_const_iterator, 2, const Halfedge &, const Halfedge *, Halfedge, std::ptrdiff_t, iterator_category > Edge_const_iterator
bool check_tag(Tag_true)
void pointer_update(Vertex_const_iterator v_old, Halfedge_const_iterator h_old, Facet_const_iterator f_old)
blockLoc i
Definition: read.cpp:79
void set_facet(Halfedge *h, Facet *f) const
CGAL_BEGIN_NAMESPACE T opposite(const T &t)
void inv(Matrix3D &Ainv, const Matrix3D &A)
void set_vertex_halfedge(Vertex *v, Halfedge *g) const
#define CGAL_BEGIN_NAMESPACE
Definition: kdtree_d.h:86
void set_vertex(Halfedge *h, Vertex *v) const
void set_prev(Halfedge *h, Halfedge *g) const
#define CGAL_END_NAMESPACE
Definition: kdtree_d.h:87