56 #ifndef OPENMESH_MESH_DUAL_H
57 #define OPENMESH_MESH_DUAL_H
63 #if defined(OM_CC_MIPS)
69 #include <OpenMesh/Core/Mesh/PolyMesh_ArrayKernelT.hh>
70 #include <OpenMesh/Core/Utils/Property.hh>
87 template <
typename MeshTraits>
88 PolyMesh_ArrayKernelT<MeshTraits>* MeshDual (PolyMesh_ArrayKernelT<MeshTraits> &primal)
90 PolyMesh_ArrayKernelT<MeshTraits>* dual =
new PolyMesh_ArrayKernelT<MeshTraits>();
95 FPropHandleT< typename PolyMesh_ArrayKernelT<MeshTraits>::VertexHandle > primalToDual;
96 primal.add_property(primalToDual);
99 for(
typename PolyMesh_ArrayKernelT<MeshTraits>::ConstFaceIter fit=primal.faces_begin(); fit!=primal.faces_end(); ++fit)
101 typename PolyMesh_ArrayKernelT<MeshTraits>::Point centerPoint(0,0,0);
102 typename PolyMesh_ArrayKernelT<MeshTraits>::Scalar degree= 0.0;
103 for(
typename PolyMesh_ArrayKernelT<MeshTraits>::ConstFaceVertexIter vit=primal.cfv_iter(*fit); vit.is_valid(); ++vit, ++degree)
104 centerPoint += primal.point(*vit);
106 centerPoint /= degree;
107 primal.property(primalToDual, *fit) = dual->add_vertex(centerPoint);
111 std::vector< typename PolyMesh_ArrayKernelT<MeshTraits>::VertexHandle > face_vhandles;
112 for(
typename PolyMesh_ArrayKernelT<MeshTraits>::ConstVertexIter vit=primal.vertices_begin(); vit!=primal.vertices_end(); ++vit)
114 if(!primal.is_boundary(*vit))
116 face_vhandles.clear();
117 for(
typename PolyMesh_ArrayKernelT<MeshTraits>::ConstVertexFaceIter fit=primal.cvf_iter(*vit); fit.is_valid(); ++fit)
118 face_vhandles.push_back(primal.property(primalToDual, *fit));
119 dual->add_face(face_vhandles);
123 primal.remove_property(primalToDual);
135 #endif // OPENMESH_MESH_DUAL_H defined