| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213 |
- #ifndef IGL_FAST_WINDING_NUMBER
- #define IGL_FAST_WINDING_NUMBER
- #include "igl_inline.h"
- #include "FastWindingNumberForSoups.h"
- #include <Eigen/Core>
- #include <vector>
- namespace igl
- {
- /// Generate the precomputation for the fast winding number for point data
- /// [Barill et. al 2018].
- ///
- /// Given a set of 3D points P, with normals N, areas A, along with octree
- /// data, and an expansion order, we define a taylor series expansion at each
- /// octree cell.
- ///
- /// The octree data is designed to come from igl::octree, and the areas (if not
- /// obtained at scan time), may be calculated using
- /// igl::copyleft::cgal::point_areas.
- ///
- /// @param[in] P #P by 3 list of point locations
- /// @param[in] N #P by 3 list of point normals
- /// @param[in] A #P by 1 list of point areas
- /// @param[in] point_indices a vector of vectors, where the ith entry is a vector of
- /// the indices into P that are the ith octree cell's points
- /// @param[in] CH #OctreeCells by 8, where the ith row is the indices of
- /// the ith octree cell's children
- /// @param[in] expansion_order the order of the taylor expansion. We support 0,1,2.
- /// @param[out] CM #OctreeCells by 3 list of each cell's center of mass
- /// @param[out] R #OctreeCells by 1 list of each cell's maximum distance of any point
- /// to the center of mass
- /// @param[out] EC #OctreeCells by #TaylorCoefficients list of expansion coefficients.
- /// (Note that #TaylorCoefficients = ∑_{i=1}^{expansion_order} 3^i)
- ///
- /// \see copyleft::cgal::point_areas, knn
- template <
- typename DerivedP,
- typename DerivedA,
- typename DerivedN,
- typename Index,
- typename DerivedCH,
- typename DerivedCM,
- typename DerivedR,
- typename DerivedEC>
- IGL_INLINE void fast_winding_number(
- const Eigen::MatrixBase<DerivedP>& P,
- const Eigen::MatrixBase<DerivedN>& N,
- const Eigen::MatrixBase<DerivedA>& A,
- const std::vector<std::vector<Index> > & point_indices,
- const Eigen::MatrixBase<DerivedCH>& CH,
- const int expansion_order,
- Eigen::PlainObjectBase<DerivedCM>& CM,
- Eigen::PlainObjectBase<DerivedR>& R,
- Eigen::PlainObjectBase<DerivedEC>& EC);
- /// Evaluate the fast winding number for point data, having already done the
- /// the precomputation
- ///
- /// @param[in] P #P by 3 list of point locations
- /// @param[in] N #P by 3 list of point normals
- /// @param[in] A #P by 1 list of point areas
- /// @param[in] point_indices a vector of vectors, where the ith entry is a vector of
- /// the indices into P that are the ith octree cell's points
- /// @param[in] CH #OctreeCells by 8, where the ith row is the indices of
- /// the ith octree cell's children
- /// @param[in] CM #OctreeCells by 3 list of each cell's center of mass
- /// @param[in] R #OctreeCells by 1 list of each cell's maximum distance of any point
- /// to the center of mass
- /// @param[in] EC #OctreeCells by #TaylorCoefficients list of expansion coefficients.
- /// (Note that #TaylorCoefficients = ∑_{i=1}^{expansion_order} 3^i)
- /// @param[in] Q #Q by 3 list of query points for the winding number
- /// @param[in] beta This is a Barnes-Hut style accuracy term that separates near feild
- /// from far field. The higher the beta, the more accurate and slower
- /// the evaluation. We reccommend using a beta value of 2. Note that
- /// for a beta value ≤ 0, we use the direct evaluation, rather than
- /// the fast approximation
- /// @param[out] WN #Q by 1 list of windinng number values at each query point
- template <
- typename DerivedP,
- typename DerivedA,
- typename DerivedN,
- typename Index,
- typename DerivedCH,
- typename DerivedCM,
- typename DerivedR,
- typename DerivedEC,
- typename DerivedQ,
- typename BetaType,
- typename DerivedWN>
- IGL_INLINE void fast_winding_number(
- const Eigen::MatrixBase<DerivedP>& P,
- const Eigen::MatrixBase<DerivedN>& N,
- const Eigen::MatrixBase<DerivedA>& A,
- const std::vector<std::vector<Index> > & point_indices,
- const Eigen::MatrixBase<DerivedCH>& CH,
- const Eigen::MatrixBase<DerivedCM>& CM,
- const Eigen::MatrixBase<DerivedR>& R,
- const Eigen::MatrixBase<DerivedEC>& EC,
- const Eigen::MatrixBase<DerivedQ>& Q,
- const BetaType beta,
- Eigen::PlainObjectBase<DerivedWN>& WN);
- /// \overload
- ///
- /// \brief Evaluate the fast winding number for point data without caching the
- /// precomputation.
- template <
- typename DerivedP,
- typename DerivedA,
- typename DerivedN,
- typename DerivedQ,
- typename BetaType,
- typename DerivedWN>
- IGL_INLINE void fast_winding_number(
- const Eigen::MatrixBase<DerivedP>& P,
- const Eigen::MatrixBase<DerivedN>& N,
- const Eigen::MatrixBase<DerivedA>& A,
- const Eigen::MatrixBase<DerivedQ>& Q,
- const int expansion_order,
- const BetaType beta,
- Eigen::PlainObjectBase<DerivedWN>& WN);
- /// \overload
- template <
- typename DerivedP,
- typename DerivedA,
- typename DerivedN,
- typename DerivedQ,
- typename DerivedWN>
- IGL_INLINE void fast_winding_number(
- const Eigen::MatrixBase<DerivedP>& P,
- const Eigen::MatrixBase<DerivedN>& N,
- const Eigen::MatrixBase<DerivedA>& A,
- const Eigen::MatrixBase<DerivedQ>& Q,
- Eigen::PlainObjectBase<DerivedWN>& WN);
- /// @private
- namespace FastWindingNumber {
- /// @private
- namespace HDK_Sample{
- /// @private
- template <typename T1, typename T2> class UT_SolidAngle;} }
- /// Structure for caching precomputation for fast winding number for triangle
- /// soups
- struct FastWindingNumberBVH {
- /// @private
- FastWindingNumber::HDK_Sample::UT_SolidAngle<float,float> ut_solid_angle;
- // Need copies of these so they stay alive between calls.
- /// @private
- std::vector<FastWindingNumber::HDK_Sample::UT_Vector3T<float> > U;
- std::vector<int> F;
- };
- /// Compute approximate winding number of a triangle soup mesh according to
- /// "Fast Winding Numbers for Soups and Clouds" [Barill et al. 2018].
- ///
- /// @param[in] V #V by 3 list of mesh vertex positions
- /// @param[in] F #F by 3 list of triangle mesh indices into rows of V
- /// @param[in] Q #Q by 3 list of query positions
- /// @param[out] W #Q list of winding number values
- template <
- typename DerivedV,
- typename DerivedF,
- typename DerivedQ,
- typename DerivedW>
- IGL_INLINE void fast_winding_number(
- const Eigen::MatrixBase<DerivedV> & V,
- const Eigen::MatrixBase<DerivedF> & F,
- const Eigen::MatrixBase<DerivedQ> & Q,
- Eigen::PlainObjectBase<DerivedW> & W);
- /// Precomputation for computing approximate winding numbers of a triangle
- /// soup.
- ///
- /// @param[in] V #V by 3 list of mesh vertex positions
- /// @param[in] F #F by 3 list of triangle mesh indices into rows of V
- /// @param[in] order Taylor series expansion order to use (e.g., 2)
- /// @param[out] fwn_bvh Precomputed bounding volume hierarchy
- ///
- template <
- typename DerivedV,
- typename DerivedF>
- IGL_INLINE void fast_winding_number(
- const Eigen::MatrixBase<DerivedV> & V,
- const Eigen::MatrixBase<DerivedF> & F,
- const int order,
- FastWindingNumberBVH & fwn_bvh);
- /// After precomputation, compute winding number at a each of many points in a
- /// list.
- ///
- /// @param[in] fwn_bvh Precomputed bounding volume hierarchy
- /// @param[in] accuracy_scale parameter controlling accuracy (e.g., 2)
- /// @param[in] Q #Q by 3 list of query positions
- /// @param[out] W #Q list of winding number values
- template <
- typename DerivedQ,
- typename DerivedW>
- IGL_INLINE void fast_winding_number(
- const FastWindingNumberBVH & fwn_bvh,
- const float accuracy_scale,
- const Eigen::MatrixBase<DerivedQ> & Q,
- Eigen::PlainObjectBase<DerivedW> & W);
- /// After precomputation, compute winding number at a single point
- ///
- /// @param[in] fwn_bvh Precomputed bounding volume hierarchy
- /// @param[in] accuracy_scale parameter controlling accuracy (e.g., 2)
- /// @param[in] p single position
- /// @return w winding number of this point
- template <typename Derivedp>
- IGL_INLINE typename Derivedp::Scalar fast_winding_number(
- const FastWindingNumberBVH & fwn_bvh,
- const float accuracy_scale,
- const Eigen::MatrixBase<Derivedp> & p);
- }
- #ifndef IGL_STATIC_LIBRARY
- # include "fast_winding_number.cpp"
- #endif
- #endif
|