|
@@ -16,6 +16,8 @@
|
|
|
#include <iostream>
|
|
|
#include <fstream>
|
|
|
|
|
|
+#include <stdexcept>
|
|
|
+
|
|
|
#include <Eigen/Geometry>
|
|
|
#include <Eigen/Sparse>
|
|
|
#include <queue>
|
|
@@ -803,8 +805,16 @@ Eigen::VectorXd igl::copyleft::comiso::NRosyField::angleDefect()
|
|
|
{
|
|
|
Eigen::VectorXd a = V.row(F(i,(j+1)%3)) - V.row(F(i,j));
|
|
|
Eigen::VectorXd b = V.row(F(i,(j+2)%3)) - V.row(F(i,j));
|
|
|
- double t = a.transpose()*b;
|
|
|
- t /= (a.norm() * b.norm());
|
|
|
+ double t = a.transpose() * b;
|
|
|
+ double norm_prod = a.norm() * b.norm();
|
|
|
+ if (norm_prod > 0.)
|
|
|
+ t /= norm_prod;
|
|
|
+ else
|
|
|
+ throw std::runtime_error("Error in 'igl::copyleft::comiso::NRosyField::angleDefect': division by zero!");
|
|
|
+ if (t > 1.)
|
|
|
+ t = 1.;
|
|
|
+ else if (t < -1.)
|
|
|
+ t = -1.;
|
|
|
A(F(i,j)) += acos(t);
|
|
|
}
|
|
|
}
|