53 #define OPENMESH_SUBDIVIDER_ADAPTIVE_RULEST_CC
59 #include <OpenMesh/Core/IO/MeshIO.hh>
62 #if defined(OM_CC_MIPS)
68 #if defined(OM_CC_MSVC)
69 # pragma warning(disable:4244)
75 namespace Subdivider {
81 #define MOBJ Base::mesh_.data
82 #define FH face_handle
83 #define VH vertex_handle
84 #define EH edge_handle
85 #define HEH halfedge_handle
86 #define NHEH next_halfedge_handle
87 #define PHEH prev_halfedge_handle
88 #define OHEH opposite_halfedge_handle
89 #define TVH to_vertex_handle
90 #define FVH from_vertex_handle
99 if (MOBJ(_fh).state() < _target_state)
101 this->update(_fh, _target_state);
103 typename M::VertexVertexIter vv_it;
104 typename M::FaceVertexIter fv_it;
105 typename M::VertexHandle vh;
106 typename M::Point position(0.0, 0.0, 0.0);
107 typename M::Point face_position;
108 const typename M::Point zero_point(0.0, 0.0, 0.0);
109 std::vector<typename M::VertexHandle> vertex_vector;
113 for (fv_it = Base::mesh_.fv_iter(_fh); fv_it; ++fv_it) {
115 vertex_vector.push_back(fv_it.handle());
118 while(!vertex_vector.empty()) {
120 vh = vertex_vector.back();
121 vertex_vector.pop_back();
123 if (_target_state > 1)
124 Base::prev_rule()->raise(vh, _target_state - 1);
127 face_position = MOBJ(_fh).position(_target_state - 1);
129 typename M::EdgeHandle eh;
130 std::vector<typename M::EdgeHandle> edge_vector;
133 if (!Base::mesh_.is_boundary(_fh) || MOBJ(_fh).
final()) {
136 vh = Base::mesh_.new_vertex();
138 Base::mesh_.split(_fh, vh);
141 for (vv_it = Base::mesh_.vv_iter(vh); vv_it; ++vv_it)
143 position += Base::mesh_.point(vv_it.handle());
150 Base::mesh_.set_point(vh, position);
151 MOBJ(vh).set_position(_target_state, zero_point);
152 MOBJ(vh).set_state(_target_state);
153 MOBJ(vh).set_not_final();
155 typename M::VertexOHalfedgeIter voh_it;
157 for (voh_it = Base::mesh_.voh_iter(vh); voh_it; ++voh_it) {
159 if (Base::mesh_.FH(voh_it.handle()).is_valid()) {
161 MOBJ(Base::mesh_.FH(voh_it.handle())).set_state(_target_state);
162 MOBJ(Base::mesh_.FH(voh_it.handle())).set_not_final();
163 MOBJ(Base::mesh_.FH(voh_it.handle())).set_position(_target_state - 1, face_position);
166 for (
state_t j = 0; j < _target_state; ++j) {
167 MOBJ(Base::mesh_.FH(voh_it.handle())).set_position(j, MOBJ(_fh).position(j));
170 if (Base::mesh_.FH(Base::mesh_.OHEH(Base::mesh_.NHEH(voh_it.handle()))).is_valid()) {
172 if (MOBJ(Base::mesh_.FH(Base::mesh_.OHEH(Base::mesh_.NHEH(voh_it.handle())))).state() == _target_state) {
174 if (Base::mesh_.is_flip_ok(Base::mesh_.EH(Base::mesh_.NHEH(voh_it.handle())))) {
176 edge_vector.push_back(Base::mesh_.EH(Base::mesh_.NHEH(voh_it.handle())));
187 typename M::VertexHandle vh1 = Base::mesh_.new_vertex(),
188 vh2 = Base::mesh_.new_vertex();
190 typename M::HalfedgeHandle hh2 = Base::mesh_.HEH(_fh),
193 while (!Base::mesh_.is_boundary(Base::mesh_.OHEH(hh2)))
194 hh2 = Base::mesh_.NHEH(hh2);
196 eh = Base::mesh_.EH(hh2);
198 hh2 = Base::mesh_.NHEH(hh2);
199 hh1 = Base::mesh_.NHEH(hh2);
201 assert(Base::mesh_.is_boundary(eh));
203 Base::mesh_.split(eh, vh1);
205 eh = Base::mesh_.EH(Base::mesh_.PHEH(hh2));
207 assert(Base::mesh_.is_boundary(eh));
209 Base::mesh_.split(eh, vh2);
211 hh3 = Base::mesh_.NHEH(Base::mesh_.OHEH(Base::mesh_.PHEH(hh1)));
213 typename M::VertexHandle vh0(Base::mesh_.TVH(hh1)),
214 vh3(Base::mesh_.FVH(hh2));
217 Base::mesh_.set_point(vh1, (Base::mesh_.point(vh0) * 2.0 + Base::mesh_.point(vh3)) / 3.0);
219 MOBJ(vh1).set_position(_target_state, zero_point);
220 MOBJ(vh1).set_state(_target_state);
221 MOBJ(vh1).set_not_final();
223 MOBJ(vh0).set_position(_target_state, MOBJ(vh0).position(_target_state - 1) * 3.0);
224 MOBJ(vh0).set_state(_target_state);
225 MOBJ(vh0).set_not_final();
228 Base::mesh_.set_point(vh2, (Base::mesh_.point(vh3) * 2.0 + Base::mesh_.point(vh0)) / 3.0);
229 MOBJ(vh2).set_position(_target_state, zero_point);
230 MOBJ(vh2).set_state(_target_state);
231 MOBJ(vh2).set_not_final();
233 MOBJ(vh3).set_position(_target_state, MOBJ(vh3).position(_target_state - 1) * 3.0);
234 MOBJ(vh3).set_state(_target_state);
235 MOBJ(vh3).set_not_final();
238 MOBJ(Base::mesh_.FH(hh1)).set_state(_target_state);
239 MOBJ(Base::mesh_.FH(hh1)).set_not_final();
240 MOBJ(Base::mesh_.FH(hh1)).set_position(_target_state - 1, face_position);
242 MOBJ(Base::mesh_.FH(hh2)).set_state(_target_state);
243 MOBJ(Base::mesh_.FH(hh2)).set_not_final();
244 MOBJ(Base::mesh_.FH(hh2)).set_position(_target_state - 1, face_position);
246 MOBJ(Base::mesh_.FH(hh3)).set_state(_target_state);
247 MOBJ(Base::mesh_.FH(hh3)).set_final();
248 MOBJ(Base::mesh_.FH(hh3)).set_position(_target_state - 1, face_position);
251 for (
state_t j = 0; j < _target_state; ++j) {
252 MOBJ(Base::mesh_.FH(hh1)).set_position(j, MOBJ(_fh).position(j));
255 for (
state_t j = 0; j < _target_state; ++j) {
257 MOBJ(Base::mesh_.FH(hh2)).set_position(j, MOBJ(_fh).position(j));
260 for (
state_t j = 0; j < _target_state; ++j) {
262 MOBJ(Base::mesh_.FH(hh3)).set_position(j, MOBJ(_fh).position(j));
266 if (Base::mesh_.FH(Base::mesh_.OHEH(hh1)).is_valid()) {
268 if (MOBJ(Base::mesh_.FH(Base::mesh_.OHEH(hh1))).state() == _target_state) {
270 if (Base::mesh_.is_flip_ok(Base::mesh_.EH(hh1))) {
272 edge_vector.push_back(Base::mesh_.EH(hh1));
277 if (Base::mesh_.FH(Base::mesh_.OHEH(hh2)).is_valid()) {
279 if (MOBJ(Base::mesh_.FH(Base::mesh_.OHEH(hh2))).state() == _target_state) {
281 if (Base::mesh_.is_flip_ok(Base::mesh_.EH(hh2))) {
283 edge_vector.push_back(Base::mesh_.EH(hh2));
290 while (!edge_vector.empty()) {
292 eh = edge_vector.back();
293 edge_vector.pop_back();
295 assert(Base::mesh_.is_flip_ok(eh));
297 Base::mesh_.flip(eh);
299 MOBJ(Base::mesh_.FH(Base::mesh_.HEH(eh, 0))).set_final();
300 MOBJ(Base::mesh_.FH(Base::mesh_.HEH(eh, 1))).set_final();
302 MOBJ(Base::mesh_.FH(Base::mesh_.HEH(eh, 0))).set_state(_target_state);
303 MOBJ(Base::mesh_.FH(Base::mesh_.HEH(eh, 1))).set_state(_target_state);
305 MOBJ(Base::mesh_.FH(Base::mesh_.HEH(eh, 0))).set_position(_target_state, face_position);
306 MOBJ(Base::mesh_.FH(Base::mesh_.HEH(eh, 1))).set_position(_target_state, face_position);
315 if (MOBJ(_vh).state() < _target_state) {
317 this->update(_vh, _target_state);
320 MOBJ(_vh).set_position(_target_state, MOBJ(_vh).position(_target_state - 1) * 3.0);
322 MOBJ(_vh).inc_state();
324 assert(MOBJ(_vh).state() == _target_state);
337 if (MOBJ(_fh).state() < _target_state) {
339 this->update(_fh, _target_state);
341 typename M::FaceVertexIter fv_it;
342 typename M::VertexHandle temp_vh;
343 typename M::Point face_position;
344 const typename M::Point zero_point(0.0, 0.0, 0.0);
345 std::vector<typename M::VertexHandle> vertex_vector;
346 std::vector<typename M::HalfedgeHandle> halfedge_vector;
349 for (fv_it = Base::mesh_.fv_iter(_fh); fv_it; ++fv_it) {
351 vertex_vector.push_back(fv_it.handle());
354 while(!vertex_vector.empty()) {
356 temp_vh = vertex_vector.back();
357 vertex_vector.pop_back();
359 if (_target_state > 1) {
360 Base::prev_rule()->raise(temp_vh, _target_state - 1);
364 face_position = MOBJ(_fh).position(_target_state - 1);
366 typename M::HalfedgeHandle hh[3];
367 typename M::VertexHandle vh[3];
368 typename M::VertexHandle new_vh[3];
369 typename M::FaceHandle fh[4];
370 typename M::EdgeHandle eh;
371 typename M::HalfedgeHandle temp_hh;
374 if (MOBJ(_fh).
final()) {
377 hh[0] = Base::mesh_.HEH(_fh);
378 hh[1] = Base::mesh_.NHEH(hh[0]);
379 hh[2] = Base::mesh_.NHEH(hh[1]);
381 assert(hh[0] == Base::mesh_.NHEH(hh[2]));
383 vh[0] = Base::mesh_.TVH(hh[0]);
384 vh[1] = Base::mesh_.TVH(hh[1]);
385 vh[2] = Base::mesh_.TVH(hh[2]);
387 new_vh[0] = Base::mesh_.add_vertex(zero_point);
388 new_vh[1] = Base::mesh_.add_vertex(zero_point);
389 new_vh[2] = Base::mesh_.add_vertex(zero_point);
392 split_edge(hh[0], new_vh[0], _target_state);
393 eh = Base::mesh_.EH(Base::mesh_.PHEH(hh[2]));
394 split_edge(hh[1], new_vh[1], _target_state);
395 split_edge(hh[2], new_vh[2], _target_state);
397 assert(Base::mesh_.FVH(hh[2]) == vh[1]);
398 assert(Base::mesh_.FVH(hh[1]) == vh[0]);
399 assert(Base::mesh_.FVH(hh[0]) == vh[2]);
401 if (Base::mesh_.FH(Base::mesh_.OHEH(hh[0])).is_valid())
403 temp_hh = Base::mesh_.OHEH(Base::mesh_.PHEH(Base::mesh_.OHEH(hh[0])));
404 if (MOBJ(Base::mesh_.FH(temp_hh)).red_halfedge() != temp_hh)
405 halfedge_vector.push_back(temp_hh);
408 if (Base::mesh_.FH(Base::mesh_.OHEH(hh[1])).is_valid()) {
410 temp_hh = Base::mesh_.OHEH(Base::mesh_.PHEH(Base::mesh_.OHEH(hh[1])));
411 if (MOBJ(Base::mesh_.FH(temp_hh)).red_halfedge() != temp_hh)
412 halfedge_vector.push_back(temp_hh);
415 if (Base::mesh_.FH(Base::mesh_.OHEH(hh[2])).is_valid()) {
417 temp_hh = Base::mesh_.OHEH(Base::mesh_.PHEH(Base::mesh_.OHEH(hh[2])));
418 if (MOBJ(Base::mesh_.FH(temp_hh)).red_halfedge() != temp_hh)
419 halfedge_vector.push_back(temp_hh);
427 typename M::HalfedgeHandle red_hh(MOBJ(_fh).red_halfedge());
429 if (Base::mesh_.FH(Base::mesh_.OHEH(Base::mesh_.PHEH(red_hh))).is_valid()
430 && Base::mesh_.FH(Base::mesh_.OHEH(Base::mesh_.NHEH(Base::mesh_.OHEH(red_hh)))).is_valid()
431 && MOBJ(Base::mesh_.FH(Base::mesh_.OHEH(Base::mesh_.PHEH(red_hh)))).red_halfedge() == red_hh
432 && MOBJ(Base::mesh_.FH(Base::mesh_.OHEH(Base::mesh_.NHEH(Base::mesh_.OHEH(red_hh))))).red_halfedge() == red_hh)
436 vh[0] = Base::mesh_.TVH(Base::mesh_.NHEH(Base::mesh_.OHEH(Base::mesh_.NHEH(Base::mesh_.OHEH(red_hh)))));
437 vh[1] = Base::mesh_.TVH(red_hh);
438 vh[2] = Base::mesh_.TVH(Base::mesh_.NHEH(Base::mesh_.OHEH(Base::mesh_.PHEH(red_hh))));
440 new_vh[0] = Base::mesh_.FVH(red_hh);
441 new_vh[1] = Base::mesh_.TVH(Base::mesh_.NHEH(Base::mesh_.OHEH(red_hh)));
442 new_vh[2] = Base::mesh_.TVH(Base::mesh_.NHEH(red_hh));
444 hh[0] = Base::mesh_.PHEH(Base::mesh_.OHEH(Base::mesh_.PHEH(red_hh)));
445 hh[1] = Base::mesh_.PHEH(Base::mesh_.OHEH(Base::mesh_.NHEH(Base::mesh_.OHEH(red_hh))));
446 hh[2] = Base::mesh_.NHEH(red_hh);
448 eh = Base::mesh_.EH(red_hh);
454 if ((Base::mesh_.FH(Base::mesh_.OHEH(Base::mesh_.PHEH(red_hh))).is_valid() &&
455 MOBJ(Base::mesh_.FH(Base::mesh_.OHEH(Base::mesh_.PHEH(red_hh)))).red_halfedge()
457 || (Base::mesh_.FH(Base::mesh_.OHEH(Base::mesh_.NHEH(Base::mesh_.OHEH(red_hh)))).is_valid()
458 && MOBJ(Base::mesh_.FH(Base::mesh_.OHEH(Base::mesh_.NHEH(Base::mesh_.OHEH(red_hh))))).red_halfedge() == red_hh))
462 if (MOBJ(Base::mesh_.FH(Base::mesh_.OHEH(Base::mesh_.PHEH(red_hh)))).red_halfedge() == red_hh)
465 vh[0] = Base::mesh_.TVH(Base::mesh_.NHEH(Base::mesh_.OHEH(red_hh)));
466 vh[1] = Base::mesh_.TVH(red_hh);
467 vh[2] = Base::mesh_.TVH(Base::mesh_.NHEH(Base::mesh_.OHEH(Base::mesh_.PHEH(red_hh))));
469 new_vh[0] = Base::mesh_.FVH(red_hh);
470 new_vh[1] = Base::mesh_.add_vertex(zero_point);
471 new_vh[2] = Base::mesh_.TVH(Base::mesh_.NHEH(red_hh));
473 hh[0] = Base::mesh_.PHEH(Base::mesh_.OHEH(Base::mesh_.PHEH(red_hh)));
474 hh[1] = Base::mesh_.PHEH(Base::mesh_.OHEH(red_hh));
475 hh[2] = Base::mesh_.NHEH(red_hh);
478 eh = Base::mesh_.EH(red_hh);
480 split_edge(hh[1], new_vh[1], _target_state);
482 assert(Base::mesh_.FVH(hh[2]) == vh[1]);
483 assert(Base::mesh_.FVH(hh[1]) == vh[0]);
484 assert(Base::mesh_.FVH(hh[0]) == vh[2]);
486 if (Base::mesh_.FH(Base::mesh_.OHEH(hh[1])).is_valid())
488 temp_hh = Base::mesh_.OHEH(Base::mesh_.PHEH(Base::mesh_.OHEH(hh[1])));
489 if (MOBJ(Base::mesh_.FH(temp_hh)).red_halfedge() != temp_hh)
490 halfedge_vector.push_back(temp_hh);
497 vh[0] = Base::mesh_.TVH(Base::mesh_.NHEH(Base::mesh_.OHEH(Base::mesh_.NHEH(Base::mesh_.OHEH(red_hh)))));
498 vh[1] = Base::mesh_.TVH(red_hh);
499 vh[2] = Base::mesh_.TVH(Base::mesh_.NHEH(red_hh));
501 new_vh[0] = Base::mesh_.FVH(red_hh);
502 new_vh[1] = Base::mesh_.TVH(Base::mesh_.NHEH(Base::mesh_.OHEH(red_hh)));
503 new_vh[2] = Base::mesh_.add_vertex(zero_point);
505 hh[0] = Base::mesh_.PHEH(red_hh);
506 hh[1] = Base::mesh_.PHEH(Base::mesh_.OHEH(Base::mesh_.NHEH(Base::mesh_.OHEH(red_hh))));
507 hh[2] = Base::mesh_.NHEH(red_hh);
510 eh = Base::mesh_.EH(red_hh);
512 split_edge(hh[2], new_vh[2], _target_state);
514 assert(Base::mesh_.FVH(hh[2]) == vh[1]);
515 assert(Base::mesh_.FVH(hh[1]) == vh[0]);
516 assert(Base::mesh_.FVH(hh[0]) == vh[2]);
518 if (Base::mesh_.FH(Base::mesh_.OHEH(hh[2])).is_valid()) {
520 temp_hh = Base::mesh_.OHEH(Base::mesh_.PHEH(Base::mesh_.OHEH(hh[2])));
521 if (MOBJ(Base::mesh_.FH(temp_hh)).red_halfedge() != temp_hh)
522 halfedge_vector.push_back(temp_hh);
530 vh[0] = Base::mesh_.TVH(Base::mesh_.NHEH(Base::mesh_.OHEH(red_hh)));
531 vh[1] = Base::mesh_.TVH(red_hh);
532 vh[2] = Base::mesh_.TVH(Base::mesh_.NHEH(red_hh));
534 new_vh[0] = Base::mesh_.FVH(red_hh);
535 new_vh[1] = Base::mesh_.add_vertex(zero_point);
536 new_vh[2] = Base::mesh_.add_vertex(zero_point);
538 hh[0] = Base::mesh_.PHEH(red_hh);
539 hh[1] = Base::mesh_.PHEH(Base::mesh_.OHEH(red_hh));
540 hh[2] = Base::mesh_.NHEH(red_hh);
543 eh = Base::mesh_.EH(red_hh);
545 split_edge(hh[1], new_vh[1], _target_state);
546 split_edge(hh[2], new_vh[2], _target_state);
548 assert(Base::mesh_.FVH(hh[2]) == vh[1]);
549 assert(Base::mesh_.FVH(hh[1]) == vh[0]);
550 assert(Base::mesh_.FVH(hh[0]) == vh[2]);
552 if (Base::mesh_.FH(Base::mesh_.OHEH(hh[1])).is_valid()) {
554 temp_hh = Base::mesh_.OHEH(Base::mesh_.PHEH(Base::mesh_.OHEH(hh[1])));
555 if (MOBJ(Base::mesh_.FH(temp_hh)).red_halfedge() != temp_hh)
556 halfedge_vector.push_back(temp_hh);
559 if (Base::mesh_.FH(Base::mesh_.OHEH(hh[2])).is_valid()) {
561 temp_hh = Base::mesh_.OHEH(Base::mesh_.PHEH(Base::mesh_.OHEH(hh[2])));
562 if (MOBJ(Base::mesh_.FH(temp_hh)).red_halfedge() != temp_hh)
563 halfedge_vector.push_back(temp_hh);
572 if (Base::mesh_.is_flip_ok(eh)) {
574 Base::mesh_.flip(eh);
578 fh[0] = Base::mesh_.FH(hh[0]);
579 fh[1] = Base::mesh_.FH(hh[1]);
580 fh[2] = Base::mesh_.FH(hh[2]);
581 fh[3] = Base::mesh_.FH(Base::mesh_.OHEH(Base::mesh_.NHEH(hh[0])));
583 assert(_fh == fh[0] || _fh == fh[1] || _fh == fh[2] || _fh == fh[3]);
586 for (
int i = 0; i <= 3; ++i) {
588 MOBJ(fh[i]).set_state(_target_state);
589 MOBJ(fh[i]).set_final();
590 MOBJ(fh[i]).set_position(_target_state, face_position);
591 MOBJ(fh[i]).set_red_halfedge(Base::mesh_.InvalidHalfedgeHandle);
595 for (
int i = 0; i <= 2; ++i) {
597 MOBJ(new_vh[i]).set_position(_target_state, zero_point);
598 MOBJ(new_vh[i]).set_state(_target_state);
599 MOBJ(new_vh[i]).set_not_final();
601 Base::mesh_.set_point(new_vh[i], (Base::mesh_.point(vh[i]) + Base::mesh_.point(vh[(i + 2) % 3])) * 0.5);
603 MOBJ(Base::mesh_.EH(hh[i])).set_state(_target_state);
604 MOBJ(Base::mesh_.EH(hh[i])).set_position(_target_state, zero_point);
605 MOBJ(Base::mesh_.EH(hh[i])).set_final();
607 MOBJ(Base::mesh_.EH(Base::mesh_.NHEH(hh[i]))).set_state(_target_state);
608 MOBJ(Base::mesh_.EH(Base::mesh_.NHEH(hh[i]))).set_position(_target_state, zero_point);
609 MOBJ(Base::mesh_.EH(Base::mesh_.NHEH(hh[i]))).set_final();
611 MOBJ(Base::mesh_.EH(Base::mesh_.PHEH(hh[i]))).set_state(_target_state);
612 MOBJ(Base::mesh_.EH(Base::mesh_.PHEH(hh[i]))).set_position(_target_state, zero_point);
613 MOBJ(Base::mesh_.EH(Base::mesh_.PHEH(hh[i]))).set_final();
617 while (!halfedge_vector.empty()) {
619 temp_hh = halfedge_vector.back();
620 halfedge_vector.pop_back();
622 check_edge(temp_hh, _target_state);
625 assert(MOBJ(fh[0]).state() == _target_state);
626 assert(MOBJ(fh[1]).state() == _target_state);
627 assert(MOBJ(fh[2]).state() == _target_state);
628 assert(MOBJ(fh[3]).state() == _target_state);
638 if (MOBJ(_vh).state() < _target_state)
641 this->update(_vh, _target_state);
644 MOBJ(_vh).set_position(_target_state, MOBJ(_vh).position(_target_state - 1) * 4.0);
646 MOBJ(_vh).inc_state();
655 if (MOBJ(_eh).state() < _target_state)
657 this->update(_eh, _target_state);
659 typename M::FaceHandle fh(Base::mesh_.FH(Base::mesh_.HEH(_eh, 0)));
662 fh=Base::mesh_.FH(Base::mesh_.HEH(_eh, 1));
664 raise(fh, _target_state);
666 assert(MOBJ(_eh).state() == _target_state);
670 #ifndef DOXY_IGNORE_THIS
675 typename M::VertexHandle &_vh,
678 typename M::HalfedgeHandle temp_hh;
680 if (Base::mesh_.FH(Base::mesh_.OHEH(_hh)).is_valid())
682 if (!MOBJ(Base::mesh_.FH(Base::mesh_.OHEH(_hh))).
final())
684 if (MOBJ(Base::mesh_.FH(Base::mesh_.OHEH(_hh))).red_halfedge().is_valid())
686 temp_hh = MOBJ(Base::mesh_.FH(Base::mesh_.OHEH(_hh))).red_halfedge();
691 if (MOBJ(Base::mesh_.FH(Base::mesh_.OHEH(Base::mesh_.PHEH(Base::mesh_.OHEH(_hh))))).state()
692 == MOBJ(Base::mesh_.FH(Base::mesh_.OHEH(_hh))).state())
694 temp_hh = Base::mesh_.PHEH(Base::mesh_.OHEH(_hh));
697 else if (MOBJ(Base::mesh_.FH(Base::mesh_.OHEH(Base::mesh_.NHEH(Base::mesh_.OHEH(_hh))))).state()
698 == MOBJ(Base::mesh_.FH(Base::mesh_.OHEH(_hh))).state())
700 temp_hh = Base::mesh_.NHEH(Base::mesh_.OHEH(_hh));
705 temp_hh = Base::mesh_.InvalidHalfedgeHandle;
708 temp_hh = Base::mesh_.InvalidHalfedgeHandle;
711 Base::mesh_.split(Base::mesh_.EH(_hh), _vh);
713 if (Base::mesh_.FVH(_hh) == _vh)
715 MOBJ(Base::mesh_.EH(Base::mesh_.PHEH(Base::mesh_.OHEH(Base::mesh_.PHEH(_hh))))).set_state(MOBJ(Base::mesh_.EH(_hh)).state());
716 _hh = Base::mesh_.PHEH(Base::mesh_.OHEH(Base::mesh_.PHEH(_hh)));
719 if (Base::mesh_.FH(Base::mesh_.OHEH(_hh)).is_valid()) {
721 MOBJ(Base::mesh_.EH(Base::mesh_.PHEH(Base::mesh_.OHEH(_hh)))).set_not_final();
722 MOBJ(Base::mesh_.FH(Base::mesh_.OHEH(_hh))).set_state(_target_state-1);
723 MOBJ(Base::mesh_.FH(Base::mesh_.OHEH(Base::mesh_.NHEH(Base::mesh_.OHEH(Base::mesh_.NHEH(_hh)))))).set_state(_target_state-1);
725 MOBJ(Base::mesh_.FH(Base::mesh_.OHEH(_hh))).set_not_final();
726 MOBJ(Base::mesh_.FH(Base::mesh_.OHEH(Base::mesh_.NHEH(Base::mesh_.OHEH(Base::mesh_.NHEH(_hh)))))).set_not_final();
728 MOBJ(Base::mesh_.EH(Base::mesh_.PHEH(Base::mesh_.OHEH(_hh)))).set_state(_target_state);
730 if (temp_hh.is_valid()) {
732 MOBJ(Base::mesh_.FH(Base::mesh_.OHEH(_hh))).set_red_halfedge(temp_hh);
733 MOBJ(Base::mesh_.FH(Base::mesh_.OHEH(Base::mesh_.NHEH(Base::mesh_.OHEH(Base::mesh_.NHEH(_hh)))))).set_red_halfedge(temp_hh);
737 typename M::FaceHandle
738 fh1(Base::mesh_.FH(Base::mesh_.OHEH(_hh))),
739 fh2(Base::mesh_.FH(Base::mesh_.OHEH(Base::mesh_.NHEH(Base::mesh_.OHEH(Base::mesh_.NHEH(_hh))))));
741 MOBJ(fh1).set_red_halfedge(Base::mesh_.OHEH(Base::mesh_.PHEH(Base::mesh_.OHEH(_hh))));
742 MOBJ(fh2).set_red_halfedge(Base::mesh_.OHEH(Base::mesh_.PHEH(Base::mesh_.OHEH(_hh))));
744 const typename M::Point zero_point(0.0, 0.0, 0.0);
746 MOBJ(fh1).set_position(_target_state - 1, zero_point);
747 MOBJ(fh2).set_position(_target_state - 1, zero_point);
752 MOBJ(Base::mesh_.EH(Base::mesh_.NHEH(Base::mesh_.OHEH(Base::mesh_.NHEH(_hh))))).set_state(_target_state - 1);
753 MOBJ(Base::mesh_.EH(Base::mesh_.NHEH(Base::mesh_.OHEH(Base::mesh_.NHEH(_hh))))).set_final();
755 MOBJ(Base::mesh_.EH(_hh)).set_state(_target_state - 1);
756 MOBJ(Base::mesh_.EH(_hh)).set_final();
761 void Tvv4<M>::check_edge(
const typename M::HalfedgeHandle& _hh,
764 typename M::FaceHandle fh1(Base::mesh_.FH(_hh)),
765 fh2(Base::mesh_.FH(Base::mesh_.OHEH(_hh)));
767 assert(fh1.is_valid());
768 assert(fh2.is_valid());
770 typename M::HalfedgeHandle red_hh(MOBJ(fh1).red_halfedge());
772 if (!MOBJ(fh1).
final()) {
774 assert (MOBJ(fh1).
final() == MOBJ(fh2).
final());
775 assert (!MOBJ(fh1).
final());
776 assert (MOBJ(fh1).red_halfedge() == MOBJ(fh2).red_halfedge());
778 const typename M::Point zero_point(0.0, 0.0, 0.0);
780 MOBJ(fh1).set_position(_target_state - 1, zero_point);
781 MOBJ(fh2).set_position(_target_state - 1, zero_point);
783 assert(red_hh.is_valid());
785 if (!red_hh.is_valid()) {
787 MOBJ(fh1).set_state(_target_state - 1);
788 MOBJ(fh2).set_state(_target_state - 1);
790 MOBJ(fh1).set_red_halfedge(_hh);
791 MOBJ(fh2).set_red_halfedge(_hh);
793 MOBJ(Base::mesh_.EH(_hh)).set_not_final();
794 MOBJ(Base::mesh_.EH(_hh)).set_state(_target_state - 1);
799 MOBJ(Base::mesh_.EH(_hh)).set_not_final();
800 MOBJ(Base::mesh_.EH(_hh)).set_state(_target_state - 1);
802 raise(fh1, _target_state);
804 assert(MOBJ(fh1).state() == _target_state);
814 void VF<M>::raise(
typename M::FaceHandle& _fh,
state_t _target_state)
816 if (MOBJ(_fh).state() < _target_state) {
818 this->update(_fh, _target_state);
821 typename M::FaceVertexIter fv_it;
822 typename M::VertexHandle vh;
823 std::vector<typename M::VertexHandle> vertex_vector;
825 if (_target_state > 1) {
827 for (fv_it = Base::mesh_.fv_iter(_fh); fv_it; ++fv_it) {
829 vertex_vector.push_back(fv_it.handle());
832 while (!vertex_vector.empty()) {
834 vh = vertex_vector.back();
835 vertex_vector.pop_back();
837 Base::prev_rule()->raise(vh, _target_state - 1);
842 typename M::Point position(0.0, 0.0, 0.0);
845 for (fv_it = Base::mesh_.fv_iter(_fh); fv_it; ++fv_it) {
848 position += Base::mesh_.data(fv_it).position(_target_state - 1);
854 if (Base::number() == Base::subdiv_rule()->number() + 1 &&
855 Base::mesh_.is_boundary(_fh) &&
859 MOBJ(_fh).set_position(_target_state, position);
860 MOBJ(_fh).inc_state();
862 assert(_target_state == MOBJ(_fh).state());
871 void FF<M>::raise(
typename M::FaceHandle& _fh,
state_t _target_state) {
873 if (MOBJ(_fh).state() < _target_state) {
875 this->update(_fh, _target_state);
878 typename M::FaceFaceIter ff_it;
879 typename M::FaceHandle fh;
880 std::vector<typename M::FaceHandle> face_vector;
882 if (_target_state > 1) {
884 for (ff_it = Base::mesh_.ff_iter(_fh); ff_it; ++ff_it) {
886 face_vector.push_back(ff_it.handle());
889 while (!face_vector.empty()) {
891 fh = face_vector.back();
892 face_vector.pop_back();
894 Base::prev_rule()->raise(fh, _target_state - 1);
897 for (ff_it = Base::mesh_.ff_iter(_fh); ff_it; ++ff_it) {
899 face_vector.push_back(ff_it.handle());
902 while (!face_vector.empty()) {
904 fh = face_vector.back();
905 face_vector.pop_back();
907 while (MOBJ(fh).state() < _target_state - 1)
908 Base::prev_rule()->raise(fh, _target_state - 1);
913 typename M::Point position(0.0, 0.0, 0.0);
916 for (ff_it = Base::mesh_.ff_iter(_fh); ff_it; ++ff_it) {
920 position += Base::mesh_.data(ff_it).position(_target_state - 1);
925 MOBJ(_fh).set_position(_target_state, position);
926 MOBJ(_fh).inc_state();
935 void FFc<M>::raise(
typename M::FaceHandle& _fh,
state_t _target_state)
937 if (MOBJ(_fh).state() < _target_state) {
939 this->update(_fh, _target_state);
942 typename M::FaceFaceIter ff_it(Base::mesh_.ff_iter(_fh));
943 typename M::FaceHandle fh;
944 std::vector<typename M::FaceHandle> face_vector;
946 if (_target_state > 1)
948 for (; ff_it; ++ff_it)
949 face_vector.push_back(ff_it.handle());
951 while (!face_vector.empty())
953 fh = face_vector.back();
954 face_vector.pop_back();
955 Base::prev_rule()->raise(fh, _target_state - 1);
958 for (ff_it = Base::mesh_.ff_iter(_fh); ff_it; ++ff_it)
959 face_vector.push_back(ff_it.handle());
961 while (!face_vector.empty()) {
963 fh = face_vector.back();
964 face_vector.pop_back();
966 while (MOBJ(fh).state() < _target_state - 1)
967 Base::prev_rule()->raise(fh, _target_state - 1);
972 typename M::Point position(0.0, 0.0, 0.0);
975 for (ff_it = Base::mesh_.ff_iter(_fh); ff_it; ++ff_it)
978 position += Base::mesh_.data(ff_it).position(_target_state - 1);
984 typename M::Scalar c = Base::coeff();
986 position *= (1.0 - c);
987 position += MOBJ(_fh).position(_target_state - 1) * c;
989 MOBJ(_fh).set_position(_target_state, position);
990 MOBJ(_fh).inc_state();
999 void FV<M>::raise(
typename M::VertexHandle& _vh,
state_t _target_state)
1002 if (MOBJ(_vh).state() < _target_state) {
1004 this->update(_vh, _target_state);
1007 typename M::VertexFaceIter vf_it(Base::mesh_.vf_iter(_vh));
1008 typename M::FaceHandle fh;
1009 std::vector<typename M::FaceHandle> face_vector;
1011 if (_target_state > 1) {
1013 for (; vf_it; ++vf_it) {
1015 face_vector.push_back(vf_it.handle());
1018 while (!face_vector.empty()) {
1020 fh = face_vector.back();
1021 face_vector.pop_back();
1023 Base::prev_rule()->raise(fh, _target_state - 1);
1026 for (vf_it = Base::mesh_.vf_iter(_vh); vf_it; ++vf_it) {
1028 face_vector.push_back(vf_it.handle());
1031 while (!face_vector.empty()) {
1033 fh = face_vector.back();
1034 face_vector.pop_back();
1036 while (MOBJ(fh).state() < _target_state - 1)
1037 Base::prev_rule()->raise(fh, _target_state - 1);
1042 typename M::Point position(0.0, 0.0, 0.0);
1045 for (vf_it = Base::mesh_.vf_iter(_vh); vf_it; ++vf_it) {
1048 position += Base::mesh_.data(vf_it).position(_target_state - 1);
1051 position /= valence;
1053 MOBJ(_vh).set_position(_target_state, position);
1054 MOBJ(_vh).inc_state();
1056 if (Base::number() == Base::n_rules() - 1) {
1058 Base::mesh_.set_point(_vh, position);
1059 MOBJ(_vh).set_final();
1069 void FVc<M>::raise(
typename M::VertexHandle& _vh,
state_t _target_state)
1071 if (MOBJ(_vh).state() < _target_state) {
1073 this->update(_vh, _target_state);
1075 typename M::VertexOHalfedgeIter voh_it;
1076 typename M::FaceHandle fh;
1077 std::vector<typename M::FaceHandle> face_vector;
1080 face_vector.clear();
1083 if (_target_state > 1) {
1085 for (voh_it = Base::mesh_.voh_iter(_vh); voh_it; ++voh_it) {
1087 if (Base::mesh_.FH(voh_it.handle()).is_valid()) {
1089 face_vector.push_back(Base::mesh_.FH(voh_it.handle()));
1091 if (Base::mesh_.FH(Base::mesh_.OHEH(Base::mesh_.NHEH(voh_it.handle()))).is_valid()) {
1093 face_vector.push_back(Base::mesh_.FH(Base::mesh_.OHEH(Base::mesh_.NHEH(voh_it.handle()))));
1098 while (!face_vector.empty()) {
1100 fh = face_vector.back();
1101 face_vector.pop_back();
1103 Base::prev_rule()->raise(fh, _target_state - 1);
1106 for (voh_it = Base::mesh_.voh_iter(_vh); voh_it; ++voh_it) {
1108 if (Base::mesh_.FH(voh_it.handle()).is_valid()) {
1110 face_vector.push_back(Base::mesh_.FH(voh_it.handle()));
1112 if (Base::mesh_.FH(Base::mesh_.OHEH(Base::mesh_.NHEH(voh_it.handle()))).is_valid()) {
1114 face_vector.push_back(Base::mesh_.FH(Base::mesh_.OHEH(Base::mesh_.NHEH(voh_it.handle()))));
1119 while (!face_vector.empty()) {
1121 fh = face_vector.back();
1122 face_vector.pop_back();
1124 while (MOBJ(fh).state() < _target_state - 1)
1125 Base::prev_rule()->raise(fh, _target_state - 1);
1128 for (voh_it = Base::mesh_.voh_iter(_vh); voh_it; ++voh_it) {
1130 if (Base::mesh_.FH(voh_it.handle()).is_valid()) {
1132 face_vector.push_back(Base::mesh_.FH(voh_it.handle()));
1134 if (Base::mesh_.FH(Base::mesh_.OHEH(Base::mesh_.NHEH(voh_it.handle()))).is_valid()) {
1136 face_vector.push_back(Base::mesh_.FH(Base::mesh_.OHEH(Base::mesh_.NHEH(voh_it.handle()))));
1141 while (!face_vector.empty()) {
1143 fh = face_vector.back();
1144 face_vector.pop_back();
1146 while (MOBJ(fh).state() < _target_state - 1)
1147 Base::prev_rule()->raise(fh, _target_state - 1);
1152 typename M::Point position(0.0, 0.0, 0.0);
1153 typename M::Scalar c;
1155 const typename M::Scalar _2pi(2.0*M_PI);
1156 const typename M::Scalar _2over3(2.0/3.0);
1158 for (voh_it = Base::mesh_.voh_iter(_vh); voh_it; ++voh_it)
1164 c = _2over3 * ( cos( _2pi / valence) + 1.0);
1166 valence = Base::mesh_.valence(_vh);
1171 for (voh_it = Base::mesh_.voh_iter(_vh); voh_it; ++voh_it) {
1173 fh = Base::mesh_.FH(voh_it.handle());
1175 Base::prev_rule()->raise(fh, _target_state - 1);
1177 fh = Base::mesh_.FH(Base::mesh_.OHEH(Base::mesh_.NHEH(voh_it.handle())));
1179 Base::prev_rule()->raise(fh, _target_state - 1);
1181 if (Base::mesh_.FH(voh_it.handle()).is_valid()) {
1183 if (Base::mesh_.FH(Base::mesh_.OHEH(Base::mesh_.NHEH(voh_it.handle()))).is_valid()) {
1185 position += MOBJ(Base::mesh_.FH(voh_it.handle())).position(_target_state - 1) * c;
1187 position += MOBJ(Base::mesh_.FH(Base::mesh_.OHEH(Base::mesh_.NHEH(voh_it.handle())))).position(_target_state - 1) * (1.0 - c);
1191 position += MOBJ(Base::mesh_.FH(voh_it.handle())).position(_target_state - 1);
1201 position /= valence;
1203 MOBJ(_vh).set_position(_target_state, position);
1204 MOBJ(_vh).inc_state();
1206 assert(MOBJ(_vh).state() == _target_state);
1209 if (Base::number() == Base::n_rules() - 1) {
1211 Base::mesh_.set_point(_vh, position);
1212 MOBJ(_vh).set_final();
1218 std::vector<double> FVc<M>::coeffs_;
1221 void FVc<M>::init_coeffs(
size_t _max_valence)
1223 if ( coeffs_.size() == _max_valence+1 )
1226 if ( coeffs_.size() < _max_valence+1 )
1228 const double _2pi(2.0*M_PI);
1229 const double _2over3(2.0/3.0);
1231 if (coeffs_.empty())
1232 coeffs_.push_back(0.0);
1234 for(
size_t v=coeffs_.size(); v <= _max_valence; ++v)
1235 coeffs_.push_back(_2over3 * ( cos( _2pi / v) + 1.0));
1244 void VV<M>::raise(
typename M::VertexHandle& _vh,
state_t _target_state)
1246 if (MOBJ(_vh).state() < _target_state)
1248 this->update(_vh, _target_state);
1251 typename M::VertexVertexIter vv_it(Base::mesh_.vv_iter(_vh));
1252 typename M::VertexHandle vh;
1253 std::vector<typename M::VertexHandle> vertex_vector;
1255 if (_target_state > 1) {
1257 for (; vv_it; ++vv_it) {
1259 vertex_vector.push_back(vv_it.handle());
1262 while (!vertex_vector.empty()) {
1264 vh = vertex_vector.back();
1265 vertex_vector.pop_back();
1267 Base::prev_rule()->raise(vh, _target_state - 1);
1270 for (; vv_it; ++vv_it) {
1272 vertex_vector.push_back(vv_it.handle());
1275 while (!vertex_vector.empty()) {
1277 vh = vertex_vector.back();
1278 vertex_vector.pop_back();
1280 Base::prev_rule()->raise(vh, _target_state - 1);
1285 typename M::Point position(0.0, 0.0, 0.0);
1288 for (vv_it = Base::mesh_.vv_iter(_vh); vv_it; ++vv_it) {
1292 position += Base::mesh_.data(vv_it).position(_target_state - 1);
1295 position /= valence;
1297 MOBJ(_vh).set_position(_target_state, position);
1298 MOBJ(_vh).inc_state();
1301 if (Base::number() == Base::n_rules() - 1) {
1303 Base::mesh_.set_point(_vh, position);
1304 MOBJ(_vh).set_final();
1314 void VVc<M>::raise(
typename M::VertexHandle& _vh,
state_t _target_state)
1316 if (MOBJ(_vh).state() < _target_state) {
1318 this->update(_vh, _target_state);
1321 typename M::VertexVertexIter vv_it(Base::mesh_.vv_iter(_vh));
1322 typename M::VertexHandle vh;
1323 std::vector<typename M::VertexHandle> vertex_vector;
1325 if (_target_state > 1) {
1327 for (; vv_it; ++vv_it) {
1329 vertex_vector.push_back(vv_it.handle());
1332 while (!vertex_vector.empty()) {
1334 vh = vertex_vector.back();
1335 vertex_vector.pop_back();
1337 Base::prev_rule()->raise(vh, _target_state - 1);
1340 for (; vv_it; ++vv_it) {
1342 vertex_vector.push_back(vv_it.handle());
1345 while (!vertex_vector.empty()) {
1347 vh = vertex_vector.back();
1348 vertex_vector.pop_back();
1350 Base::prev_rule()->raise(vh, _target_state - 1);
1355 typename M::Point position(0.0, 0.0, 0.0);
1357 typename M::Scalar c;
1359 for (vv_it = Base::mesh_.vv_iter(_vh); vv_it; ++vv_it)
1362 position += Base::mesh_.data(vv_it).position(_target_state - 1);
1365 position /= valence;
1370 position *= (1.0 - c);
1371 position += MOBJ(_vh).position(_target_state - 1) * c;
1373 MOBJ(_vh).set_position(_target_state, position);
1374 MOBJ(_vh).inc_state();
1376 if (Base::number() == Base::n_rules() - 1)
1378 Base::mesh_.set_point(_vh, position);
1379 MOBJ(_vh).set_final();
1389 void VE<M>::raise(
typename M::EdgeHandle& _eh,
state_t _target_state)
1391 if (MOBJ(_eh).state() < _target_state) {
1393 this->update(_eh, _target_state);
1396 typename M::VertexHandle vh;
1397 typename M::HalfedgeHandle hh1(Base::mesh_.HEH(_eh, 0)),
1398 hh2(Base::mesh_.HEH(_eh, 1));
1400 if (_target_state > 1) {
1402 vh = Base::mesh_.TVH(hh1);
1404 Base::prev_rule()->raise(vh, _target_state - 1);
1406 vh = Base::mesh_.TVH(hh2);
1408 Base::prev_rule()->raise(vh, _target_state - 1);
1412 typename M::Point position(0.0, 0.0, 0.0);
1416 position += MOBJ(Base::mesh_.TVH(hh1)).position(_target_state - 1);
1417 position += MOBJ(Base::mesh_.TVH(hh2)).position(_target_state - 1);
1419 position /= valence;
1421 MOBJ(_eh).set_position(_target_state, position);
1422 MOBJ(_eh).inc_state();
1431 void VdE<M>::raise(
typename M::EdgeHandle& _eh,
state_t _target_state)
1433 if (MOBJ(_eh).state() < _target_state)
1435 this->update(_eh, _target_state);
1438 typename M::VertexHandle vh;
1439 typename M::HalfedgeHandle hh1(Base::mesh_.HEH(_eh, 0)),
1440 hh2(Base::mesh_.HEH(_eh, 1));
1441 std::vector<typename M::VertexHandle> vertex_vector;
1442 typename M::FaceHandle fh1, fh2;
1444 if (_target_state > 1) {
1446 fh1 = Base::mesh_.FH(hh1);
1447 fh2 = Base::mesh_.FH(hh2);
1449 if (fh1.is_valid()) {
1451 Base::prev_rule()->raise(fh1, _target_state - 1);
1453 vh = Base::mesh_.TVH(Base::mesh_.NHEH(hh1));
1454 Base::prev_rule()->raise(vh, _target_state - 1);
1457 if (fh2.is_valid()) {
1459 Base::prev_rule()->raise(fh2, _target_state - 1);
1461 vh = Base::mesh_.TVH(Base::mesh_.NHEH(hh2));
1462 Base::prev_rule()->raise(vh, _target_state - 1);
1465 vh = Base::mesh_.TVH(hh1);
1466 Base::prev_rule()->raise(vh, _target_state - 1);
1468 vh = Base::mesh_.TVH(hh2);
1469 Base::prev_rule()->raise(vh, _target_state - 1);
1473 typename M::Point position(0.0, 0.0, 0.0);
1477 position += MOBJ(Base::mesh_.TVH(hh1)).position(_target_state - 1);
1478 position += MOBJ(Base::mesh_.TVH(hh2)).position(_target_state - 1);
1480 if (fh1.is_valid()) {
1482 position += MOBJ(Base::mesh_.TVH(Base::mesh_.NHEH(hh1))).position(_target_state - 1);
1486 if (fh2.is_valid()) {
1488 position += MOBJ(Base::mesh_.TVH(Base::mesh_.NHEH(hh2))).position(_target_state - 1);
1492 if (Base::number() == Base::subdiv_rule()->Base::number() + 1)
1495 position /= valence;
1497 MOBJ(_eh).set_position(_target_state, position);
1498 MOBJ(_eh).inc_state();
1508 VdEc<M>::raise(
typename M::EdgeHandle& _eh,
state_t _target_state)
1510 if (MOBJ(_eh).state() < _target_state)
1512 this->update(_eh, _target_state);
1515 typename M::VertexHandle vh;
1516 typename M::HalfedgeHandle hh1(Base::mesh_.HEH(_eh, 0)),
1517 hh2(Base::mesh_.HEH(_eh, 1));
1518 std::vector<typename M::VertexHandle> vertex_vector;
1519 typename M::FaceHandle fh1, fh2;
1521 if (_target_state > 1) {
1523 fh1 = Base::mesh_.FH(Base::mesh_.HEH(_eh, 0));
1524 fh2 = Base::mesh_.FH(Base::mesh_.HEH(_eh, 1));
1526 Base::prev_rule()->raise(fh1, _target_state - 1);
1527 Base::prev_rule()->raise(fh2, _target_state - 1);
1529 vertex_vector.push_back(Base::mesh_.TVH(hh1));
1530 vertex_vector.push_back(Base::mesh_.TVH(hh2));
1532 vertex_vector.push_back(Base::mesh_.TVH(Base::mesh_.NHEH(hh1)));
1533 vertex_vector.push_back(Base::mesh_.TVH(Base::mesh_.NHEH(hh2)));
1535 while (!vertex_vector.empty()) {
1537 vh = vertex_vector.back();
1538 vertex_vector.pop_back();
1540 Base::prev_rule()->raise(vh, _target_state - 1);
1543 vertex_vector.push_back(Base::mesh_.TVH(hh1));
1544 vertex_vector.push_back(Base::mesh_.TVH(hh2));
1546 vertex_vector.push_back(Base::mesh_.TVH(Base::mesh_.NHEH(hh1)));
1547 vertex_vector.push_back(Base::mesh_.TVH(Base::mesh_.NHEH(hh2)));
1549 while (!vertex_vector.empty()) {
1551 vh = vertex_vector.back();
1552 vertex_vector.pop_back();
1554 Base::prev_rule()->raise(vh, _target_state - 1);
1559 typename M::Point position(0.0, 0.0, 0.0);
1561 typename M::Scalar c;
1567 position += MOBJ(Base::mesh_.TVH(hh1)).position(_target_state - 1) * c;
1568 position += MOBJ(Base::mesh_.TVH(hh2)).position(_target_state - 1) * c;
1569 position += MOBJ(Base::mesh_.TVH(Base::mesh_.NHEH(hh1))).position(_target_state - 1) * (0.5 - c);
1570 position += MOBJ(Base::mesh_.TVH(Base::mesh_.NHEH(hh2))).position(_target_state - 1) * (0.5 - c);
1572 position /= valence;
1574 MOBJ(_eh).set_position(_target_state, position);
1575 MOBJ(_eh).inc_state();
1584 void EV<M>::raise(
typename M::VertexHandle& _vh,
state_t _target_state)
1586 if (MOBJ(_vh).state() < _target_state) {
1588 this->update(_vh, _target_state);
1591 typename M::VertexEdgeIter ve_it(Base::mesh_.ve_iter(_vh));
1592 typename M::EdgeHandle eh;
1593 std::vector<typename M::EdgeHandle> edge_vector;
1595 if (_target_state > 1) {
1597 for (; ve_it; ++ve_it) {
1599 edge_vector.push_back(ve_it.handle());
1602 while (!edge_vector.empty()) {
1604 eh = edge_vector.back();
1605 edge_vector.pop_back();
1607 Base::prev_rule()->raise(eh, _target_state - 1);
1610 for (ve_it = Base::mesh_.ve_iter(_vh); ve_it; ++ve_it) {
1612 edge_vector.push_back(ve_it.handle());
1615 while (!edge_vector.empty()) {
1617 eh = edge_vector.back();
1618 edge_vector.pop_back();
1620 while (MOBJ(eh).state() < _target_state - 1)
1621 Base::prev_rule()->raise(eh, _target_state - 1);
1626 typename M::Point position(0.0, 0.0, 0.0);
1629 for (ve_it = Base::mesh_.ve_iter(_vh); ve_it; ++ve_it) {
1631 if (Base::mesh_.data(ve_it).
final()) {
1635 position += Base::mesh_.data(ve_it).position(_target_state - 1);
1639 position /= valence;
1641 MOBJ(_vh).set_position(_target_state, position);
1642 MOBJ(_vh).inc_state();
1645 if (Base::number() == Base::n_rules() - 1) {
1647 Base::mesh_.set_point(_vh, position);
1648 MOBJ(_vh).set_final();
1657 std::vector<double> EVc<M>::coeffs_;
1660 void EVc<M>::raise(
typename M::VertexHandle& _vh,
state_t _target_state)
1662 if (MOBJ(_vh).state() < _target_state)
1664 this->update(_vh, _target_state);
1667 typename M::VertexOHalfedgeIter voh_it;
1668 typename M::EdgeHandle eh;
1669 typename M::FaceHandle fh;
1670 std::vector<typename M::EdgeHandle> edge_vector;
1671 std::vector<typename M::FaceHandle> face_vector;
1673 if (_target_state > 1) {
1675 for (voh_it = Base::mesh_.voh_iter(_vh); voh_it; ++voh_it) {
1677 face_vector.push_back(Base::mesh_.FH(voh_it.handle()));
1680 while (!face_vector.empty()) {
1682 fh = face_vector.back();
1683 face_vector.pop_back();
1686 Base::prev_rule()->raise(fh, _target_state - 1);
1689 for (voh_it = Base::mesh_.voh_iter(_vh); voh_it; ++voh_it) {
1691 edge_vector.push_back(Base::mesh_.EH(voh_it.handle()));
1693 edge_vector.push_back(Base::mesh_.EH(Base::mesh_.NHEH(voh_it.handle())));
1696 while (!edge_vector.empty()) {
1698 eh = edge_vector.back();
1699 edge_vector.pop_back();
1701 while (MOBJ(eh).state() < _target_state - 1)
1702 Base::prev_rule()->raise(eh, _target_state - 1);
1708 typename M::Point position(0.0, 0.0, 0.0);
1709 typename M::Scalar c;
1710 typename M::Point zero_point(0.0, 0.0, 0.0);
1713 valence = Base::mesh_.valence(_vh);
1714 c = coeff( valence );
1716 for (voh_it = Base::mesh_.voh_iter(_vh); voh_it; ++voh_it)
1718 if (MOBJ(Base::mesh_.EH(voh_it.handle())).final())
1720 position += MOBJ(Base::mesh_.EH(voh_it.handle())).position(_target_state-1)*c;
1722 if ( Base::mesh_.FH(voh_it.handle()).is_valid() &&
1723 MOBJ(Base::mesh_.EH(Base::mesh_.NHEH(voh_it.handle()))).
final() &&
1724 MOBJ(Base::mesh_.EH(Base::mesh_.NHEH(voh_it.handle()))).position(_target_state - 1) != zero_point)
1726 position += MOBJ(Base::mesh_.EH(Base::mesh_.NHEH(voh_it.handle()))).position(_target_state-1) * (1.0-c);
1729 position += MOBJ(Base::mesh_.EH(voh_it.handle())).position(_target_state - 1) * (1.0 - c);
1737 position /= valence;
1739 MOBJ(_vh).set_position(_target_state, position);
1740 MOBJ(_vh).inc_state();
1743 if (Base::number() == Base::n_rules() - 1) {
1745 Base::mesh_.set_point(_vh, position);
1746 MOBJ(_vh).set_final();
1754 EVc<M>::init_coeffs(
size_t _max_valence)
1756 if ( coeffs_.size() == _max_valence+1 )
1759 if (coeffs_.size() < _max_valence+1)
1761 const double _2pi = 2.0*M_PI;
1764 if (coeffs_.empty())
1765 coeffs_.push_back(0.0);
1767 for(
size_t v=coeffs_.size(); v <= _max_valence; ++v)
1770 c = 1.5 + cos( _2pi / v );
1771 c = c * c * 0.5 - 1.0;
1772 coeffs_.push_back(c);
1782 EF<M>::raise(
typename M::FaceHandle& _fh,
state_t _target_state) {
1784 if (MOBJ(_fh).state() < _target_state) {
1786 this->update(_fh, _target_state);
1789 typename M::FaceEdgeIter fe_it(Base::mesh_.fe_iter(_fh));
1790 typename M::EdgeHandle eh;
1791 std::vector<typename M::EdgeHandle> edge_vector;
1793 if (_target_state > 1) {
1795 for (; fe_it; ++fe_it) {
1797 edge_vector.push_back(fe_it.handle());
1800 while (!edge_vector.empty()) {
1802 eh = edge_vector.back();
1803 edge_vector.pop_back();
1805 Base::prev_rule()->raise(eh, _target_state - 1);
1808 for (fe_it = Base::mesh_.fe_iter(_fh); fe_it; ++fe_it) {
1810 edge_vector.push_back(fe_it.handle());
1813 while (!edge_vector.empty()) {
1815 eh = edge_vector.back();
1816 edge_vector.pop_back();
1818 while (MOBJ(eh).state() < _target_state - 1)
1819 Base::prev_rule()->raise(eh, _target_state - 1);
1824 typename M::Point position(0.0, 0.0, 0.0);
1827 for (fe_it = Base::mesh_.fe_iter(_fh); fe_it; ++fe_it) {
1829 if (Base::mesh_.data(fe_it).
final()) {
1833 position += Base::mesh_.data(fe_it).position(_target_state - 1);
1837 assert (valence == 3);
1839 position /= valence;
1841 MOBJ(_fh).set_position(_target_state, position);
1842 MOBJ(_fh).inc_state();
1852 FE<M>::raise(
typename M::EdgeHandle& _eh,
state_t _target_state) {
1854 if (MOBJ(_eh).state() < _target_state) {
1856 this->update(_eh, _target_state);
1859 typename M::FaceHandle fh;
1861 if (_target_state > 1) {
1863 fh = Base::mesh_.FH(Base::mesh_.HEH(_eh, 0));
1864 Base::prev_rule()->raise(fh, _target_state - 1);
1866 fh = Base::mesh_.FH(Base::mesh_.HEH(_eh, 1));
1867 Base::prev_rule()->raise(fh, _target_state - 1);
1869 fh = Base::mesh_.FH(Base::mesh_.HEH(_eh, 0));
1870 Base::prev_rule()->raise(fh, _target_state - 1);
1872 fh = Base::mesh_.FH(Base::mesh_.HEH(_eh, 1));
1873 Base::prev_rule()->raise(fh, _target_state - 1);
1877 typename M::Point position(0.0, 0.0, 0.0);
1880 position += MOBJ(Base::mesh_.FH(Base::mesh_.HEH(_eh, 0))).position(_target_state - 1);
1882 position += MOBJ(Base::mesh_.FH(Base::mesh_.HEH(_eh, 1))).position(_target_state - 1);
1884 position /= valence;
1886 MOBJ(_eh).set_position(_target_state, position);
1887 MOBJ(_eh).inc_state();
1897 EdE<M>::raise(
typename M::EdgeHandle& _eh,
state_t _target_state) {
1899 if (MOBJ(_eh).state() < _target_state) {
1901 this->update(_eh, _target_state);
1904 typename M::HalfedgeHandle hh1, hh2;
1905 typename M::FaceHandle fh;
1906 typename M::EdgeHandle eh;
1908 hh1 = Base::mesh_.HEH(_eh, 0);
1909 hh2 = Base::mesh_.HEH(_eh, 1);
1911 if (_target_state > 1) {
1913 fh = Base::mesh_.FH(hh1);
1914 Base::prev_rule()->raise(fh, _target_state - 1);
1916 fh = Base::mesh_.FH(hh2);
1917 Base::prev_rule()->raise(fh, _target_state - 1);
1919 eh = Base::mesh_.EH(Base::mesh_.NHEH(hh1));
1920 Base::prev_rule()->raise(eh, _target_state - 1);
1922 eh = Base::mesh_.EH(Base::mesh_.PHEH(hh1));
1923 Base::prev_rule()->raise(eh, _target_state - 1);
1925 eh = Base::mesh_.EH(Base::mesh_.NHEH(hh2));
1926 Base::prev_rule()->raise(eh, _target_state - 1);
1928 eh = Base::mesh_.EH(Base::mesh_.PHEH(hh2));
1929 Base::prev_rule()->raise(eh, _target_state - 1);
1933 typename M::Point position(0.0, 0.0, 0.0);
1936 position += MOBJ(Base::mesh_.EH(Base::mesh_.NHEH(hh1))).position(_target_state - 1);
1937 position += MOBJ(Base::mesh_.EH(Base::mesh_.PHEH(hh1))).position(_target_state - 1);
1938 position += MOBJ(Base::mesh_.EH(Base::mesh_.NHEH(hh2))).position(_target_state - 1);
1939 position += MOBJ(Base::mesh_.EH(Base::mesh_.PHEH(hh2))).position(_target_state - 1);
1941 position /= valence;
1943 MOBJ(_eh).set_position(_target_state, position);
1944 MOBJ(_eh).inc_state();
1954 EdEc<M>::raise(
typename M::EdgeHandle& _eh,
state_t _target_state)
1956 if (MOBJ(_eh).state() < _target_state) {
1958 this->update(_eh, _target_state);
1961 typename M::HalfedgeHandle hh1, hh2;
1962 typename M::FaceHandle fh;
1963 typename M::EdgeHandle eh;
1965 hh1 = Base::mesh_.HEH(_eh, 0);
1966 hh2 = Base::mesh_.HEH(_eh, 1);
1968 if (_target_state > 1) {
1970 fh = Base::mesh_.FH(hh1);
1971 Base::prev_rule()->raise(fh, _target_state - 1);
1973 fh = Base::mesh_.FH(hh2);
1974 Base::prev_rule()->raise(fh, _target_state - 1);
1976 eh = Base::mesh_.EH(Base::mesh_.NHEH(hh1));
1977 Base::prev_rule()->raise(eh, _target_state - 1);
1979 eh = Base::mesh_.EH(Base::mesh_.PHEH(hh1));
1980 Base::prev_rule()->raise(eh, _target_state - 1);
1982 eh = Base::mesh_.EH(Base::mesh_.NHEH(hh2));
1983 Base::prev_rule()->raise(eh, _target_state - 1);
1985 eh = Base::mesh_.EH(Base::mesh_.PHEH(hh2));
1986 Base::prev_rule()->raise(eh, _target_state - 1);
1990 typename M::Point position(0.0, 0.0, 0.0);
1992 typename M::Scalar c;
1994 position += MOBJ(Base::mesh_.EH(Base::mesh_.NHEH(hh1))).position(_target_state - 1);
1995 position += MOBJ(Base::mesh_.EH(Base::mesh_.PHEH(hh1))).position(_target_state - 1);
1996 position += MOBJ(Base::mesh_.EH(Base::mesh_.NHEH(hh2))).position(_target_state - 1);
1997 position += MOBJ(Base::mesh_.EH(Base::mesh_.PHEH(hh2))).position(_target_state - 1);
1999 position /= valence;
2004 position *= (1.0 - c);
2006 position += MOBJ(_eh).position(_target_state - 1) * c;
2008 MOBJ(_eh).set_position(_target_state, position);
2009 MOBJ(_eh).inc_state();
2013 #endif // DOXY_IGNORE_THIS