35 #ifndef HEXAHEDRALMESHTOPOLOGYKERNEL_HH 36 #define HEXAHEDRALMESHTOPOLOGYKERNEL_HH 43 #include "../Core/TopologyKernel.hh" 44 #include "HexahedralMeshIterators.hh" 82 static const unsigned char XF = 0;
83 static const unsigned char XB = 1;
84 static const unsigned char YF = 2;
85 static const unsigned char YB = 3;
86 static const unsigned char ZF = 4;
87 static const unsigned char ZB = 5;
88 static const unsigned char INVALID = 6;
90 static inline unsigned char opposite_orientation(
const unsigned char _d) {
91 return static_cast<unsigned char>(_d % 2 == 0 ? _d + 1 : _d - 1);
101 FaceHandle add_face(
const std::vector<HalfEdgeHandle>& _halfedges,
bool _topologyCheck =
false)
override;
107 CellHandle add_cell(
const std::vector<HalfFaceHandle>& _halffaces,
bool _topologyCheck =
false)
override;
111 bool check_halfface_ordering(
const std::vector<HalfFaceHandle>& _hfs)
const;
135 CellHandle add_cell(
const std::vector<VertexHandle>& _vertices,
bool _topologyCheck =
false);
139 friend class CellSheetCellIter;
140 friend class HalfFaceSheetHalfFaceIter;
141 friend class HexVertexIter;
143 typedef class CellSheetCellIter CellSheetCellIter;
144 typedef class HalfFaceSheetHalfFaceIter HalfFaceSheetHalfFaceIter;
145 typedef class HexVertexIter HexVertexIter;
147 CellSheetCellIter csc_iter(
const CellHandle& _ref_h,
const unsigned char _orthDir,
int _max_laps = 1)
const {
148 return CellSheetCellIter(_ref_h, _orthDir,
this, _max_laps);
151 std::pair<CellSheetCellIter,CellSheetCellIter> cell_sheet_cells(
const CellHandle& _ref_h,
const unsigned char _orthDir,
int _max_laps = 1)
const {
152 CellSheetCellIter begin = csc_iter(_ref_h, _orthDir, _max_laps);
153 CellSheetCellIter end = make_end_circulator(begin);
154 return std::make_pair(begin, end);
157 HalfFaceSheetHalfFaceIter hfshf_iter(
const HalfFaceHandle& _ref_h,
int _max_laps = 1)
const {
158 return HalfFaceSheetHalfFaceIter(_ref_h,
this, _max_laps);
161 std::pair<HalfFaceSheetHalfFaceIter,HalfFaceSheetHalfFaceIter> halfface_sheet_halffaces(
const HalfFaceHandle& _ref_h,
int _max_laps = 1)
const {
162 HalfFaceSheetHalfFaceIter begin = hfshf_iter(_ref_h, _max_laps);
163 HalfFaceSheetHalfFaceIter end = make_end_circulator(begin);
164 return std::make_pair(begin, end);
167 HexVertexIter hv_iter(
const CellHandle& _ref_h,
int _max_laps = 1)
const {
168 return HexVertexIter(_ref_h,
this, _max_laps);
171 std::pair<HexVertexIter,HexVertexIter> hex_vertices(
const CellHandle& _ref_h,
int _max_laps = 1)
const {
172 HexVertexIter begin = hv_iter(_ref_h, _max_laps);
173 HexVertexIter end = make_end_circulator(begin);
174 return std::make_pair(begin, end);
181 assert((
unsigned int)_ch.idx() < TopologyKernel::cells_.size());
183 if(orientation(_hfh, _ch) == XF)
return xback_halfface(_ch);
184 if(orientation(_hfh, _ch) == XB)
return xfront_halfface(_ch);
185 if(orientation(_hfh, _ch) == YF)
return yback_halfface(_ch);
186 if(orientation(_hfh, _ch) == YB)
return yfront_halfface(_ch);
187 if(orientation(_hfh, _ch) == ZF)
return zback_halfface(_ch);
188 if(orientation(_hfh, _ch) == ZB)
return zfront_halfface(_ch);
190 return TopologyKernel::InvalidHalfFaceHandle;
195 assert((
unsigned int)_ch.idx() < TopologyKernel::cells_.size());
202 assert((
unsigned int)_ch.idx() < TopologyKernel::cells_.size());
209 assert((
unsigned int)_ch.idx() < TopologyKernel::cells_.size());
216 assert((
unsigned int)_ch.idx() < TopologyKernel::cells_.size());
223 assert((
unsigned int)_ch.idx() < TopologyKernel::cells_.size());
230 assert((
unsigned int)_ch.idx() < TopologyKernel::cells_.size());
237 assert((
unsigned int)_ch.idx() < TopologyKernel::cells_.size());
240 for(
unsigned int i = 0; i < halffaces.size(); ++i) {
241 if(halffaces[i] == _hfh)
return (
unsigned char)i;
247 static inline unsigned char orthogonal_orientation(
const unsigned char _o1,
const unsigned char _o2) {
249 if(_o1 == XF && _o2 == YF)
return ZF;
250 if(_o1 == XF && _o2 == YB)
return ZB;
251 if(_o1 == XF && _o2 == ZF)
return YB;
252 if(_o1 == XF && _o2 == ZB)
return YF;
253 if(_o1 == XB && _o2 == YF)
return ZB;
254 if(_o1 == XB && _o2 == YB)
return ZF;
255 if(_o1 == XB && _o2 == ZF)
return YF;
256 if(_o1 == XB && _o2 == ZB)
return YB;
258 if(_o1 == YF && _o2 == XF)
return ZB;
259 if(_o1 == YF && _o2 == XB)
return ZF;
260 if(_o1 == YF && _o2 == ZF)
return XF;
261 if(_o1 == YF && _o2 == ZB)
return XB;
262 if(_o1 == YB && _o2 == XF)
return ZF;
263 if(_o1 == YB && _o2 == XB)
return ZB;
264 if(_o1 == YB && _o2 == ZF)
return XB;
265 if(_o1 == YB && _o2 == ZB)
return XF;
267 if(_o1 == ZF && _o2 == YF)
return XB;
268 if(_o1 == ZF && _o2 == YB)
return XF;
269 if(_o1 == ZF && _o2 == XF)
return YF;
270 if(_o1 == ZF && _o2 == XB)
return YB;
271 if(_o1 == ZB && _o2 == YF)
return XF;
272 if(_o1 == ZB && _o2 == YB)
return XB;
273 if(_o1 == ZB && _o2 == XF)
return YB;
274 if(_o1 == ZB && _o2 == XB)
return YF;
282 if(_o == XF)
return xfront_halfface(_ch);
283 if(_o == XB)
return xback_halfface(_ch);
284 if(_o == YF)
return yfront_halfface(_ch);
285 if(_o == YB)
return yback_halfface(_ch);
286 if(_o == ZF)
return zfront_halfface(_ch);
287 if(_o == ZB)
return zback_halfface(_ch);
288 return TopologyKernel::InvalidHalfFaceHandle;
293 if(!TopologyKernel::has_face_bottom_up_incidences()) {
295 std::cerr <<
"No bottom-up incidences computed so far, could not get adjacent halfface on sheet!" << std::endl;
297 return TopologyKernel::InvalidHalfFaceHandle;
306 if(n_hf == TopologyKernel::InvalidHalfFaceHandle)
break;
307 n_hf = TopologyKernel::opposite_halfface_handle(n_hf);
308 if(n_hf == TopologyKernel::InvalidHalfFaceHandle)
break;
309 HalfEdgeHandle o_he = TopologyKernel::opposite_halfedge_handle(n_he);
310 if(o_he == TopologyKernel::InvalidHalfEdgeHandle)
break;
312 if(n_hf == TopologyKernel::InvalidHalfFaceHandle)
break;
316 n_hf = TopologyKernel::opposite_halfface_handle(_hfh);
317 n_he = TopologyKernel::opposite_halfedge_handle(_heh);
322 if(n_hf == TopologyKernel::InvalidHalfFaceHandle)
break;
323 n_hf = TopologyKernel::opposite_halfface_handle(n_hf);
324 if(n_hf == TopologyKernel::InvalidHalfFaceHandle)
break;
325 HalfEdgeHandle o_he = TopologyKernel::opposite_halfedge_handle(n_he);
326 if(o_he == TopologyKernel::InvalidHalfEdgeHandle)
break;
328 if(n_hf == TopologyKernel::InvalidHalfFaceHandle)
break;
329 else return TopologyKernel::opposite_halfface_handle(n_hf);
332 return TopologyKernel::InvalidHalfFaceHandle;
338 hehf_it.valid(); ++hehf_it) {
339 if(*hehf_it == _hfh)
continue;
340 if(TopologyKernel::is_boundary(*hehf_it)) {
343 if(TopologyKernel::is_boundary(TopologyKernel::opposite_halfface_handle(*hehf_it))) {
344 return TopologyKernel::opposite_halfface_handle(*hehf_it);
347 return TopologyKernel::InvalidHalfFaceHandle;
352 if(!TopologyKernel::has_face_bottom_up_incidences()) {
354 std::cerr <<
"No bottom-up incidences computed so far, could not get neighboring outside halfface!" << std::endl;
356 return TopologyKernel::InvalidHalfFaceHandle;
360 hehf_it; ++hehf_it) {
361 if(*hehf_it == _hfh)
continue;
362 if(TopologyKernel::is_boundary(*hehf_it))
return *hehf_it;
363 if(TopologyKernel::is_boundary(TopologyKernel::opposite_halfface_handle(*hehf_it)))
364 return TopologyKernel::opposite_halfface_handle(*hehf_it);
367 return TopologyKernel::InvalidHalfFaceHandle;
373 const std::vector<HalfFaceHandle>& _halffaces)
const;
A data structure basing on PolyhedralMesh with specializations for hexahedra.
CellHandle add_cell(const std::vector< HalfFaceHandle > &_halffaces, bool _topologyCheck=false) override
Overridden function.
HalfFaceHandle adjacent_halfface_in_cell(const HalfFaceHandle &_halfFaceHandle, const HalfEdgeHandle &_halfEdgeHandle) const
Get halfface that is adjacent (w.r.t. a common halfedge) within the same cell.
FaceHandle add_face(const std::vector< HalfEdgeHandle > &_halfedges, bool _topologyCheck=false) override
Add face via incident edges.
const Cell & cell(const CellHandle &_cellHandle) const
Get cell with handle _cellHandle.