1 // This is prip/vpyr/vpyr_2_tpyramid.hxx
2 #ifndef vpyr_2_tpyramid_hxx_
3 #define vpyr_2_tpyramid_hxx_
4 
5 #include <iostream>
6 #include "vpyr_2_tpyramid.h"
7 #include <vmap/vbl_controlled_partition.h>
8 #ifdef _MSC_VER
9 #  include <vcl_msvc_warnings.h>
10 #endif
11 
12 template <class TLevel>
13 vpyr_2_tpyramid<TLevel>::vpyr_2_tpyramid() = default;
14 
15 #if 0
16 template <class TLevel>
17 vpyr_2_tpyramid<TLevel>::vpyr_2_tpyramid(const self_type &pyr)
18 {
19   operator=(pyr) ;
20 }
21 #endif // 0
22 
23 template <class TLevel>
24 vpyr_2_tpyramid<TLevel>::~vpyr_2_tpyramid() = default;
25 
26 #if 0
27 template <class TLevel>
28 vpyr_2_tpyramid<TLevel> & vpyr_2_tpyramid<TLevel>::operator=(const self_type &pyr)
29 {
30   if (this!=&rigth)
31   {
32     Base_::operator=(pyr) ;
33     vertex_sequence_iterator first_vertex=this->base_map().begin_vertex_sequence(),
34                              last_vertex=this->base_map().end_vertex_sequence();
35     edge_sequence_iterator firstEdge=this->base_map().begin_edge_sequence(),
36                            lastEdge=this->base_map().end_edge_sequence();
37     face_sequence_iterator firstFace=this->base_map().begin_face_sequence(),
38                            lastFace=this->base_map().end_face_sequence();
39     for (int i=0; i<level_.size(); ++i)
40     {
41 #if 0
42       first_vertex=&this->base_map().vertex((*pyr.level_[i].begin_base_vertex())->index()) ;
43 #endif // 0
44       last_vertex=this->base_map().begin_vertex_sequence()+(pyr.level(i).end_base_vertex()-pyr.base_map().begin_vertex_sequence()) ;
45       level(i).set_vertex_sequence(first_vertex,last_vertex) ;
46 #if 0
47       firstEdge=&this->base_map().edge((*pyr.level_[i].beginbase_edge())->index()) ;
48 #endif // 0
49       lastEdge=this->base_map().begin_edge_sequence()+(pyr.level(i).endbase_edge()-pyr.base_map().begin_edge_sequence()) ;
50       level(i).set_edge_sequence(firstEdge,lastEdge) ;
51 #if 0
52       firstFace=&this->base_map().face((*pyr.level_[i].beginbase_type())->index()) ;
53 #endif // 0
54       lastFace=this->base_map().begin_face_sequence()+(pyr.level(i).endbase_type()-pyr.base_map().begin_face_sequence()) ;
55       level(i).set_face_sequence(firstFace,lastFace) ;
56     }
57   }
58   return *this ;
59 }
60 #endif // 0
61 
62 template <class TLevel>
valid()63 bool vpyr_2_tpyramid<TLevel>::valid()
64 {
65   return false;
66 }
67 
68 template <class TLevel>
clear()69 void vpyr_2_tpyramid<TLevel>::clear()
70 {
71   Base_::clear();
72 }
73 
74 template <class TLevel>
read_structure(std::istream &)75 void vpyr_2_tpyramid<TLevel>::read_structure(std::istream &)
76 {
77   std::cerr << "vpyr_2_tpyramid<TLevel>::read_structure NYI\n";
78 }
79 
80 template <class TLevel>
write_structure(std::ostream &) const81 void vpyr_2_tpyramid<TLevel>::write_structure(std::ostream &) const
82 {
83   std::cerr << "vpyr_2_tpyramid<TLevel>::write_structure NYI\n";
84 }
85 
86 template <class TLevel>
down_projection_vertices(vmap_level_index arg_level,std::vector<vmap_vertex_index> & res) const87 void vpyr_2_tpyramid<TLevel>::down_projection_vertices(vmap_level_index arg_level,std::vector<vmap_vertex_index> & res) const
88 {
89   vbl_controlled_partition h ;
90   vmap_vertex_index v ;
91   h.initialise(this->base_map().nb_vertices()) ;
92   res.resize(this->base_map().nb_vertices()) ;
93   for (v=0; v<this->base_map().nb_vertices(); v++)
94   {
95     const base_vertex_type & rv=this->base_map().vertex(v) ;
96     if (rv.last_level()<arg_level)
97     {
98       vmap_2_map_dart_base_iterator d=rv.begin(), end=d ;
99       do
100       {
101         vmap_level_index l=d->last_level() ;
102         if (l<arg_level && vmap_is_contraction_type(l) && d->modified_at_last_level())
103         {
104           vmap_2_map_dart_base_iterator ad=d ; ad.alpha() ;
105           vmap_vertex_index av=h.representative(ad->vertex().sequence_index()),
106                             representativev=h.representative(v) ;
107           if (this->base_map().vertex(representativev).last_level()>this->base_map().vertex(av).last_level())
108           {
109             h.union_of(representativev,av) ;
110           }
111           else
112           {
113             h.union_of(av,representativev) ;
114           }
115         }
116         d.sigma() ;
117       } while (d!=end) ;
118     }
119   }
120   for (v=0; v<this->base_map().nb_vertices(); v++)
121   {
122     res[v]=h.representative(v) ;
123   }
124 }
125 
126 template <class TLevel>
down_projection_faces(vmap_level_index arg_level,std::vector<vmap_face_index> & res) const127 void vpyr_2_tpyramid<TLevel>::down_projection_faces(vmap_level_index arg_level,std::vector<vmap_face_index> & res) const
128 {
129   vbl_controlled_partition h ;
130   vmap_face_index v ;
131   h.initialise(this->base_map().nb_faces()) ;
132   res.resize(this->base_map().nb_faces()) ;
133   for (v=0; v<this->base_map().nb_faces(); v++)
134   {
135     const base_face_type & rv=this->base_map().face(v) ;
136     if (rv.last_level()<arg_level)
137     {
138       vmap_2_map_dart_base_iterator d=rv.begin(), end=d ;
139       do
140       {
141         vmap_level_index l=d->last_level() ;
142         if (l<arg_level && vmap_is_removal_type(l) && d->modified_at_last_level())
143         {
144           vmap_2_map_dart_base_iterator ad=d ; ad.alpha() ;
145           vmap_face_index av=h.representative(ad->face().sequence_index()),
146                           representativev=h.representative(v) ;
147           if (this->base_map().face(representativev).last_level()>this->base_map().face(av).last_level())
148           {
149             h.union_of(representativev,av) ;
150           }
151           else
152           {
153             h.union_of(av,representativev) ;
154           }
155         }
156         d.phi() ;
157       } while (d!=end) ;
158     }
159   }
160   for (v=0; v<this->base_map().nb_faces(); v++)
161   {
162     res[v]=h.representative(v) ;
163   }
164 }
165 
166 #endif // vpyr_2_tpyramid_hxx_
167