59 #ifndef OPENMESH_SUBDIVIDER_UNIFORM_COMPOSITE_CC
60 #define OPENMESH_SUBDIVIDER_UNIFORM_COMPOSITE_CC
73 namespace Subdivider {
80 template <
typename MeshType,
typename RealType>
86 typename MeshType::VertexIter v_it(_m.vertices_begin());
88 for (; v_it != _m.vertices_end(); ++v_it)
89 _m.data(*v_it).set_position(_m.point(*v_it));
96 template<
typename MeshType,
typename RealType>
99 assert(p_mesh_); MeshType& mesh_ = *p_mesh_;
101 typename MeshType::VertexHandle vh;
102 typename MeshType::FaceIter f_it;
103 typename MeshType::EdgeIter e_it;
104 typename MeshType::VertexIter v_it;
105 typename MeshType::Point zero_point(0.0, 0.0, 0.0);
106 size_t n_edges, n_faces, n_vertices, j;
109 n_faces = mesh_.n_faces();
110 n_edges = mesh_.n_edges();
111 n_vertices = mesh_.n_vertices();
114 mesh_.reserve(n_vertices + n_faces, n_edges + 3 * n_faces, 3 * n_faces);
117 v_it = mesh_.vertices_begin();
118 for (j = 0; j < n_vertices; ++j) {
119 mesh_.data(*v_it).set_position(mesh_.data(*v_it).position() *
static_cast<typename MeshType::Point::value_type
>(3.0) );
124 f_it = mesh_.faces_begin();
125 for (j = 0; j < n_faces; ++j) {
127 vh = mesh_.add_vertex(zero_point);
129 mesh_.data(vh).set_position(zero_point);
131 mesh_.split(*f_it, vh);
137 std::vector<typename MeshType::EdgeHandle> edge_vector;
140 e_it = mesh_.edges_begin();
141 for (j = 0; j < n_edges; ++j) {
142 if (mesh_.is_flip_ok(*e_it)) {
145 edge_vector.push_back(*e_it);
151 while (!edge_vector.empty()) {
152 vh = mesh_.add_vertex(zero_point);
153 mesh_.data(vh).set_position(zero_point);
154 mesh_.split(edge_vector.back(), vh);
155 edge_vector.pop_back();
160 template<
typename MeshType,
typename RealType>
163 assert(p_mesh_); MeshType& mesh_ = *p_mesh_;
165 typename MeshType::VertexHandle vh;
166 typename MeshType::FaceIter f_it;
167 typename MeshType::EdgeIter e_it;
168 typename MeshType::VertexIter v_it;
169 typename MeshType::Point zero_point(0.0, 0.0, 0.0);
170 size_t n_edges, n_faces, n_vertices, j;
173 n_faces = mesh_.n_faces();
174 n_edges = mesh_.n_edges();
175 n_vertices = mesh_.n_vertices();
178 mesh_.reserve(n_vertices + n_edges, 2 * n_edges + 3 * n_faces, 4 * n_faces);
181 v_it = mesh_.vertices_begin();
182 for (j = 0; j < n_vertices; ++j) {
183 mesh_.data(*v_it).set_position(mesh_.data(*v_it).position() *
static_cast<typename MeshType::Point::value_type
>(4.0) );
188 e_it = mesh_.edges_begin();
189 for (j = 0; j < n_edges; ++j) {
191 vh = split_edge(mesh_.halfedge_handle(*e_it, 0));
192 mesh_.data(vh).set_position(zero_point);
198 f_it = mesh_.faces_begin();
199 for (j = 0; j < n_faces; ++j) {
200 typename MeshType::HalfedgeHandle heh1(mesh_.halfedge_handle(*f_it));
201 typename MeshType::HalfedgeHandle heh2(mesh_.next_halfedge_handle(mesh_.next_halfedge_handle(heh1)));
202 typename MeshType::HalfedgeHandle heh3(mesh_.next_halfedge_handle(mesh_.next_halfedge_handle(heh2)));
206 corner_cutting(heh1);
207 corner_cutting(heh2);
208 corner_cutting(heh3);
215 template<
typename MeshType,
typename RealType>
218 assert(p_mesh_); MeshType& mesh_ = *p_mesh_;
220 typename MeshType::VertexHandle vh;
221 typename MeshType::FaceIter f_it;
222 typename MeshType::EdgeIter e_it;
223 typename MeshType::VertexIter v_it;
224 typename MeshType::VertexFaceIter vf_it;
225 typename MeshType::FaceFaceIter ff_it;
226 typename MeshType::Point cog;
227 const typename MeshType::Point zero_point(0.0, 0.0, 0.0);
228 size_t n_edges, n_faces, n_vertices, j, valence;
231 n_faces = mesh_.n_faces();
232 n_edges = mesh_.n_edges();
233 n_vertices = mesh_.n_vertices();
236 mesh_.reserve(n_vertices + n_faces, n_edges + 3 * n_faces, 3 * n_faces);
239 v_it = mesh_.vertices_begin();
240 for (j = 0; j < n_vertices; ++j) {
243 for (vf_it = mesh_.vf_iter(*v_it); vf_it; ++vf_it) {
245 cog += vf_it->position();
249 v_it->set_position(cog);
254 f_it = mesh_.faces_begin();
255 for (j = 0; j < n_faces; ++j) {
257 vh = mesh_.add_vertex();
261 for (ff_it = mesh_.ff_iter(*f_it); ff_it; ++ff_it) {
263 cog += ff_it->position();
267 mesh_.split(*f_it, vh);
269 for (vf_it = mesh_.vf_iter(vh); vf_it; ++vf_it) {
270 vf_it->set_position(f_it->position());
273 mesh_.deref(vh).set_position(cog);
275 mesh_.set_point(vh, cog);
281 e_it = mesh_.edges_begin();
282 for (j = 0; j < n_edges; ++j) {
283 if (mesh_.is_flip_ok(*e_it))
291 template<
typename MeshType,
typename RealType>
294 assert(p_mesh_); MeshType& mesh_ = *p_mesh_;
296 typename MeshType::Point cog,zero_point(0.0, 0.0, 0.0);
297 typename MeshType::FaceVertexIter fv_it;
298 typename MeshType::FaceIter f_it;
300 for (f_it = mesh_.faces_begin(); f_it != mesh_.faces_end(); ++f_it) {
302 unsigned int valence = 0;
305 for (fv_it = mesh_.fv_iter(*f_it); fv_it.is_valid(); ++fv_it) {
306 cog += mesh_.data(*fv_it).position();
310 mesh_.data(*f_it).set_position(cog);
315 template<
typename MeshType,
typename RealType>
318 assert(p_mesh_); MeshType& mesh_ = *p_mesh_;
320 unsigned int valence[3], i;
321 typename MeshType::Point cog,zero_point(0.0, 0.0, 0.0);
322 typename MeshType::Scalar alpha;
323 typename MeshType::FaceIter f_it;
324 typename MeshType::HalfedgeHandle heh;
325 typename MeshType::VertexHandle vh[3];
326 typename MeshType::VertexOHalfedgeIter voh_it;
327 typename MeshType::FaceVertexIter fv_it;
329 for (f_it = mesh_.faces_begin(); f_it != mesh_.faces_end(); ++f_it) {
331 heh = mesh_.halfedge_handle(*f_it);
332 for (i = 0; i <= 2; ++i) {
335 vh[i] = mesh_.to_vertex_handle(heh);
337 for (voh_it = mesh_.voh_iter(vh[i]); voh_it; ++voh_it) {
341 heh = mesh_.next_halfedge_handle(heh);
344 if (valence[0] <= valence[1])
345 if (valence[0] <= valence[2])
350 if (valence[1] <= valence[2])
355 alpha = _coeff(valence[i]);
359 for (fv_it = mesh_.fv_iter(*f_it); fv_it.is_valid(); ++fv_it) {
360 if (*fv_it == vh[i]) {
361 cog += fv_it->position() * alpha;
363 cog += fv_it->position() * (1.0 - alpha) / 2.0;
367 f_it->set_position(cog);
372 template<
typename MeshType,
typename RealType>
375 assert(p_mesh_); MeshType& mesh_ = *p_mesh_;
377 unsigned int valence[3], i;
378 typename MeshType::Point cog,
379 zero_point(0.0, 0.0, 0.0);
380 typename MeshType::FaceIter f_it;
381 typename MeshType::HalfedgeHandle heh;
382 typename MeshType::VertexHandle vh[3];
383 typename MeshType::VertexOHalfedgeIter voh_it;
384 typename MeshType::FaceVertexIter fv_it;
386 for (f_it = mesh_.faces_begin(); f_it != mesh_.faces_end(); ++f_it) {
388 heh = mesh_.halfedge_handle(*f_it);
389 for (i = 0; i <= 2; ++i) {
392 vh[i] = mesh_.to_vertex_handle(heh);
394 for (voh_it = mesh_.voh_iter(vh[i]); voh_it; ++voh_it) {
398 heh = mesh_.next_halfedge_handle(heh);
401 if (valence[0] <= valence[1])
402 if (valence[0] <= valence[2])
407 if (valence[1] <= valence[2])
414 for (fv_it = mesh_.fv_iter(*f_it); fv_it.is_valid(); ++fv_it) {
415 if (*fv_it == vh[i]) {
416 cog += fv_it->position() * _alpha;
418 cog += fv_it->position() * (1.0 - _alpha) / 2.0;
422 f_it->set_position(cog);
427 template<
typename MeshType,
typename RealType>
430 assert(p_mesh_); MeshType& mesh_ = *p_mesh_;
432 typename MeshType::Point cog,
433 zero_point(0.0, 0.0, 0.0);
434 typename MeshType::FaceFaceIter ff_it;
435 typename MeshType::FaceIter f_it;
436 std::vector<typename MeshType::Point> point_vector;
438 point_vector.clear();
440 for (f_it = mesh_.faces_begin(); f_it != mesh_.faces_end(); ++f_it)
442 unsigned int valence = 0;
445 for (ff_it = mesh_.ff_iter(*f_it); ff_it.is_valid(); ++ff_it)
447 cog += mesh_.data(*ff_it).position();
451 point_vector.push_back(cog);
454 for (f_it = mesh_.faces_end(); f_it != mesh_.faces_begin(); )
457 mesh_.data(*f_it).set_position(point_vector.back());
458 point_vector.pop_back();
463 template<
typename MeshType,
typename RealType>
466 assert(p_mesh_); MeshType& mesh_ = *p_mesh_;
468 typename MeshType::Point cog,
469 zero_point(0.0, 0.0, 0.0);
470 typename MeshType::FaceFaceIter ff_it;
471 typename MeshType::FaceIter f_it;
472 typename MeshType::Scalar c;
473 std::vector<typename MeshType::Point> point_vector;
475 for (f_it = mesh_.faces_begin(); f_it != mesh_.faces_end(); ++f_it) {
477 unsigned int valence = 0;
480 for (ff_it = mesh_.ff_iter(*f_it); ff_it; ++ff_it) {
481 cog += ff_it->position();
488 cog = cog * (1.0 - c) + f_it->position() * c;
490 point_vector.push_back(cog);
493 for (f_it = mesh_.faces_end(); f_it != mesh_.faces_begin(); ) {
496 f_it->set_position(point_vector.back());
497 point_vector.pop_back();
503 template<
typename MeshType,
typename RealType>
506 assert(p_mesh_); MeshType& mesh_ = *p_mesh_;
508 typename MeshType::Point cog, zero_point(0.0, 0.0, 0.0);
509 typename MeshType::FaceFaceIter ff_it;
510 typename MeshType::FaceIter f_it;
511 std::vector<typename MeshType::Point> point_vector;
513 for (f_it = mesh_.faces_begin(); f_it != mesh_.faces_end(); ++f_it) {
515 unsigned int valence = 0;
518 for (ff_it = mesh_.ff_iter(*f_it); ff_it; ++ff_it) {
519 cog += ff_it->position();
524 cog = cog * (1.0 - _c) + f_it->position() * _c;
526 point_vector.push_back(cog);
529 for (f_it = mesh_.faces_end(); f_it != mesh_.faces_begin(); ) {
532 f_it->set_position(point_vector.back());
533 point_vector.pop_back();
538 template<
typename MeshType,
typename RealType>
541 assert(p_mesh_); MeshType& mesh_ = *p_mesh_;
543 typename MeshType::Point cog,
544 zero_point(0.0, 0.0, 0.0);
545 typename MeshType::VertexFaceIter vf_it;
546 typename MeshType::VertexIter v_it;
548 for (v_it = mesh_.vertices_begin(); v_it != mesh_.vertices_end(); ++v_it) {
550 unsigned int valence = 0;
553 for (vf_it = mesh_.vf_iter(*v_it); vf_it; ++vf_it) {
554 cog += vf_it->position();
558 v_it->set_position(cog);
563 template<
typename MeshType,
typename RealType>
566 assert(p_mesh_); MeshType& mesh_ = *p_mesh_;
569 typename MeshType::Point cog,
570 zero_point(0.0, 0.0, 0.0);
572 typename MeshType::VertexOHalfedgeIter voh_it;
573 typename MeshType::VertexIter v_it;
575 for (v_it = mesh_.vertices_begin(); v_it != mesh_.vertices_end(); ++v_it) {
577 unsigned int valence = 0;
580 for (voh_it = mesh_.voh_iter(*v_it); voh_it.is_valid(); ++voh_it) {
584 c =
static_cast<real_t
>(_coeff(valence));
586 for (voh_it = mesh_.voh_iter(*v_it); voh_it.is_valid(); ++voh_it) {
588 if (mesh_.face_handle(*voh_it).is_valid()) {
590 if (mesh_.face_handle(mesh_.opposite_halfedge_handle(mesh_.next_halfedge_handle(*voh_it))).is_valid()) {
591 cog += mesh_.data(mesh_.face_handle(*voh_it)).position() * c;
592 cog += mesh_.data(mesh_.face_handle(mesh_.opposite_halfedge_handle(mesh_.next_halfedge_handle(*voh_it)))).position() * (
static_cast<typename MeshType::Point::value_type
>(1.0) - c);
594 cog += mesh_.data(mesh_.face_handle(*voh_it)).position();
604 mesh_.data(*v_it).set_position(cog);
609 template<
typename MeshType,
typename RealType>
612 assert(p_mesh_); MeshType& mesh_ = *p_mesh_;
614 typename MeshType::Point cog, zero_point(0.0, 0.0, 0.0);
615 typename MeshType::VertexOHalfedgeIter voh_it;
616 typename MeshType::VertexIter v_it;
618 for (v_it = mesh_.vertices_begin(); v_it != mesh_.vertices_end(); ++v_it) {
620 unsigned int valence = 0;
623 for (voh_it = mesh_.voh_iter(*v_it); voh_it; ++voh_it) {
627 for (voh_it = mesh_.voh_iter(*v_it); voh_it; ++voh_it) {
629 if (mesh_.face_handle(*voh_it).is_valid()) {
631 if (mesh_.face_handle(mesh_.opposite_halfedge_handle(mesh_.next_halfedge_handle(*voh_it))).is_valid()) {
632 cog += mesh_.deref(mesh_.face_handle(*voh_it)).position() * _c;
633 cog += mesh_.deref(mesh_.face_handle(mesh_.opposite_halfedge_handle(mesh_.next_halfedge_handle(*voh_it)))).position() * (1.0 - _c);
635 cog += mesh_.deref(mesh_.face_handle(*voh_it)).position();
645 v_it->set_position(cog);
650 template<
typename MeshType,
typename RealType>
653 assert(p_mesh_); MeshType& mesh_ = *p_mesh_;
655 typename MeshType::EdgeIter e_it;
656 typename MeshType::Point cog, zero_point(0.0, 0.0, 0.0);
657 typename MeshType::HalfedgeHandle heh1, heh2;
659 for (e_it = mesh_.edges_begin(); e_it != mesh_.edges_end(); ++e_it) {
662 unsigned int valence = 2;
664 heh1 = mesh_.halfedge_handle(*e_it, 0);
665 heh2 = mesh_.opposite_halfedge_handle(heh1);
666 cog += mesh_.data(mesh_.to_vertex_handle(heh1)).position();
667 cog += mesh_.data(mesh_.to_vertex_handle(heh2)).position();
669 if (!mesh_.is_boundary(heh1)) {
670 cog += mesh_.data(mesh_.to_vertex_handle(mesh_.next_halfedge_handle(heh1))).position();
674 if (!mesh_.is_boundary(heh2)) {
675 cog += mesh_.data(mesh_.to_vertex_handle(mesh_.next_halfedge_handle(heh2))).position();
681 mesh_.data(*e_it).set_position(cog);
686 template<
typename MeshType,
typename RealType>
689 assert(p_mesh_); MeshType& mesh_ = *p_mesh_;
691 typename MeshType::EdgeIter e_it;
692 typename MeshType::Point cog, zero_point(0.0, 0.0, 0.0);
693 typename MeshType::HalfedgeHandle heh;
695 for (e_it = mesh_.edges_begin(); e_it != mesh_.edges_end(); ++e_it) {
699 for (
int i = 0; i <= 1; ++i) {
701 heh = mesh_.halfedge_handle(*e_it, i);
702 if (!mesh_.is_boundary(heh))
704 cog += mesh_.point(mesh_.to_vertex_handle(mesh_.next_halfedge_handle(heh))) * (0.5 - _c);
705 cog += mesh_.data(mesh_.to_vertex_handle(heh)).position() * _c;
709 cog += mesh_.data(mesh_.to_vertex_handle(heh)).position();
713 mesh_.data(*e_it).set_position(cog);
718 template<
typename MeshType,
typename RealType>
721 assert(p_mesh_); MeshType& mesh_ = *p_mesh_;
723 typename MeshType::EdgeIter e_it;
724 typename MeshType::Point cog, zero_point(0.0, 0.0, 0.0);
725 typename MeshType::HalfedgeHandle heh;
726 typename MeshType::VertexOHalfedgeIter voh_it;
727 unsigned int valence[2], i;
729 for (e_it = mesh_.edges_begin(); e_it != mesh_.edges_end(); ++e_it) {
733 for (i = 0; i <= 1; ++i)
735 heh = mesh_.halfedge_handle(*e_it, i);
739 for (voh_it = mesh_.voh_iter(mesh_.to_vertex_handle(heh)); voh_it; ++voh_it)
745 if (valence[0] < valence[1])
750 heh = mesh_.halfedge_handle(*e_it, i);
752 if (!mesh_.is_boundary(heh)) {
753 cog += mesh_.point(mesh_.to_vertex_handle(mesh_.next_halfedge_handle(heh))) * (_gamma);
754 cog += mesh_.data(mesh_.to_vertex_handle(heh)).position() * (1.0 - 3.0 * _gamma);
756 cog += mesh_.data(mesh_.to_vertex_handle(heh)).position() * (1.0 - 2.0 * _gamma);
760 heh = mesh_.halfedge_handle(*e_it, 1-i);
762 if (!mesh_.is_boundary(heh))
764 cog += mesh_.point(mesh_.to_vertex_handle(mesh_.next_halfedge_handle(heh))) * (_gamma);
765 cog += mesh_.data(mesh_.to_vertex_handle(heh)).position() * _gamma;
769 cog += mesh_.data(mesh_.to_vertex_handle(heh)).position() * 2.0 * _gamma;
772 mesh_.data(*e_it).set_position(cog);
777 template<
typename MeshType,
typename RealType>
780 assert(p_mesh_); MeshType& mesh_ = *p_mesh_;
782 typename MeshType::EdgeIter e_it;
783 typename MeshType::Point cog, zero_point(0.0, 0.0, 0.0);
784 typename MeshType::HalfedgeHandle heh;
785 typename MeshType::VertexOHalfedgeIter voh_it;
786 unsigned int valence[2], i;
789 for (e_it = mesh_.edges_begin(); e_it != mesh_.edges_end(); ++e_it) {
793 for (i = 0; i <= 1; ++i) {
795 heh = mesh_.halfedge_handle(*e_it, i);
799 for (voh_it = mesh_.voh_iter(mesh_.to_vertex_handle(heh)); voh_it; ++voh_it)
805 if (valence[0] < valence[1])
810 gamma = _coeff(valence[i]);
812 heh = mesh_.halfedge_handle(*e_it, i);
814 if (!mesh_.is_boundary(heh))
816 cog += mesh_.point(mesh_.to_vertex_handle(mesh_.next_halfedge_handle(heh))) * (gamma);
817 cog += mesh_.data(mesh_.to_vertex_handle(heh)).position() * (1.0 - 3.0 * gamma);
821 cog += mesh_.data(mesh_.to_vertex_handle(heh)).position() * (1.0 - 2.0 * gamma);
825 heh = mesh_.halfedge_handle(*e_it, 1-i);
827 if (!mesh_.is_boundary(heh)) {
828 cog += mesh_.point(mesh_.to_vertex_handle(mesh_.next_halfedge_handle(heh))) * (gamma);
829 cog += mesh_.data(mesh_.to_vertex_handle(heh)).position() * gamma;
831 cog += mesh_.data(mesh_.to_vertex_handle(heh)).position() * 2.0 * gamma;
834 mesh_.data(*e_it).set_position(cog);
839 template<
typename MeshType,
typename RealType>
842 assert(p_mesh_); MeshType& mesh_ = *p_mesh_;
844 typename MeshType::VertexIter v_it;
845 typename MeshType::Point cog, zero_point(0.0, 0.0, 0.0);
846 typename MeshType::VertexEdgeIter ve_it;
848 for (v_it = mesh_.vertices_begin(); v_it != mesh_.vertices_end(); ++v_it)
850 unsigned int valence = 0;
853 for (ve_it = mesh_.ve_iter(*v_it); ve_it; ++ve_it) {
854 cog += mesh_.data(ve_it).position();
860 mesh_.data(*v_it).set_position(cog);
865 template<
typename MeshType,
typename RealType>
868 assert(p_mesh_); MeshType& mesh_ = *p_mesh_;
870 typename MeshType::VertexIter v_it;
871 typename MeshType::Point cog, zero_point(0.0, 0.0, 0.0);
872 typename MeshType::VertexOHalfedgeIter voh_it;
875 for (v_it = mesh_.vertices_begin(); v_it != mesh_.vertices_end(); ++v_it)
877 unsigned int valence = 0;
880 for (voh_it = mesh_.voh_iter(*v_it); voh_it.is_valid(); ++voh_it)
886 c =
static_cast<scalar_t
>(_coeff(valence));
888 for (voh_it = mesh_.voh_iter(*v_it); voh_it.is_valid(); ++voh_it) {
889 cog += mesh_.data(mesh_.edge_handle(*voh_it)).position() * c;
890 cog += mesh_.data(mesh_.edge_handle(mesh_.next_halfedge_handle(*voh_it))).position() * (1.0 - c);
895 mesh_.data(*v_it).set_position(cog);
900 template<
typename MeshType,
typename RealType>
903 assert(p_mesh_); MeshType& mesh_ = *p_mesh_;
904 typename MeshType::VertexIter v_it;
905 typename MeshType::Point cog, zero_point(0.0, 0.0, 0.0);
906 typename MeshType::VertexOHalfedgeIter voh_it;
908 for (v_it = mesh_.vertices_begin(); v_it != mesh_.vertices_end(); ++v_it) {
909 unsigned int valence = 0;
912 for (voh_it = mesh_.voh_iter(*v_it); voh_it; ++voh_it) {
916 for (voh_it = mesh_.voh_iter(*v_it); voh_it; ++voh_it) {
917 cog += mesh_.data(mesh_.edge_handle(*voh_it)).position() * _c;
918 cog += mesh_.data(mesh_.edge_handle(mesh_.next_halfedge_handle(*voh_it))).position() * (1.0 - _c);
923 mesh_.data(*v_it).set_position(cog);
928 template<
typename MeshType,
typename RealType>
931 assert(p_mesh_); MeshType& mesh_ = *p_mesh_;
933 typename MeshType::FaceIter f_it;
934 typename MeshType::FaceEdgeIter fe_it;
935 typename MeshType::Point cog, zero_point(0.0, 0.0, 0.0);
937 for (f_it = mesh_.faces_begin(); f_it != mesh_.faces_end(); ++f_it) {
938 unsigned int valence = 0;
941 for (fe_it = mesh_.fe_iter(*f_it); fe_it; ++fe_it) {
943 cog += mesh_.data(fe_it).position();
947 mesh_.data(*f_it).set_position(cog);
952 template<
typename MeshType,
typename RealType>
955 assert(p_mesh_); MeshType& mesh_ = *p_mesh_;
957 typename MeshType::EdgeIter e_it;
958 typename MeshType::Point cog, zero_point(0.0, 0.0, 0.0);
960 for (e_it = mesh_.edges_begin(); e_it != mesh_.edges_end(); ++e_it) {
961 unsigned int valence = 0;
964 if (mesh_.face_handle(mesh_.halfedge_handle(*e_it, 0)).is_valid()) {
965 cog += mesh_.data(mesh_.face_handle(mesh_.halfedge_handle(*e_it, 0))).position();
969 if (mesh_.face_handle(mesh_.halfedge_handle(*e_it, 1)).is_valid()) {
970 cog += mesh_.data(mesh_.face_handle(mesh_.halfedge_handle(*e_it, 1))).position();
975 mesh_.data(*e_it).set_position(cog);
980 template<
typename MeshType,
typename RealType>
983 assert(p_mesh_); MeshType& mesh_ = *p_mesh_;
985 typename MeshType::EdgeIter e_it;
986 typename MeshType::Point cog;
988 for (e_it = mesh_.edges_begin(); e_it != mesh_.edges_end(); ++e_it)
990 cog = mesh_.data(mesh_.to_vertex_handle(mesh_.halfedge_handle(*e_it, 0))).position();
991 cog += mesh_.data(mesh_.to_vertex_handle(mesh_.halfedge_handle(*e_it, 1))).position();
993 mesh_.data(*e_it).set_position(cog);
998 template<
typename MeshType,
typename RealType>
1001 assert(p_mesh_); MeshType& mesh_ = *p_mesh_;
1003 typename MeshType::Point cog, zero_point(0.0, 0.0, 0.0);
1004 typename MeshType::VertexVertexIter vv_it;
1005 typename MeshType::VertexIter v_it;
1006 std::vector<typename MeshType::Point> point_vector;
1008 point_vector.clear();
1010 for (v_it = mesh_.vertices_begin(); v_it != mesh_.vertices_end(); ++v_it) {
1012 unsigned int valence = 0;
1015 for (vv_it = mesh_.vv_iter(*v_it); vv_it; ++vv_it) {
1016 cog += vv_it->position();
1020 point_vector.push_back(cog);
1023 for (v_it = mesh_.vertices_end(); v_it != mesh_.vertices_begin(); )
1026 mesh_.data(*v_it).set_position(point_vector.back());
1027 point_vector.pop_back();
1032 template<
typename MeshType,
typename RealType>
1035 assert(p_mesh_); MeshType& mesh_ = *p_mesh_;
1037 typename MeshType::Point cog,
1038 zero_point(0.0, 0.0, 0.0);
1039 typename MeshType::VertexVertexIter vv_it;
1040 typename MeshType::VertexIter v_it;
1042 std::vector<typename MeshType::Point> point_vector;
1044 for (v_it = mesh_.vertices_begin(); v_it != mesh_.vertices_end(); ++v_it)
1046 unsigned int valence = 0;
1049 for (vv_it = mesh_.vv_iter(*v_it); vv_it; ++vv_it)
1051 cog += vv_it->position();
1055 c = _coeff(valence);
1056 cog = cog * (1 - c) + mesh_.data(*v_it).position() * c;
1057 point_vector.push_back(cog);
1059 for (v_it = mesh_.vertices_end(); v_it != mesh_.vertices_begin(); )
1062 mesh_.data(*v_it).set_position(point_vector.back());
1063 point_vector.pop_back();
1068 template<
typename MeshType,
typename RealType>
1071 assert(p_mesh_); MeshType& mesh_ = *p_mesh_;
1073 typename MeshType::Point cog, zero_point(0.0, 0.0, 0.0);
1074 typename MeshType::VertexVertexIter vv_it;
1075 typename MeshType::VertexIter v_it;
1076 std::vector<typename MeshType::Point> point_vector;
1078 for (v_it = mesh_.vertices_begin(); v_it != mesh_.vertices_end(); ++v_it) {
1080 unsigned int valence = 0;
1083 for (vv_it = mesh_.vv_iter(*v_it); vv_it; ++vv_it) {
1084 cog += mesh_.data(vv_it).position();
1089 cog = cog * (1.0 - _c) + v_it->position() * _c;
1091 point_vector.push_back(cog);
1094 for (v_it = mesh_.vertices_end(); v_it != mesh_.vertices_begin(); ) {
1097 mesh_.data(*v_it).set_position(point_vector.back());
1098 point_vector.pop_back();
1104 template<
typename MeshType,
typename RealType>
1107 assert(p_mesh_); MeshType& mesh_ = *p_mesh_;
1109 typename MeshType::Point cog, zero_point(0.0, 0.0, 0.0);
1110 typename MeshType::EdgeIter e_it;
1111 typename MeshType::HalfedgeHandle heh;
1112 std::vector<typename MeshType::Point> point_vector;
1114 point_vector.clear();
1116 for (e_it = mesh_.edges_begin(); e_it != mesh_.edges_end(); ++e_it) {
1118 unsigned int valence = 0;
1121 for (
int i = 0; i <= 1; ++i) {
1122 heh = mesh_.halfedge_handle(*e_it, i);
1123 if (mesh_.face_handle(heh).is_valid())
1125 cog += mesh_.data(mesh_.edge_handle(mesh_.next_halfedge_handle(heh))).position();
1126 cog += mesh_.data(mesh_.edge_handle(mesh_.next_halfedge_handle(mesh_.next_halfedge_handle(heh)))).position();
1133 point_vector.push_back(cog);
1136 for (e_it = mesh_.edges_end(); e_it != mesh_.edges_begin(); )
1139 mesh_.data(*e_it).set_position(point_vector.back());
1140 point_vector.pop_back();
1145 template<
typename MeshType,
typename RealType>
1148 assert(p_mesh_); MeshType& mesh_ = *p_mesh_;
1150 typename MeshType::Point cog, zero_point(0.0, 0.0, 0.0);
1151 typename MeshType::EdgeIter e_it;
1152 typename MeshType::HalfedgeHandle heh;
1153 std::vector<typename MeshType::Point> point_vector;
1155 point_vector.clear();
1157 for (e_it = mesh_.edges_begin(); e_it != mesh_.edges_end(); ++e_it)
1159 unsigned int valence = 0;
1162 for (
int i = 0; i <= 1; ++i) {
1163 heh = mesh_.halfedge_handle(*e_it, i);
1164 if (mesh_.face_handle(heh).is_valid())
1166 cog += mesh_.data(mesh_.edge_handle(mesh_.next_halfedge_handle(heh))).position() * (1.0 - _c);
1167 cog += mesh_.data(mesh_.edge_handle(mesh_.next_halfedge_handle(mesh_.next_halfedge_handle(heh)))).position() * (1.0 - _c);
1174 cog += mesh_.data(e_it).position() * _c;
1175 point_vector.push_back(cog);
1178 for (e_it = mesh_.edges_end(); e_it != mesh_.edges_begin(); ) {
1181 mesh_.data(*e_it).set_position(point_vector.back());
1182 point_vector.pop_back();
1188 template<
typename MeshType,
typename RealType>
1191 assert(p_mesh_); MeshType& mesh_ = *p_mesh_;
1194 typename MeshType::HalfedgeHandle heh5(_heh);
1195 typename MeshType::HalfedgeHandle heh6(mesh_.next_halfedge_handle(_heh));
1198 for (; mesh_.next_halfedge_handle(mesh_.next_halfedge_handle(heh5)) != _heh;
1199 heh5 = mesh_.next_halfedge_handle(heh5)) {};
1201 typename MeshType::HalfedgeHandle heh2(mesh_.next_halfedge_handle(heh5));
1202 typename MeshType::HalfedgeHandle
1203 heh3(mesh_.new_edge(mesh_.to_vertex_handle(_heh),
1204 mesh_.to_vertex_handle(heh5)));
1205 typename MeshType::HalfedgeHandle heh4(mesh_.opposite_halfedge_handle(heh3));
1208 typename MeshType::FaceHandle fh_old(mesh_.face_handle(heh6));
1209 typename MeshType::FaceHandle fh_new(mesh_.new_face());
1212 mesh_.data(fh_new).set_position(mesh_.data(fh_old).position());
1215 mesh_.set_next_halfedge_handle(heh4, heh6);
1216 mesh_.set_next_halfedge_handle(heh5, heh4);
1218 mesh_.set_face_handle(heh4, fh_old);
1219 mesh_.set_face_handle(heh5, fh_old);
1220 mesh_.set_face_handle(heh6, fh_old);
1221 mesh_.set_halfedge_handle(fh_old, heh4);
1224 mesh_.set_next_halfedge_handle(_heh, heh3);
1225 mesh_.set_next_halfedge_handle(heh3, heh2);
1227 mesh_.set_face_handle(_heh, fh_new);
1228 mesh_.set_face_handle(heh2, fh_new);
1229 mesh_.set_face_handle(heh3, fh_new);
1231 mesh_.set_halfedge_handle(fh_new, _heh);
1236 template<
typename MeshType,
typename RealType>
1237 typename MeshType::VertexHandle
1240 assert(p_mesh_); MeshType& mesh_ = *p_mesh_;
1242 HalfedgeHandle heh1;
1243 HalfedgeHandle heh2;
1244 HalfedgeHandle heh3;
1245 HalfedgeHandle temp_heh;
1249 vh1(mesh_.to_vertex_handle(_heh)),
1250 vh2(mesh_.from_vertex_handle(_heh));
1253 vh = mesh_.
add_vertex((mesh_.point(vh2) + mesh_.point(vh1)) / static_cast<typename MeshType::Point::value_type>(2.0) );
1255 heh2 = mesh_.opposite_halfedge_handle(_heh);
1257 if (!mesh_.is_boundary(mesh_.edge_handle(_heh))) {
1259 for (temp_heh = mesh_.next_halfedge_handle(heh2);
1260 mesh_.next_halfedge_handle(temp_heh) != heh2;
1261 temp_heh = mesh_.next_halfedge_handle(temp_heh) ) {}
1263 for (temp_heh = _heh;
1264 mesh_.next_halfedge_handle(temp_heh) != heh2;
1265 temp_heh = mesh_.opposite_halfedge_handle(mesh_.next_halfedge_handle(temp_heh))) {}
1268 heh1 = mesh_.new_edge(vh, vh1);
1269 heh3 = mesh_.opposite_halfedge_handle(heh1);
1270 mesh_.set_vertex_handle(_heh, vh);
1271 mesh_.set_next_halfedge_handle(temp_heh, heh3);
1272 mesh_.set_next_halfedge_handle(heh1, mesh_.next_halfedge_handle(_heh));
1273 mesh_.set_next_halfedge_handle(_heh, heh1);
1274 mesh_.set_next_halfedge_handle(heh3, heh2);
1275 if (mesh_.face_handle(heh2).is_valid()) {
1276 mesh_.set_face_handle(heh3, mesh_.face_handle(heh2));
1277 mesh_.set_halfedge_handle(mesh_.face_handle(heh3), heh3);
1279 mesh_.set_face_handle(heh1, mesh_.face_handle(_heh));
1280 mesh_.set_halfedge_handle(vh, heh1);
1281 mesh_.set_halfedge_handle(mesh_.face_handle(_heh), _heh);
1282 mesh_.set_halfedge_handle(vh1, heh3);
1293 #endif // OPENMESH_SUBDIVIDER_UNIFORM_COMPOSITE_CC defined
void EF()
Edge to face averaging.
void VF()
Vertex to Face Averaging.
void Tvv3()
Split Face, using Vertex information (1-3 split)
void FVc(Coeff &_coeff)
Weighted face to vertex Averaging with flaps.
void EV()
Edge to vertex averaging.
void EdEc(scalar_t _c)
Weighted edge to edge averaging w/ flap rule.
Abstract base class for coefficient functions.
void VdEc(scalar_t _c)
Weighted vertex to edge averaging, using diamond of edges.
VertexHandle add_vertex(const Point &_p)
Alias for new_vertex(const Point&).
void FE()
Face to edge averaging.
VertexHandle split_edge(HalfedgeHandle _heh)
Split Edge.
void Tvv4()
Split Face, using Vertex information (1-4 split)
void FFc(Coeff &_coeff)
Weighted face to face averaging.
void EdE()
Edge to edge averaging w/ flap rule.
void VE()
VE Step (Vertex to Edge Averaging)
void Tfv()
Split Face, using Face Information.
void VVc(Coeff &_coeff)
Vertex to vertex averaging, weighted.
void VV()
Vertex to vertex averaging.
bool prepare(MeshType &_m)
Prepare mesh, e.g. add properties.
void VdE()
Vertex to edge averaging, using diamond of edges.
void corner_cutting(HalfedgeHandle _heh)
Corner Cutting.
void EVc(Coeff &_coeff)
Weighted edge to vertex averaging.
void FF()
Face to face averaging.
void VFa(Coeff &_coeff)
Vertex to Face Averaging, weighted.
void FV()
Face to vertex averaging.