turning_number.cpp 1.1 KB

123456789101112131415161718192021222324252627282930313233343536
  1. #include "turning_number.h"
  2. #include "PI.h"
  3. template <typename DerivedV>
  4. IGL_INLINE typename DerivedV::Scalar igl::turning_number(
  5. const Eigen::MatrixBase<DerivedV> & V)
  6. {
  7. typedef typename DerivedV::Scalar Scalar;
  8. constexpr Scalar TWO_PI = 2.0 * igl::PI;
  9. const int n = V.rows();
  10. Scalar total_angle = 0.0;
  11. for (int i = 0; i < n; i++)
  12. {
  13. Eigen::Matrix<Scalar, 1, 2> current = V.row(i).head(2);
  14. Eigen::Matrix<Scalar, 1, 2> next = V.row((i + 1) % n).head(2);
  15. Eigen::Matrix<Scalar, 1, 2> d1 = next - current;
  16. Eigen::Matrix<Scalar, 1, 2> d2 = V.row((i + 2) % n).head(2) - next;
  17. const Scalar angle = atan2(
  18. d1(0)*d2(1) - d1(1)*d2(0),
  19. d1(0)*d2(0) + d1(1)*d2(1));
  20. total_angle += angle;
  21. }
  22. return total_angle / TWO_PI;
  23. }
  24. #ifdef IGL_STATIC_LIBRARY
  25. // Explicit template specialization
  26. template double igl::turning_number<Eigen::Matrix<double, -1, 2, 0, -1, 2> >(Eigen::MatrixBase<Eigen::Matrix<double, -1, 2, 0, -1, 2> > const&);
  27. template double igl::turning_number<Eigen::Matrix<double, -1, -1, 0, -1, -1> >(Eigen::MatrixBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> > const&);
  28. #endif