41 #ifndef PCL_SURFACE_ORGANIZED_FAST_MESH_HPP_
42 #define PCL_SURFACE_ORGANIZED_FAST_MESH_HPP_
44 #include <pcl/surface/organized_fast_mesh.h>
47 template <
typename Po
intInT>
void
50 reconstructPolygons (output.
polygons);
56 if (x_idx == -1 || y_idx == -1 || z_idx == -1)
62 for (std::size_t i = 0; i < input_->size (); ++i)
64 resetPointData (i, output, 0.0f, x_idx, y_idx, z_idx);
68 template <
typename Po
intInT>
void
71 reconstructPolygons (polygons);
75 template <
typename Po
intInT>
void
78 if (triangulation_type_ == TRIANGLE_RIGHT_CUT)
79 makeRightCutMesh (polygons);
80 else if (triangulation_type_ == TRIANGLE_LEFT_CUT)
81 makeLeftCutMesh (polygons);
82 else if (triangulation_type_ == TRIANGLE_ADAPTIVE_CUT)
83 makeAdaptiveCutMesh (polygons);
84 else if (triangulation_type_ == QUAD_MESH)
85 makeQuadMesh (polygons);
89 template <
typename Po
intInT>
void
92 int last_column = input_->width - triangle_pixel_size_columns_;
93 int last_row = input_->height - triangle_pixel_size_rows_;
95 int i = 0, index_down = 0, index_right = 0, index_down_right = 0, idx = 0;
96 int y_big_incr = triangle_pixel_size_rows_ * input_->width,
97 x_big_incr = y_big_incr + triangle_pixel_size_columns_;
99 polygons.resize (input_->width * input_->height);
102 for (
int y = 0; y < last_row; y += triangle_pixel_size_rows_)
105 i = y * input_->width;
106 index_right = i + triangle_pixel_size_columns_;
107 index_down = i + y_big_incr;
108 index_down_right = i + x_big_incr;
111 for (
int x = 0; x < last_column; x += triangle_pixel_size_columns_,
112 i += triangle_pixel_size_columns_,
113 index_right += triangle_pixel_size_columns_,
114 index_down += triangle_pixel_size_columns_,
115 index_down_right += triangle_pixel_size_columns_)
117 if (isValidQuad (i, index_right, index_down_right, index_down))
118 if (store_shadowed_faces_ || !isShadowedQuad (i, index_right, index_down_right, index_down))
119 addQuad (i, index_right, index_down_right, index_down, idx++, polygons);
122 polygons.resize (idx);
126 template <
typename Po
intInT>
void
129 int last_column = input_->width - triangle_pixel_size_columns_;
130 int last_row = input_->height - triangle_pixel_size_rows_;
132 int i = 0, index_down = 0, index_right = 0, index_down_right = 0, idx = 0;
133 int y_big_incr = triangle_pixel_size_rows_ * input_->width,
134 x_big_incr = y_big_incr + triangle_pixel_size_columns_;
136 polygons.resize (input_->width * input_->height * 2);
139 for (
int y = 0; y < last_row; y += triangle_pixel_size_rows_)
142 i = y * input_->width;
143 index_right = i + triangle_pixel_size_columns_;
144 index_down = i + y_big_incr;
145 index_down_right = i + x_big_incr;
148 for (
int x = 0; x < last_column; x += triangle_pixel_size_columns_,
149 i += triangle_pixel_size_columns_,
150 index_right += triangle_pixel_size_columns_,
151 index_down += triangle_pixel_size_columns_,
152 index_down_right += triangle_pixel_size_columns_)
154 if (isValidTriangle (i, index_down_right, index_right))
155 if (store_shadowed_faces_ || !isShadowedTriangle (i, index_down_right, index_right))
156 addTriangle (i, index_down_right, index_right, idx++, polygons);
158 if (isValidTriangle (i, index_down, index_down_right))
159 if (store_shadowed_faces_ || !isShadowedTriangle (i, index_down, index_down_right))
160 addTriangle (i, index_down, index_down_right, idx++, polygons);
163 polygons.resize (idx);
167 template <
typename Po
intInT>
void
170 int last_column = input_->width - triangle_pixel_size_columns_;
171 int last_row = input_->height - triangle_pixel_size_rows_;
173 int i = 0, index_down = 0, index_right = 0, index_down_right = 0, idx = 0;
174 int y_big_incr = triangle_pixel_size_rows_ * input_->width,
175 x_big_incr = y_big_incr + triangle_pixel_size_columns_;
177 polygons.resize (input_->width * input_->height * 2);
180 for (
int y = 0; y < last_row; y += triangle_pixel_size_rows_)
183 i = y * input_->width;
184 index_right = i + triangle_pixel_size_columns_;
185 index_down = i + y_big_incr;
186 index_down_right = i + x_big_incr;
189 for (
int x = 0; x < last_column; x += triangle_pixel_size_columns_,
190 i += triangle_pixel_size_columns_,
191 index_right += triangle_pixel_size_columns_,
192 index_down += triangle_pixel_size_columns_,
193 index_down_right += triangle_pixel_size_columns_)
195 if (isValidTriangle (i, index_down, index_right))
196 if (store_shadowed_faces_ || !isShadowedTriangle (i, index_down, index_right))
197 addTriangle (i, index_down, index_right, idx++, polygons);
199 if (isValidTriangle (index_right, index_down, index_down_right))
200 if (store_shadowed_faces_ || !isShadowedTriangle (index_right, index_down, index_down_right))
201 addTriangle (index_right, index_down, index_down_right, idx++, polygons);
204 polygons.resize (idx);
208 template <
typename Po
intInT>
void
211 int last_column = input_->width - triangle_pixel_size_columns_;
212 int last_row = input_->height - triangle_pixel_size_rows_;
214 int i = 0, index_down = 0, index_right = 0, index_down_right = 0, idx = 0;
215 int y_big_incr = triangle_pixel_size_rows_ * input_->width,
216 x_big_incr = y_big_incr + triangle_pixel_size_columns_;
218 polygons.resize (input_->width * input_->height * 2);
221 for (
int y = 0; y < last_row; y += triangle_pixel_size_rows_)
224 i = y * input_->width;
225 index_right = i + triangle_pixel_size_columns_;
226 index_down = i + y_big_incr;
227 index_down_right = i + x_big_incr;
230 for (
int x = 0; x < last_column; x += triangle_pixel_size_columns_,
231 i += triangle_pixel_size_columns_,
232 index_right += triangle_pixel_size_columns_,
233 index_down += triangle_pixel_size_columns_,
234 index_down_right += triangle_pixel_size_columns_)
236 const bool right_cut_upper = isValidTriangle (i, index_down_right, index_right);
237 const bool right_cut_lower = isValidTriangle (i, index_down, index_down_right);
238 const bool left_cut_upper = isValidTriangle (i, index_down, index_right);
239 const bool left_cut_lower = isValidTriangle (index_right, index_down, index_down_right);
241 if (right_cut_upper && right_cut_lower && left_cut_upper && left_cut_lower)
243 float dist_right_cut = std::abs ((*input_)[index_down].z - (*input_)[index_right].z);
244 float dist_left_cut = std::abs ((*input_)[i].z - (*input_)[index_down_right].z);
245 if (dist_right_cut >= dist_left_cut)
247 if (store_shadowed_faces_ || !isShadowedTriangle (i, index_down_right, index_right))
248 addTriangle (i, index_down_right, index_right, idx++, polygons);
249 if (store_shadowed_faces_ || !isShadowedTriangle (i, index_down, index_down_right))
250 addTriangle (i, index_down, index_down_right, idx++, polygons);
254 if (store_shadowed_faces_ || !isShadowedTriangle (i, index_down, index_right))
255 addTriangle (i, index_down, index_right, idx++, polygons);
256 if (store_shadowed_faces_ || !isShadowedTriangle (index_right, index_down, index_down_right))
257 addTriangle (index_right, index_down, index_down_right, idx++, polygons);
263 if (store_shadowed_faces_ || !isShadowedTriangle (i, index_down_right, index_right))
264 addTriangle (i, index_down_right, index_right, idx++, polygons);
266 if (store_shadowed_faces_ || !isShadowedTriangle (i, index_down, index_down_right))
267 addTriangle (i, index_down, index_down_right, idx++, polygons);
269 if (store_shadowed_faces_ || !isShadowedTriangle (i, index_down, index_right))
270 addTriangle (i, index_down, index_right, idx++, polygons);
272 if (store_shadowed_faces_ || !isShadowedTriangle (index_right, index_down, index_down_right))
273 addTriangle (index_right, index_down, index_down_right, idx++, polygons);
277 polygons.resize (idx);
280 #define PCL_INSTANTIATE_OrganizedFastMesh(T) \
281 template class PCL_EXPORTS pcl::OrganizedFastMesh<T>;
void makeRightCutMesh(std::vector< pcl::Vertices > &polygons)
Create a right cut mesh.
void makeQuadMesh(std::vector< pcl::Vertices > &polygons)
Create a quad mesh.
void reconstructPolygons(std::vector< pcl::Vertices > &polygons)
Perform the actual polygonal reconstruction.
void performReconstruction(std::vector< pcl::Vertices > &polygons) override
Create the surface.
void makeAdaptiveCutMesh(std::vector< pcl::Vertices > &polygons)
Create an adaptive cut mesh.
void makeLeftCutMesh(std::vector< pcl::Vertices > &polygons)
Create a left cut mesh.
int getFieldIndex(const pcl::PointCloud< PointT > &, const std::string &field_name, std::vector< pcl::PCLPointField > &fields)
Get the index of a specified field (i.e., dimension/channel)
bool isFinite(const PointT &pt)
Tests if the 3D components of a point are all finite param[in] pt point to be tested return true if f...
std::vector< ::pcl::Vertices > polygons
::pcl::PCLPointCloud2 cloud