Prechádzať zdrojové kódy

Merge pull request #972 from copyme/SafeACos-Nrosy

avoid unsafe calls to acos by fixing potential floating-point errors …
Jérémie Dumas 6 rokov pred
rodič
commit
f838c51c03
1 zmenil súbory, kde vykonal 12 pridanie a 2 odobranie
  1. 12 2
      include/igl/copyleft/comiso/nrosy.cpp

+ 12 - 2
include/igl/copyleft/comiso/nrosy.cpp

@@ -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);
     }
   }