45 #include <pcl/memory.h>
46 #include <pcl/pcl_macros.h>
47 #include <pcl/geometry/mesh_base.h>
61 template <
class MeshTraitsT>
69 using Ptr = shared_ptr<Self>;
141 add_triangle_ [0] = idx_v_0;
142 add_triangle_ [1] = idx_v_1;
143 add_triangle_ [2] = idx_v_2;
145 return (this->addFaceImplBase (add_triangle_, face_data, edge_data, half_edge_data));
162 if (vertices.size () != 4)
166 return (this->
addTrianglePair (vertices [0], vertices [1], vertices [2], vertices [3], face_data, edge_data, half_edge_data));
193 FaceIndex idx_face_0 = this->
addFace (idx_v_0, idx_v_1, idx_v_2, face_data);
194 FaceIndex idx_face_1 = this->
addFace (idx_v_0, idx_v_2, idx_v_3, face_data);
196 if (idx_face_0.isValid ())
198 return (std::make_pair (idx_face_0, idx_face_1));
200 if (idx_face_1.isValid ())
202 idx_face_0 = this->
addFace (idx_v_0, idx_v_1, idx_v_2, face_data);
203 return (std::make_pair (idx_face_1, idx_face_0));
210 idx_face_0 = this->
addFace (idx_v_1, idx_v_2, idx_v_3, face_data);
211 idx_face_1 = this->
addFace (idx_v_0, idx_v_1, idx_v_3, face_data);
213 if (idx_face_0.isValid ())
215 return (std::make_pair (idx_face_0, idx_face_1));
217 if (idx_face_1.isValid ())
219 idx_face_0 = this->
addFace (idx_v_1, idx_v_2, idx_v_3, face_data);
220 return (std::make_pair (idx_face_1, idx_face_0));
223 if (!IsManifold::value)
229 if (!Base::checkTopology1 (idx_v_0,idx_v_1, inner_he_atp_ [0], is_new_atp_ [0],
IsManifold ()) ||
230 !Base::checkTopology1 (idx_v_1,idx_v_2, inner_he_atp_ [1], is_new_atp_ [1],
IsManifold ()) ||
231 !Base::checkTopology1 (idx_v_2,idx_v_3, inner_he_atp_ [2], is_new_atp_ [2],
IsManifold ()) ||
232 !Base::checkTopology1 (idx_v_3,idx_v_0, inner_he_atp_ [3], is_new_atp_ [3],
IsManifold ()))
238 if (!is_new_atp_ [0] && is_new_atp_ [1] && !is_new_atp_ [2] && is_new_atp_ [3])
240 return (this->connectTrianglePair (inner_he_atp_ [0], inner_he_atp_ [2], idx_v_0, idx_v_1, idx_v_2, idx_v_3, face_data, edge_data, half_edge_data));
242 if (is_new_atp_ [0] && !is_new_atp_ [1] && is_new_atp_ [2] && !is_new_atp_ [3])
244 return (this->connectTrianglePair (inner_he_atp_ [1], inner_he_atp_ [3], idx_v_1, idx_v_2, idx_v_3, idx_v_0, face_data, edge_data, half_edge_data));
256 addFaceImpl (const VertexIndices& vertices,
257 const FaceData& face_data,
258 const EdgeData& edge_data,
259 const HalfEdgeData& half_edge_data)
261 if (vertices.size () == 3)
262 return (this->addFaceImplBase (vertices, face_data, edge_data, half_edge_data));
282 const HalfEdgeIndex idx_he_bc = Base::addEdge (idx_v_b, idx_v_c, he_data, edge_data);
283 const HalfEdgeIndex idx_he_da = Base::addEdge (idx_v_d, idx_v_a, he_data, edge_data);
284 const HalfEdgeIndex idx_he_ca = Base::addEdge (idx_v_c, idx_v_a, he_data, edge_data);
286 const HalfEdgeIndex idx_he_cb = Base::getOppositeHalfEdgeIndex (idx_he_bc);
287 const HalfEdgeIndex idx_he_ad = Base::getOppositeHalfEdgeIndex (idx_he_da);
288 const HalfEdgeIndex idx_he_ac = Base::getOppositeHalfEdgeIndex (idx_he_ca);
291 const HalfEdgeIndex idx_he_ab_prev = Base::getPrevHalfEdgeIndex (idx_he_ab);
292 const HalfEdgeIndex idx_he_ab_next = Base::getNextHalfEdgeIndex (idx_he_ab);
294 const HalfEdgeIndex idx_he_cd_prev = Base::getPrevHalfEdgeIndex (idx_he_cd);
295 const HalfEdgeIndex idx_he_cd_next = Base::getNextHalfEdgeIndex (idx_he_cd);
298 Base::connectPrevNext (idx_he_ab_prev, idx_he_ad );
299 Base::connectPrevNext (idx_he_ad , idx_he_cd_next);
300 Base::connectPrevNext (idx_he_cd_prev, idx_he_cb );
301 Base::connectPrevNext (idx_he_cb , idx_he_ab_next);
304 Base::connectPrevNext (idx_he_ab, idx_he_bc);
305 Base::connectPrevNext (idx_he_bc, idx_he_ca);
306 Base::connectPrevNext (idx_he_ca, idx_he_ab);
308 Base::connectPrevNext (idx_he_ac, idx_he_cd);
309 Base::connectPrevNext (idx_he_cd, idx_he_da);
310 Base::connectPrevNext (idx_he_da, idx_he_ac);
313 Base::setOutgoingHalfEdgeIndex (idx_v_a, idx_he_ad );
314 Base::setOutgoingHalfEdgeIndex (idx_v_b, idx_he_ab_next);
315 Base::setOutgoingHalfEdgeIndex (idx_v_c, idx_he_cb );
316 Base::setOutgoingHalfEdgeIndex (idx_v_d, idx_he_cd_next);
320 inner_he_abc.push_back (idx_he_ab);
321 inner_he_abc.push_back (idx_he_bc);
322 inner_he_abc.push_back (idx_he_ca);
325 inner_he_acd.push_back (idx_he_ac);
326 inner_he_acd.push_back (idx_he_cd);
327 inner_he_acd.push_back (idx_he_da);
329 const FaceIndex idx_f_abc = Base::connectFace (inner_he_abc, face_data);
330 const FaceIndex idx_f_acd = Base::connectFace (inner_he_acd, face_data);
332 return (std::make_pair (idx_f_abc, idx_f_acd));
346 std::vector <bool> is_new_atp_;
FaceIndexPair addTrianglePair(const VertexIndex &idx_v_0, const VertexIndex &idx_v_1, const VertexIndex &idx_v_2, const VertexIndex &idx_v_3, const FaceData &face_data=FaceData(), const EdgeData &edge_data=EdgeData(), const HalfEdgeData &half_edge_data=HalfEdgeData())
Add two triangles for the four given input vertices.
typename Base::IncomingHalfEdgeAroundVertexCirculator IncomingHalfEdgeAroundVertexCirculator
typename Base::HalfEdgeIndex HalfEdgeIndex
typename Base::InnerHalfEdgeAroundFaceCirculator InnerHalfEdgeAroundFaceCirculator
typename MeshTraitsT::VertexData VertexData
shared_ptr< const Self > ConstPtr
typename Base::EdgeDataCloud EdgeDataCloud
typename Base::VertexIndices VertexIndices
typename MeshTraitsT::IsManifold IsManifold
typename Base::EdgeData EdgeData
typename Base::FaceDataCloud FaceDataCloud
FaceIndexPair addTrianglePair(const VertexIndices &vertices, const FaceData &face_data=FaceData(), const EdgeData &edge_data=EdgeData(), const HalfEdgeData &half_edge_data=HalfEdgeData())
Add two triangles for the four given input vertices.
typename Base::IsManifold IsManifold
FaceIndex addFace(const VertexIndex &idx_v_0, const VertexIndex &idx_v_1, const VertexIndex &idx_v_2, const FaceData &face_data=FaceData(), const EdgeData &edge_data=EdgeData(), const HalfEdgeData &half_edge_data=HalfEdgeData())
Add a triangle to the mesh.
#define PCL_MAKE_ALIGNED_OPERATOR_NEW
Macro to signal a class requires a custom allocator.
typename MeshTraitsT::HalfEdgeData HalfEdgeData
typename MeshTraitsT::FaceData FaceData
typename Base::EdgeIndices EdgeIndices
typename Base::HasFaceData HasFaceData
typename Base::HalfEdgeIndices HalfEdgeIndices
Index used to access elements in the half-edge mesh.
Index used to access elements in the half-edge mesh.
typename Base::FaceData FaceData
typename Base::VertexIndex VertexIndex
Index used to access elements in the half-edge mesh.
typename Base::OuterHalfEdgeAroundFaceCirculator OuterHalfEdgeAroundFaceCirculator
typename Base::VertexAroundFaceCirculator VertexAroundFaceCirculator
typename Base::VertexAroundVertexCirculator VertexAroundVertexCirculator
typename Base::FaceIndices FaceIndices
typename Base::MeshTag MeshTag
typename Base::HasEdgeData HasEdgeData
typename Base::VertexData VertexData
typename Base::HalfEdgeDataCloud HalfEdgeDataCloud
typename MeshTraitsT::EdgeData EdgeData
typename Base::FaceIndex FaceIndex
typename Base::HalfEdgeData HalfEdgeData
std::pair< FaceIndex, FaceIndex > FaceIndexPair
typename Base::EdgeIndex EdgeIndex
Base class for the half-edge mesh.
Half-edge mesh that can only store triangles.
typename Base::FaceAroundFaceCirculator FaceAroundFaceCirculator
typename Base::VertexDataCloud VertexDataCloud
typename Base::FaceAroundVertexCirculator FaceAroundVertexCirculator
typename Base::HasVertexData HasVertexData
typename Base::OutgoingHalfEdgeAroundVertexCirculator OutgoingHalfEdgeAroundVertexCirculator
typename Base::HasHalfEdgeData HasHalfEdgeData
TriangleMesh()
Constructor.
Tag describing the type of the mesh.