diff --git a/Installation/include/CGAL/config.h b/Installation/include/CGAL/config.h index 22fe30a1823..d492dafc046 100644 --- a/Installation/include/CGAL/config.h +++ b/Installation/include/CGAL/config.h @@ -597,4 +597,61 @@ inline std::string data_file_path(const std::string& filename) } // end namespace CGAL + +#if BOOST_VERSION < 107900 + +// Workaround for an accidental enable if of Eigen::Matrix in the +// boost::multiprecision::cpp_int constructor for some versions of +// boost + +namespace Eigen{ + template + class Matrix; + template + class Ref; + + template + class Product; + + template class CwiseBinaryOp; + +} + +namespace boost { + namespace multiprecision { + namespace detail { + template + struct is_byte_container; + + + template + struct is_byte_container< Eigen::Matrix> + { + static const bool value = false; + }; + + template + struct is_byte_container< Eigen::Ref> + { + static const bool value = false; + }; + + template + struct is_byte_container< Eigen::Product> + { + static const bool value = false; + }; + + template + struct is_byte_container< Eigen::CwiseBinaryOp> + { + static const bool value = false; + }; + + } + } +} + +#endif // BOOST_VERSION < 107900 + #endif // CGAL_CONFIG_H diff --git a/Principal_component_analysis/include/CGAL/PCA_util.h b/Principal_component_analysis/include/CGAL/PCA_util.h index 9e3508a68a6..d3f7215d801 100644 --- a/Principal_component_analysis/include/CGAL/PCA_util.h +++ b/Principal_component_analysis/include/CGAL/PCA_util.h @@ -391,7 +391,7 @@ assemble_covariance_matrix_3(InputIterator first, 0.0, radius, 0.0, 0.0, 0.0, radius}; Matrix transformation = init_matrix(3,delta); - FT volume = (FT)(4.0/3.0) * radius * t.squared_radius(); + FT volume = radius * t.squared_radius(); // skip zero measure primitives if(volume == (FT)0.0) @@ -400,8 +400,9 @@ assemble_covariance_matrix_3(InputIterator first, // Find the 2nd order moment for the sphere wrt to the origin by an affine transformation. // Transform the standard 2nd order moment using the transformation matrix - transformation = (3.0/4.0) * volume * transformation * moment * LA::transpose(transformation); + transformation = volume * transformation * moment * LA::transpose(transformation); + volume *= FT(4.0/3.0); // Translate the 2nd order moment to the center of the sphere. FT x0 = t.center().x(); FT y0 = t.center().y(); @@ -476,7 +477,7 @@ assemble_covariance_matrix_3(InputIterator first, 0.0, radius, 0.0, 0.0, 0.0, radius}; Matrix transformation = init_matrix(3,delta); - FT area = (FT)4.0 * t.squared_radius(); + FT area = t.squared_radius(); // skip zero measure primitives if(area == (FT)0.0) @@ -485,8 +486,9 @@ assemble_covariance_matrix_3(InputIterator first, // Find the 2nd order moment for the sphere wrt to the origin by an affine transformation. // Transform the standard 2nd order moment using the transformation matrix - transformation = (1.0/4.0) * area * transformation * moment * LA::transpose(transformation); + transformation = area * transformation * moment * LA::transpose(transformation); + area *= FT(4.0); // Translate the 2nd order moment to the center of the sphere. FT x0 = t.center().x(); FT y0 = t.center().y(); diff --git a/Principal_component_analysis/include/CGAL/PCA_util_Eigen.h b/Principal_component_analysis/include/CGAL/PCA_util_Eigen.h index e7fd18b8842..f4a8fc09f80 100644 --- a/Principal_component_analysis/include/CGAL/PCA_util_Eigen.h +++ b/Principal_component_analysis/include/CGAL/PCA_util_Eigen.h @@ -368,7 +368,7 @@ assemble_covariance_matrix_3(InputIterator first, transformation << radius, 0.0, 0.0, 0.0, radius, 0.0, 0.0, 0.0, radius; - FT volume = (FT)(4.0/3.0) * radius * t.squared_radius(); + FT volume = radius * t.squared_radius(); // skip zero measure primitives if(volume == (FT)0.0) @@ -377,8 +377,9 @@ assemble_covariance_matrix_3(InputIterator first, // Find the 2nd order moment for the sphere wrt to the origin by an affine transformation. // Transform the standard 2nd order moment using the transformation matrix - transformation = (3.0/4.0) * volume * transformation * moment * transformation.transpose(); + transformation = volume * transformation * moment * transformation.transpose(); + volume *= FT(4.0 / 3.0); // Translate the 2nd order moment to the center of the sphere. FT x0 = t.center().x(); FT y0 = t.center().y(); @@ -453,7 +454,7 @@ assemble_covariance_matrix_3(InputIterator first, transformation << radius, 0.0, 0.0, 0.0, radius, 0.0, 0.0, 0.0, radius; - FT area = (FT)4.0 * t.squared_radius(); + FT area = t.squared_radius(); // skip zero measure primitives if(area == (FT)0.0) @@ -462,8 +463,9 @@ assemble_covariance_matrix_3(InputIterator first, // Find the 2nd order moment for the sphere wrt to the origin by an affine transformation. // Transform the standard 2nd order moment using the transformation matrix - transformation = (1.0/4.0) * area * transformation * moment * transformation.transpose(); + transformation = area * transformation * moment * transformation.transpose(); + area *= FT(4.0); // Translate the 2nd order moment to the center of the sphere. FT x0 = t.center().x(); FT y0 = t.center().y();