piecewise_constant_winding_number.cpp 3.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182
  1. // This file is part of libigl, a simple c++ geometry processing library.
  2. //
  3. // Copyright (C) 2015 Alec Jacobson
  4. //
  5. // This Source Code Form is subject to the terms of the Mozilla Public License
  6. // v. 2.0. If a copy of the MPL was not distributed with this file, You can
  7. // obtain one at http://mozilla.org/MPL/2.0/.
  8. #include "piecewise_constant_winding_number.h"
  9. #include "unique_edge_map.h"
  10. #include "PI.h"
  11. template <
  12. typename DerivedF,
  13. typename DeriveduE,
  14. typename DeriveduEC,
  15. typename DeriveduEE>
  16. IGL_INLINE bool igl::piecewise_constant_winding_number(
  17. const Eigen::MatrixBase<DerivedF>& F,
  18. const Eigen::MatrixBase<DeriveduE>& uE,
  19. const Eigen::MatrixBase<DeriveduEC>& uEC,
  20. const Eigen::MatrixBase<DeriveduEE>& uEE)
  21. {
  22. const size_t num_faces = F.rows();
  23. const size_t num_edges = uE.rows();
  24. const auto e2f = [&](size_t ei) { return ei % num_faces; };
  25. const auto is_consistent = [&](size_t fid, size_t s, size_t d)
  26. {
  27. if ((size_t)F(fid, 0) == s && (size_t)F(fid, 1) == d) return true;
  28. if ((size_t)F(fid, 1) == s && (size_t)F(fid, 2) == d) return true;
  29. if ((size_t)F(fid, 2) == s && (size_t)F(fid, 0) == d) return true;
  30. if ((size_t)F(fid, 0) == d && (size_t)F(fid, 1) == s) return false;
  31. if ((size_t)F(fid, 1) == d && (size_t)F(fid, 2) == s) return false;
  32. if ((size_t)F(fid, 2) == d && (size_t)F(fid, 0) == s) return false;
  33. throw "Invalid face!!";
  34. };
  35. for (size_t i=0; i<num_edges; i++)
  36. {
  37. const size_t s = uE(i,0);
  38. const size_t d = uE(i,1);
  39. int count=0;
  40. //for (const auto& ei : uE2E[i])
  41. for(size_t j = uEC(i);j<uEC(i+1);j++)
  42. {
  43. const size_t ei = uEE(j);
  44. const size_t fid = e2f(ei);
  45. if (is_consistent(fid, s, d))
  46. {
  47. count++;
  48. }
  49. else
  50. {
  51. count--;
  52. }
  53. }
  54. if (count != 0)
  55. {
  56. return false;
  57. }
  58. }
  59. return true;
  60. }
  61. template <typename DerivedF>
  62. IGL_INLINE bool igl::piecewise_constant_winding_number(
  63. const Eigen::MatrixBase<DerivedF>& F)
  64. {
  65. Eigen::Matrix<typename DerivedF::Scalar,Eigen::Dynamic,2> E, uE;
  66. Eigen::Matrix<typename DerivedF::Scalar,Eigen::Dynamic,1> EMAP, uEC, uEE;
  67. unique_edge_map(F, E, uE, EMAP, uEC, uEE);
  68. return piecewise_constant_winding_number(F,uE,uEC,uEE);
  69. }
  70. #ifdef IGL_STATIC_LIBRARY
  71. // Explicit template instantiation
  72. // generated by autoexplicit.sh
  73. template bool igl::piecewise_constant_winding_number<Eigen::Matrix<int, -1, 3, 0, -1, 3> >(Eigen::MatrixBase<Eigen::Matrix<int, -1, 3, 0, -1, 3> > const&);
  74. // generated by autoexplicit.sh
  75. template bool igl::piecewise_constant_winding_number<Eigen::Matrix<int, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, 1, 0, -1, 1>, Eigen::Matrix<int, -1, 1, 0, -1, 1> >(Eigen::MatrixBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> > const&, Eigen::MatrixBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> > const&, Eigen::MatrixBase<Eigen::Matrix<int, -1, 1, 0, -1, 1> > const&, Eigen::MatrixBase<Eigen::Matrix<int, -1, 1, 0, -1, 1> > const&);
  76. #ifdef WIN32
  77. #endif
  78. #endif