#include "turning_number.h" #include "PI.h" template IGL_INLINE typename DerivedV::Scalar igl::turning_number( const Eigen::MatrixBase & V) { typedef typename DerivedV::Scalar Scalar; constexpr Scalar TWO_PI = 2.0 * igl::PI; const int n = V.rows(); Scalar total_angle = 0.0; for (int i = 0; i < n; i++) { Eigen::Matrix current = V.row(i).head(2); Eigen::Matrix next = V.row((i + 1) % n).head(2); Eigen::Matrix d1 = next - current; Eigen::Matrix d2 = V.row((i + 2) % n).head(2) - next; const Scalar angle = atan2( d1(0)*d2(1) - d1(1)*d2(0), d1(0)*d2(0) + d1(1)*d2(1)); total_angle += angle; } return total_angle / TWO_PI; } #ifdef IGL_STATIC_LIBRARY // Explicit template specialization template double igl::turning_number >(Eigen::MatrixBase > const&); template double igl::turning_number >(Eigen::MatrixBase > const&); #endif