From b3968d2b0d08494c4802f668a4f628e959692d9a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mael=20Rouxel-Labb=C3=A9?= Date: Fri, 27 Mar 2020 18:19:39 +0100 Subject: [PATCH] Speed up fitness function computations --- .../Concepts/OrientedBoundingBoxTraits.h | 4 ++++ .../Oriented_bounding_box_traits_3.h | 4 ++++ .../internal/fitness_function.h | 23 ++++++++++--------- 3 files changed, 20 insertions(+), 11 deletions(-) diff --git a/Optimal_bounding_box/doc/Optimal_bounding_box/Concepts/OrientedBoundingBoxTraits.h b/Optimal_bounding_box/doc/Optimal_bounding_box/Concepts/OrientedBoundingBoxTraits.h index f31d11252ec..74cbbcaca6a 100644 --- a/Optimal_bounding_box/doc/Optimal_bounding_box/Concepts/OrientedBoundingBoxTraits.h +++ b/Optimal_bounding_box/doc/Optimal_bounding_box/Concepts/OrientedBoundingBoxTraits.h @@ -25,6 +25,10 @@ public: /// matrix-matrix and scalar-matrix multiplication, as well as matrix-matrix addition typedef unspecified_type Matrix; + /// A 3 dimensional vector type; model of the concept `SvdTraits::Vector` and which supports + /// matrix-vector and multiplication + typedef unspecified_type Vector; + /// Returns the unitary matrix `Q` obtained in the QR-decomposition of the matrix `m` Matrix get_Q(const Matrix& m) const; }; diff --git a/Optimal_bounding_box/include/CGAL/Optimal_bounding_box/Oriented_bounding_box_traits_3.h b/Optimal_bounding_box/include/CGAL/Optimal_bounding_box/Oriented_bounding_box_traits_3.h index d31bdd2a333..01cd1df588c 100644 --- a/Optimal_bounding_box/include/CGAL/Optimal_bounding_box/Oriented_bounding_box_traits_3.h +++ b/Optimal_bounding_box/include/CGAL/Optimal_bounding_box/Oriented_bounding_box_traits_3.h @@ -19,6 +19,7 @@ #ifdef CGAL_EIGEN3_ENABLED #include +#include #include #endif @@ -51,6 +52,9 @@ public: /// The matrix type typedef CGAL::Eigen_matrix Matrix; + /// The matrix type + typedef CGAL::Eigen_vector Vector; + private: typedef typename Matrix::EigenType EigenType; diff --git a/Optimal_bounding_box/include/CGAL/Optimal_bounding_box/internal/fitness_function.h b/Optimal_bounding_box/include/CGAL/Optimal_bounding_box/internal/fitness_function.h index b19ca993630..26d514a682e 100644 --- a/Optimal_bounding_box/include/CGAL/Optimal_bounding_box/internal/fitness_function.h +++ b/Optimal_bounding_box/include/CGAL/Optimal_bounding_box/internal/fitness_function.h @@ -33,6 +33,7 @@ compute_fitness(const typename Traits::Matrix& R, // rotation matrix { typedef typename Traits::FT FT; typedef typename Traits::Point_3 Point; + typedef typename Traits::Vector Vector; CGAL_assertion(R.number_of_rows() == 3 && R.number_of_columns() == 3); CGAL_assertion(points.size() >= 3); @@ -43,18 +44,18 @@ compute_fitness(const typename Traits::Matrix& R, // rotation matrix for(const Point& pt : points) { - const FT x = pt.x(), y = pt.y(), z = pt.z(); + Vector pv(3); + pv.set(0, pt.x()); + pv.set(1, pt.y()); + pv.set(2, pt.z()); + pv = R * pv; - const FT rx = x*R(0, 0) + y*R(0, 1) + z*R(0, 2); - const FT ry = x*R(1, 0) + y*R(1, 1) + z*R(1, 2); - const FT rz = x*R(2, 0) + y*R(2, 1) + z*R(2, 2); - - xmin = (std::min)(xmin, rx); - ymin = (std::min)(ymin, ry); - zmin = (std::min)(zmin, rz); - xmax = (std::max)(xmax, rx); - ymax = (std::max)(ymax, ry); - zmax = (std::max)(zmax, rz); + xmin = (std::min)(xmin, pv(0)); + ymin = (std::min)(ymin, pv(1)); + zmin = (std::min)(zmin, pv(2)); + xmax = (std::max)(xmax, pv(0)); + ymax = (std::max)(ymax, pv(1)); + zmax = (std::max)(zmax, pv(2)); } // volume