151 lines
5.5 KiB
C
151 lines
5.5 KiB
C
|
|
/*
|
||
|
|
* Software License Agreement (BSD License)
|
||
|
|
*
|
||
|
|
* Copyright (c) 2010, Willow Garage, Inc.
|
||
|
|
* All rights reserved.
|
||
|
|
*
|
||
|
|
* Redistribution and use in source and binary forms, with or without
|
||
|
|
* modification, are permitted provided that the following conditions
|
||
|
|
* are met:
|
||
|
|
*
|
||
|
|
* * Redistributions of source code must retain the above copyright
|
||
|
|
* notice, this list of conditions and the following disclaimer.
|
||
|
|
* * Redistributions in binary form must reproduce the above
|
||
|
|
* copyright notice, this list of conditions and the following
|
||
|
|
* disclaimer in the documentation and/or other materials provided
|
||
|
|
* with the distribution.
|
||
|
|
* * Neither the name of Willow Garage, Inc. nor the names of its
|
||
|
|
* contributors may be used to endorse or promote products derived
|
||
|
|
* from this software without specific prior written permission.
|
||
|
|
*
|
||
|
|
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||
|
|
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||
|
|
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
|
||
|
|
* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
|
||
|
|
* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
|
||
|
|
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
|
||
|
|
* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||
|
|
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
|
||
|
|
* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
||
|
|
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
|
||
|
|
* ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||
|
|
* POSSIBILITY OF SUCH DAMAGE.
|
||
|
|
*
|
||
|
|
* $Id$
|
||
|
|
*
|
||
|
|
*/
|
||
|
|
|
||
|
|
#pragma once
|
||
|
|
|
||
|
|
#include <pcl/point_types.h>
|
||
|
|
#include <pcl/surface/processing.h>
|
||
|
|
|
||
|
|
namespace pcl
|
||
|
|
{
|
||
|
|
|
||
|
|
/** \brief The ear clipping triangulation algorithm.
|
||
|
|
* The code is inspired by Flavien Brebion implementation, which is
|
||
|
|
* in n^3 and does not handle holes.
|
||
|
|
* \author Nicolas Burrus
|
||
|
|
* \ingroup surface
|
||
|
|
*/
|
||
|
|
class PCL_EXPORTS EarClipping : public MeshProcessing
|
||
|
|
{
|
||
|
|
public:
|
||
|
|
using Ptr = shared_ptr<EarClipping>;
|
||
|
|
using ConstPtr = shared_ptr<const EarClipping>;
|
||
|
|
|
||
|
|
using MeshProcessing::input_mesh_;
|
||
|
|
using MeshProcessing::initCompute;
|
||
|
|
/** \brief Empty constructor */
|
||
|
|
EarClipping ()
|
||
|
|
{
|
||
|
|
};
|
||
|
|
|
||
|
|
protected:
|
||
|
|
/** \brief a Pointer to the point cloud data. */
|
||
|
|
pcl::PointCloud<pcl::PointXYZ>::Ptr points_;
|
||
|
|
|
||
|
|
/** \brief This method should get called before starting the actual computation. */
|
||
|
|
bool
|
||
|
|
initCompute () override;
|
||
|
|
|
||
|
|
/** \brief The actual surface reconstruction method.
|
||
|
|
* \param[out] output the output polygonal mesh
|
||
|
|
*/
|
||
|
|
void
|
||
|
|
performProcessing (pcl::PolygonMesh &output) override;
|
||
|
|
|
||
|
|
/** \brief Triangulate one polygon.
|
||
|
|
* \param[in] vertices the set of vertices
|
||
|
|
* \param[out] output the resultant polygonal mesh
|
||
|
|
*/
|
||
|
|
void
|
||
|
|
triangulate (const Vertices& vertices, PolygonMesh& output);
|
||
|
|
|
||
|
|
/** \brief Compute the signed area of a polygon.
|
||
|
|
* \param[in] vertices the vertices representing the polygon
|
||
|
|
*/
|
||
|
|
float
|
||
|
|
area (const Indices& vertices);
|
||
|
|
|
||
|
|
/** \brief Compute the signed area of a polygon.
|
||
|
|
* \param[in] vertices the vertices representing the polygon
|
||
|
|
*/
|
||
|
|
template <typename T = pcl::index_t, std::enable_if_t<!std::is_same<T, std::uint32_t>::value, pcl::index_t> = 0>
|
||
|
|
PCL_DEPRECATED(1, 14, "This method creates a useless copy of the vertices vector. Use area method which accepts Indices instead")
|
||
|
|
float
|
||
|
|
area (const std::vector<std::uint32_t>& vertices)
|
||
|
|
{
|
||
|
|
return area(Indices (vertices.cbegin(), vertices.cend()));
|
||
|
|
}
|
||
|
|
|
||
|
|
/** \brief Check if the triangle (u,v,w) is an ear.
|
||
|
|
* \param[in] u the first triangle vertex
|
||
|
|
* \param[in] v the second triangle vertex
|
||
|
|
* \param[in] w the third triangle vertex
|
||
|
|
* \param[in] vertices a set of input vertices
|
||
|
|
*/
|
||
|
|
bool
|
||
|
|
isEar (int u, int v, int w, const Indices& vertices);
|
||
|
|
|
||
|
|
/** \brief Check if the triangle (u,v,w) is an ear.
|
||
|
|
* \param[in] u the first triangle vertex
|
||
|
|
* \param[in] v the second triangle vertex
|
||
|
|
* \param[in] w the third triangle vertex
|
||
|
|
* \param[in] vertices a set of input vertices
|
||
|
|
*/
|
||
|
|
template <typename T = pcl::index_t, std::enable_if_t<!std::is_same<T, std::uint32_t>::value, pcl::index_t> = 0>
|
||
|
|
PCL_DEPRECATED(1, 14, "This method creates a useless copy of the vertices vector. Use isEar method which accepts Indices instead")
|
||
|
|
bool
|
||
|
|
isEar (int u, int v, int w, const std::vector<std::uint32_t>& vertices)
|
||
|
|
{
|
||
|
|
return isEar(u, v, w, Indices (vertices.cbegin(), vertices.cend()));
|
||
|
|
}
|
||
|
|
|
||
|
|
/** \brief Check if p is inside the triangle (u,v,w).
|
||
|
|
* \param[in] u the first triangle vertex
|
||
|
|
* \param[in] v the second triangle vertex
|
||
|
|
* \param[in] w the third triangle vertex
|
||
|
|
* \param[in] p the point to check
|
||
|
|
*/
|
||
|
|
bool
|
||
|
|
isInsideTriangle (const Eigen::Vector3f& u,
|
||
|
|
const Eigen::Vector3f& v,
|
||
|
|
const Eigen::Vector3f& w,
|
||
|
|
const Eigen::Vector3f& p);
|
||
|
|
|
||
|
|
/** \brief Compute the cross product between 2D vectors.
|
||
|
|
* \param[in] p1 the first 2D vector
|
||
|
|
* \param[in] p2 the first 2D vector
|
||
|
|
*/
|
||
|
|
float
|
||
|
|
crossProduct (const Eigen::Vector2f& p1, const Eigen::Vector2f& p2) const
|
||
|
|
{
|
||
|
|
return p1[0]*p2[1] - p1[1]*p2[0];
|
||
|
|
}
|
||
|
|
|
||
|
|
};
|
||
|
|
|
||
|
|
}
|