|
@@ -7,6 +7,7 @@
|
|
|
// obtain one at http://mozilla.org/MPL/2.0/.
|
|
|
#include "is_intrinsic_delaunay.h"
|
|
|
#include "unique_edge_map.h"
|
|
|
+#include "tan_half_angle.h"
|
|
|
#include <cassert>
|
|
|
template <
|
|
|
typename Derivedl,
|
|
@@ -53,34 +54,13 @@ IGL_INLINE bool igl::is_intrinsic_delaunay(
|
|
|
typedef typename Derivedl::Scalar Scalar;
|
|
|
typedef typename DerivedF::Scalar Index;
|
|
|
|
|
|
- // .
|
|
|
- // /|
|
|
|
- // c/ |
|
|
|
- // / |
|
|
|
- // / |
|
|
|
- // .α | a
|
|
|
- // \ |
|
|
|
- // \ |
|
|
|
- // b\ |
|
|
|
- // \|
|
|
|
- //
|
|
|
- // tan(α/2)
|
|
|
- const auto tan_alpha_over_2 = [](
|
|
|
+ const auto cot_alpha = [](
|
|
|
const Scalar & a,
|
|
|
const Scalar & b,
|
|
|
const Scalar & c)->Scalar
|
|
|
{
|
|
|
// Fisher 2007
|
|
|
- return sqrt(((a-b+c)*(a+b-c))/((a+b+c)*(-a+b+c)));
|
|
|
- };
|
|
|
-
|
|
|
- const auto cot_alpha = [&tan_alpha_over_2](
|
|
|
- const Scalar & a,
|
|
|
- const Scalar & b,
|
|
|
- const Scalar & c)->Scalar
|
|
|
- {
|
|
|
- // Fisher 2007
|
|
|
- const Scalar t = tan_alpha_over_2(a,b,c);
|
|
|
+ const Scalar t = tan_half_angle(a,b,c);
|
|
|
return (1.0-t*t)/(2*t);
|
|
|
};
|
|
|
|
|
@@ -98,19 +78,18 @@ IGL_INLINE bool igl::is_intrinsic_delaunay(
|
|
|
|
|
|
const Index num_faces = F.rows();
|
|
|
assert(uE2E[uei].size() == 2 && "edge should have 2 incident faces");
|
|
|
- const Index he_left = uE2E[uei][0];
|
|
|
- const Index he_right = uE2E[uei][1];
|
|
|
- const Index f_left = he_left%num_faces;
|
|
|
- const Index c_left = he_left/num_faces;
|
|
|
- const Index f_right = he_right%num_faces;
|
|
|
- const Index c_right = he_right/num_faces;
|
|
|
-
|
|
|
- assert( std::abs(l(f_left,c_left)-l(f_right,c_right) < igl::EPS<Scalar>()) );
|
|
|
- const Scalar e = l(f_left,c_left);
|
|
|
- const Scalar a = l(f_left,(c_left+1)%3);
|
|
|
- const Scalar b = l(f_left,(c_left+2)%3);
|
|
|
- const Scalar c = l(f_right,(c_right+1)%3);
|
|
|
- const Scalar d = l(f_right,(c_right+2)%3);
|
|
|
+ const Index he1 = uE2E[uei][0];
|
|
|
+ const Index he2 = uE2E[uei][1];
|
|
|
+ const Index f1 = he1%num_faces;
|
|
|
+ const Index c1 = he1/num_faces;
|
|
|
+ const Index f2 = he2%num_faces;
|
|
|
+ const Index c2 = he2/num_faces;
|
|
|
+ assert( std::abs(l(f1,c1)-l(f2,c2) < igl::EPS<Scalar>()) );
|
|
|
+ const Scalar e = l(f1,c1);
|
|
|
+ const Scalar a = l(f1,(c1+1)%3);
|
|
|
+ const Scalar b = l(f1,(c1+2)%3);
|
|
|
+ const Scalar c = l(f2,(c2+1)%3);
|
|
|
+ const Scalar d = l(f2,(c2+2)%3);
|
|
|
|
|
|
const Scalar w = cot_alpha(e,a,b) + cot_alpha(e,c,d);
|
|
|
return w >= 0;
|
|
@@ -119,5 +98,6 @@ IGL_INLINE bool igl::is_intrinsic_delaunay(
|
|
|
#ifdef IGL_STATIC_LIBRARY
|
|
|
// Explicit template instantiation
|
|
|
// generated by autoexplicit.sh
|
|
|
+template bool igl::is_intrinsic_delaunay<Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, -1, 0, -1, -1>, int, unsigned long>(Eigen::MatrixBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> > const&, Eigen::MatrixBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> > const&, std::vector<std::vector<int, std::allocator<int> >, std::allocator<std::vector<int, std::allocator<int> > > > const&, unsigned long);
|
|
|
template void igl::is_intrinsic_delaunay<Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, -1, 0, -1, -1>, Eigen::Matrix<bool, -1, -1, 0, -1, -1> >(Eigen::MatrixBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> > const&, Eigen::MatrixBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<bool, -1, -1, 0, -1, -1> >&);
|
|
|
#endif
|