Point Cloud Library (PCL) 1.15.0
Loading...
Searching...
No Matches
mesh_elements.h
1/*
2 * Software License Agreement (BSD License)
3 *
4 * Point Cloud Library (PCL) - www.pointclouds.org
5 * Copyright (c) 2009-2012, Willow Garage, Inc.
6 * Copyright (c) 2012-, Open Perception, Inc.
7 *
8 * All rights reserved.
9 *
10 * Redistribution and use in source and binary forms, with or without
11 * modification, are permitted provided that the following conditions
12 * are met:
13 *
14 * * Redistributions of source code must retain the above copyright
15 * notice, this list of conditions and the following disclaimer.
16 * * Redistributions in binary form must reproduce the above
17 * copyright notice, this list of conditions and the following
18 * disclaimer in the documentation and/or other materials provided
19 * with the distribution.
20 * * Neither the name of the copyright holder(s) nor the names of its
21 * contributors may be used to endorse or promote products derived
22 * from this software without specific prior written permission.
23 *
24 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
25 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
26 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
27 * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
28 * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
29 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
30 * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
31 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
32 * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
33 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
34 * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
35 * POSSIBILITY OF SUCH DAMAGE.
36 *
37 * $Id$
38 *
39 */
40
41#pragma once
42
43#include <pcl/geometry/mesh_indices.h>
44
45namespace pcl {
46namespace geometry {
47template <class DerivedT, class MeshTraitsT, class MeshTagT>
48class MeshBase;
49
50template <class MeshT>
51class MeshIO;
52} // End namespace geometry
53} // End namespace pcl
54
55////////////////////////////////////////////////////////////////////////////////
56// Vertex
57////////////////////////////////////////////////////////////////////////////////
58
59namespace pcl {
60namespace geometry {
61/** \brief A vertex is a node in the mesh.
62 * \author Martin Saelzle
63 * \ingroup geometry
64 */
65class Vertex {
66private:
68
69 /** \brief Constructor.
70 * \param[in] idx_outgoing_half_edge Index to the outgoing half-edge. Defaults to an
71 * invalid index.
72 */
73 explicit Vertex(const HalfEdgeIndex& idx_outgoing_half_edge = HalfEdgeIndex())
74 : idx_outgoing_half_edge_(idx_outgoing_half_edge)
75 {}
76
77 /** \brief Index to the outgoing half-edge. The vertex is considered to be deleted if
78 * it stores an invalid outgoing half-edge index. */
79 HalfEdgeIndex idx_outgoing_half_edge_;
80
81 template <class DerivedT, class MeshTraitsT, class MeshTagT>
83
84 template <class MeshT>
86};
87} // End namespace geometry
88} // End namespace pcl
89
90////////////////////////////////////////////////////////////////////////////////
91// HalfEdge
92////////////////////////////////////////////////////////////////////////////////
93
94namespace pcl {
95namespace geometry {
96/** \brief An edge is a connection between two vertices. In a half-edge mesh the edge is
97 * split into two half-edges with opposite orientation. Each half-edge stores the index
98 * to the terminating vertex, the next half-edge, the previous half-edge and the face it
99 * belongs to. The opposite half-edge is accessed implicitly.
100 * \author Martin Saelzle
101 * \ingroup geometry
102 */
103class HalfEdge {
104private:
105 using VertexIndex = pcl::geometry::VertexIndex;
106 using HalfEdgeIndex = pcl::geometry::HalfEdgeIndex;
107 using FaceIndex = pcl::geometry::FaceIndex;
108
109 /** \brief Constructor.
110 * \param[in] idx_terminating_vertex Index to the terminating vertex. Defaults to an
111 * invalid index.
112 * \param[in] idx_next_half_edge Index to the next half-edge.
113 * Defaults to an invalid index.
114 * \param[in] idx_prev_half_edge Index to the
115 * previous half-edge. Defaults to an invalid index.
116 * \param[in] idx_face Index to the
117 * face. Defaults to an invalid index.
118 */
119 explicit HalfEdge(const VertexIndex& idx_terminating_vertex = VertexIndex(),
120 const HalfEdgeIndex& idx_next_half_edge = HalfEdgeIndex(),
121 const HalfEdgeIndex& idx_prev_half_edge = HalfEdgeIndex(),
122 const FaceIndex& idx_face = FaceIndex())
123 : idx_terminating_vertex_(idx_terminating_vertex)
124 , idx_next_half_edge_(idx_next_half_edge)
125 , idx_prev_half_edge_(idx_prev_half_edge)
126 , idx_face_(idx_face)
127 {}
128
129 /** \brief Index to the terminating vertex. The half-edge is considered to be deleted
130 * if it stores an invalid terminating vertex index. */
131 VertexIndex idx_terminating_vertex_;
132
133 /** \brief Index to the next half-edge. */
134 HalfEdgeIndex idx_next_half_edge_;
135
136 /** \brief Index to the previous half-edge. */
137 HalfEdgeIndex idx_prev_half_edge_;
138
139 /** \brief Index to the face. The half-edge is considered to be on the boundary if it
140 * stores an invalid face index. */
141 FaceIndex idx_face_;
142
143 template <class DerivedT, class MeshTraitsT, class MeshTagT>
144 friend class pcl::geometry::MeshBase;
145
146 template <class MeshT>
147 friend class pcl::geometry::MeshIO;
148};
149} // End namespace geometry
150} // End namespace pcl
151
152////////////////////////////////////////////////////////////////////////////////
153// Face
154////////////////////////////////////////////////////////////////////////////////
155
156namespace pcl {
157namespace geometry {
158/** \brief A face is a closed loop of edges.
159 * \author Martin Saelzle
160 * \ingroup geometry
161 */
162class Face {
163private:
164 using HalfEdgeIndex = pcl::geometry::HalfEdgeIndex;
165
166 /** \brief Constructor.
167 * \param[in] inner_half_edge_idx Index to the outgoing half-edge. Defaults to an
168 * invalid index
169 */
170 explicit Face(const HalfEdgeIndex& idx_inner_half_edge = HalfEdgeIndex())
171 : idx_inner_half_edge_(idx_inner_half_edge)
172 {}
173
174 /** \brief Index to the inner half-edge. The face is considered to be deleted if it
175 * stores an invalid inner half-edge index. */
176 HalfEdgeIndex idx_inner_half_edge_;
177
178 template <class DerivedT, class MeshTraitsT, class MeshTagT>
179 friend class pcl::geometry::MeshBase;
180
181 template <class MeshT>
182 friend class pcl::geometry::MeshIO;
183};
184} // End namespace geometry
185} // End namespace pcl
Base class for the half-edge mesh.
Definition mesh_base.h:96
Read / write the half-edge mesh from / to a file.
Definition mesh_io.h:60
A vertex is a node in the mesh.