59 using HalfEdgeMesh = HalfEdgeMeshT;
60 using VAFC =
typename HalfEdgeMesh::VertexAroundFaceCirculator;
61 using FaceIndex =
typename HalfEdgeMesh::FaceIndex;
66 face_vertex_mesh.
polygons.reserve(half_edge_mesh.sizeFaces());
67 for (std::size_t i = 0; i < half_edge_mesh.sizeFaces(); ++i) {
68 VAFC circ = half_edge_mesh.getVertexAroundFaceCirculator(
FaceIndex(i));
69 const VAFC circ_end = circ;
72 polygon.
vertices.push_back(circ.getTargetIndex().get());
73 }
while (++circ != circ_end);
74 face_vertex_mesh.
polygons.push_back(polygon);
90 using HalfEdgeMesh = HalfEdgeMeshT;
91 using VertexDataCloud =
typename HalfEdgeMesh::VertexDataCloud;
92 using VertexIndices =
typename HalfEdgeMesh::VertexIndices;
94 static_assert(HalfEdgeMesh::HasVertexData::value,
95 "Output mesh must have data associated with the vertices!");
97 VertexDataCloud vertices;
100 half_edge_mesh.reserveVertices(vertices.size());
101 half_edge_mesh.reserveEdges(3 * face_vertex_mesh.
polygons.size());
102 half_edge_mesh.reserveFaces(face_vertex_mesh.
polygons.size());
104 for (
const auto& vertex : vertices) {
105 half_edge_mesh.addVertex(vertex);
108 assert(half_edge_mesh.sizeVertices() == vertices.size());
110 int count_not_added = 0;
113 for (
const auto& polygon : face_vertex_mesh.
polygons) {
115 for (
const auto& vertex : polygon.vertices) {
116 vi.emplace_back(vertex);
119 if (!half_edge_mesh.addFace(vi).isValid()) {
124 return (count_not_added);
void fromPCLPointCloud2(const pcl::PCLPointCloud2 &msg, pcl::PointCloud< PointT > &cloud, const MsgFieldMap &field_map, const std::uint8_t *msg_data)
Convert a PCLPointCloud2 binary data blob into a pcl::PointCloud<T> object using a field_map.