better incapsulation, naming, and added access to internal property maps

This commit is contained in:
Dmitry Anisimov 2021-03-19 12:13:39 +01:00
parent 05a8105ff8
commit 4a9b7c7c9a
10 changed files with 190 additions and 205 deletions

View File

@ -66,14 +66,14 @@ namespace Point_set {
class K_neighbor_query {
public:
/// \cond SKIP_IN_MANUAL
using Traits = GeomTraits;
using Input_range = InputRange;
using Point_map = PointMap;
using Point = typename Point_map::value_type;
/// \endcond
private:
using Index_to_point_map =
internal::Item_property_map<Input_range, Point_map>;
@ -106,8 +106,8 @@ namespace Point_set {
using Tree =
typename Neighbor_search::Tree;
/// \endcond
public:
/// \name Initialization
/// @{
@ -188,16 +188,19 @@ namespace Point_set {
/// @}
/// \cond SKIP_IN_MANUAL
// A property map that can be used to access points when
// iterating over the indices counting items in the input range.
const Index_to_point_map& index_to_point_map() const {
return m_index_to_point_map;
}
/// \endcond
private:
// Fields.
const Input_range& m_input_range;
const std::size_t m_number_of_neighbors;
const Point_map m_point_map;
const Index_to_point_map m_index_to_point_map;
Distance m_distance;
Tree m_tree;
};

View File

@ -69,7 +69,6 @@ namespace Point_set {
class Least_squares_line_fit_region {
public:
/// \name Types
/// @{
@ -83,16 +82,18 @@ namespace Point_set {
/// Number type.
typedef typename GeomTraits::FT FT;
/// \cond SKIP_IN_MANUAL
/// @}
private:
using Point_2 = typename Traits::Point_2;
using Vector_2 = typename Traits::Vector_2;
using Line_2 = typename Traits::Line_2;
using Local_traits = Exact_predicates_inexact_constructions_kernel;
using Local_FT = typename Local_traits::FT;
using Local_point_2 = typename Local_traits::Point_2;
using Local_line_2 = typename Local_traits::Line_2;
using To_local_converter = Cartesian_converter<Traits, Local_traits>;
using ITraits = Exact_predicates_inexact_constructions_kernel;
using IFT = typename ITraits::FT;
using IPoint_2 = typename ITraits::Point_2;
using ILine_2 = typename ITraits::Line_2;
using IConverter = Cartesian_converter<Traits, ITraits>;
using Squared_length_2 = typename Traits::Compute_squared_length_2;
using Squared_distance_2 = typename Traits::Compute_squared_distance_2;
@ -100,10 +101,8 @@ namespace Point_set {
using Get_sqrt = internal::Get_sqrt<Traits>;
using Sqrt = typename Get_sqrt::Sqrt;
/// \endcond
/// @}
public:
/// \name Initialization
/// @{
@ -161,7 +160,7 @@ namespace Point_set {
m_squared_distance_2(traits.compute_squared_distance_2_object()),
m_scalar_product_2(traits.compute_scalar_product_2_object()),
m_sqrt(Get_sqrt::sqrt_object(traits)),
m_to_local_converter() {
m_iconverter() {
CGAL_precondition(input_range.size() > 0);
@ -264,19 +263,19 @@ namespace Point_set {
} else { // update reference line and normal
std::vector<Local_point_2> points;
std::vector<IPoint_2> points;
points.reserve(region.size());
for (std::size_t i = 0; i < region.size(); ++i) {
CGAL_precondition(region[i] < m_input_range.size());
const auto& key = *(m_input_range.begin() + region[i]);
points.push_back(m_to_local_converter(get(m_point_map, key)));
points.push_back(m_iconverter(get(m_point_map, key)));
}
CGAL_postcondition(points.size() == region.size());
Local_line_2 fitted_line;
Local_point_2 fitted_centroid;
ILine_2 fitted_line;
IPoint_2 fitted_centroid;
// The best fit line will be a line fitted to all region points with
// its normal being perpendicular to the line.
@ -284,8 +283,8 @@ namespace Point_set {
points.begin(), points.end(),
fitted_line, fitted_centroid,
CGAL::Dimension_tag<0>(),
Local_traits(),
CGAL::Eigen_diagonalize_traits<Local_FT, 2>());
ITraits(),
CGAL::Eigen_diagonalize_traits<IFT, 2>());
m_line_of_best_fit =
Line_2(
@ -305,8 +304,6 @@ namespace Point_set {
/// @}
private:
// Fields.
const Input_range& m_input_range;
const FT m_distance_threshold;
@ -321,7 +318,7 @@ namespace Point_set {
const Scalar_product_2 m_scalar_product_2;
const Sqrt m_sqrt;
const To_local_converter m_to_local_converter;
const IConverter m_iconverter;
Line_2 m_line_of_best_fit;
Vector_2 m_normal_of_best_fit;

View File

@ -64,7 +64,6 @@ namespace Point_set {
class Least_squares_line_fit_sorting {
public:
/// \name Types
/// @{
@ -86,6 +85,15 @@ namespace Point_set {
/// @}
private:
using ITraits = Exact_predicates_inexact_constructions_kernel;
using IFT = typename ITraits::FT;
using IPoint_2 = typename ITraits::Point_2;
using ILine_2 = typename ITraits::Line_2;
using IConverter = Cartesian_converter<Traits, ITraits>;
using Compare_scores = internal::Compare_scores<IFT>;
public:
/// \name Initialization
/// @{
@ -112,7 +120,7 @@ namespace Point_set {
m_input_range(input_range),
m_neighbor_query(neighbor_query),
m_point_map(point_map),
m_to_local_converter() {
m_iconverter() {
CGAL_precondition(input_range.size() > 0);
@ -155,20 +163,17 @@ namespace Point_set {
/// @}
private:
const Input_range& m_input_range;
Neighbor_query& m_neighbor_query;
const Point_map m_point_map;
std::vector<std::size_t> m_order;
std::vector<IFT> m_scores;
const IConverter m_iconverter;
// Types.
using Local_traits = Exact_predicates_inexact_constructions_kernel;
using Local_FT = typename Local_traits::FT;
using Local_point_2 = typename Local_traits::Point_2;
using Local_line_2 = typename Local_traits::Line_2;
using To_local_converter = Cartesian_converter<Traits, Local_traits>;
using Compare_scores = internal::Compare_scores<Local_FT>;
// Functions.
void compute_scores() {
std::vector<std::size_t> neighbors;
std::vector<Local_point_2> points;
std::vector<IPoint_2> points;
for (std::size_t i = 0; i < m_input_range.size(); ++i) {
@ -181,31 +186,21 @@ namespace Point_set {
CGAL_precondition(neighbors[j] < m_input_range.size());
const auto& key = *(m_input_range.begin() + neighbors[j]);
points.push_back(m_to_local_converter(get(m_point_map, key)));
points.push_back(m_iconverter(get(m_point_map, key)));
}
CGAL_postcondition(points.size() == neighbors.size());
Local_line_2 fitted_line;
Local_point_2 fitted_centroid;
ILine_2 fitted_line;
IPoint_2 fitted_centroid;
m_scores[i] = CGAL::linear_least_squares_fitting_2(
points.begin(), points.end(),
fitted_line, fitted_centroid,
CGAL::Dimension_tag<0>(),
Local_traits(),
CGAL::Eigen_diagonalize_traits<Local_FT, 2>());
ITraits(),
CGAL::Eigen_diagonalize_traits<IFT, 2>());
}
}
// Fields.
const Input_range& m_input_range;
Neighbor_query& m_neighbor_query;
const Point_map m_point_map;
std::vector<std::size_t> m_order;
std::vector<Local_FT> m_scores;
const To_local_converter m_to_local_converter;
};
} // namespace Point_set

View File

@ -69,7 +69,6 @@ namespace Point_set {
class Least_squares_plane_fit_region {
public:
/// \name Types
/// @{
@ -83,16 +82,18 @@ namespace Point_set {
/// Number type.
typedef typename GeomTraits::FT FT;
/// \cond SKIP_IN_MANUAL
/// @}
private:
using Point_3 = typename Traits::Point_3;
using Vector_3 = typename Traits::Vector_3;
using Plane_3 = typename Traits::Plane_3;
using Local_traits = Exact_predicates_inexact_constructions_kernel;
using Local_FT = typename Local_traits::FT;
using Local_point_3 = typename Local_traits::Point_3;
using Local_plane_3 = typename Local_traits::Plane_3;
using To_local_converter = Cartesian_converter<Traits, Local_traits>;
using ITraits = Exact_predicates_inexact_constructions_kernel;
using IFT = typename ITraits::FT;
using IPoint_3 = typename ITraits::Point_3;
using IPlane_3 = typename ITraits::Plane_3;
using IConverter = Cartesian_converter<Traits, ITraits>;
using Squared_length_3 = typename Traits::Compute_squared_length_3;
using Squared_distance_3 = typename Traits::Compute_squared_distance_3;
@ -100,10 +101,8 @@ namespace Point_set {
using Get_sqrt = internal::Get_sqrt<Traits>;
using Sqrt = typename Get_sqrt::Sqrt;
/// \endcond
/// @}
public:
/// \name Initialization
/// @{
@ -161,7 +160,7 @@ namespace Point_set {
m_squared_distance_3(traits.compute_squared_distance_3_object()),
m_scalar_product_3(traits.compute_scalar_product_3_object()),
m_sqrt(Get_sqrt::sqrt_object(traits)),
m_to_local_converter() {
m_iconverter() {
CGAL_precondition(input_range.size() > 0);
@ -265,19 +264,19 @@ namespace Point_set {
} else { // update reference plane and normal
std::vector<Local_point_3> points;
std::vector<IPoint_3> points;
points.reserve(region.size());
for (std::size_t i = 0; i < region.size(); ++i) {
CGAL_precondition(region[i] < m_input_range.size());
const auto& key = *(m_input_range.begin() + region[i]);
points.push_back(m_to_local_converter(get(m_point_map, key)));
points.push_back(m_iconverter(get(m_point_map, key)));
}
CGAL_postcondition(points.size() == region.size());
Local_plane_3 fitted_plane;
Local_point_3 fitted_centroid;
IPlane_3 fitted_plane;
IPoint_3 fitted_centroid;
// The best fit plane will be a plane fitted to all region points with
// its normal being perpendicular to the plane.
@ -285,8 +284,8 @@ namespace Point_set {
points.begin(), points.end(),
fitted_plane, fitted_centroid,
CGAL::Dimension_tag<0>(),
Local_traits(),
CGAL::Eigen_diagonalize_traits<Local_FT, 3>());
ITraits(),
CGAL::Eigen_diagonalize_traits<IFT, 3>());
m_plane_of_best_fit =
Plane_3(
@ -306,8 +305,6 @@ namespace Point_set {
/// @}
private:
// Fields.
const Input_range& m_input_range;
const FT m_distance_threshold;
@ -322,7 +319,7 @@ namespace Point_set {
const Scalar_product_3 m_scalar_product_3;
const Sqrt m_sqrt;
const To_local_converter m_to_local_converter;
const IConverter m_iconverter;
Plane_3 m_plane_of_best_fit;
Vector_3 m_normal_of_best_fit;

View File

@ -64,7 +64,6 @@ namespace Point_set {
class Least_squares_plane_fit_sorting {
public:
/// \name Types
/// @{
@ -86,6 +85,15 @@ namespace Point_set {
/// @}
private:
using ITraits = Exact_predicates_inexact_constructions_kernel;
using IFT = typename ITraits::FT;
using IPoint_3 = typename ITraits::Point_3;
using IPlane_3 = typename ITraits::Plane_3;
using IConverter = Cartesian_converter<Traits, ITraits>;
using Compare_scores = internal::Compare_scores<IFT>;
public:
/// \name Initialization
/// @{
@ -112,7 +120,7 @@ namespace Point_set {
m_input_range(input_range),
m_neighbor_query(neighbor_query),
m_point_map(point_map),
m_to_local_converter() {
m_iconverter() {
CGAL_precondition(input_range.size() > 0);
@ -155,20 +163,17 @@ namespace Point_set {
/// @}
private:
const Input_range& m_input_range;
Neighbor_query& m_neighbor_query;
const Point_map m_point_map;
std::vector<std::size_t> m_order;
std::vector<IFT> m_scores;
const IConverter m_iconverter;
// Types.
using Local_traits = Exact_predicates_inexact_constructions_kernel;
using Local_FT = typename Local_traits::FT;
using Local_point_3 = typename Local_traits::Point_3;
using Local_plane_3 = typename Local_traits::Plane_3;
using To_local_converter = Cartesian_converter<Traits, Local_traits>;
using Compare_scores = internal::Compare_scores<Local_FT>;
// Functions.
void compute_scores() {
std::vector<std::size_t> neighbors;
std::vector<Local_point_3> points;
std::vector<IPoint_3> points;
for (std::size_t i = 0; i < m_input_range.size(); ++i) {
@ -181,31 +186,21 @@ namespace Point_set {
CGAL_precondition(neighbors[j] < m_input_range.size());
const auto& key = *(m_input_range.begin() + neighbors[j]);
points.push_back(m_to_local_converter(get(m_point_map, key)));
points.push_back(m_iconverter(get(m_point_map, key)));
}
CGAL_postcondition(points.size() == neighbors.size());
Local_plane_3 fitted_plane;
Local_point_3 fitted_centroid;
IPlane_3 fitted_plane;
IPoint_3 fitted_centroid;
m_scores[i] = CGAL::linear_least_squares_fitting_3(
points.begin(), points.end(),
fitted_plane, fitted_centroid,
CGAL::Dimension_tag<0>(),
Local_traits(),
CGAL::Eigen_diagonalize_traits<Local_FT, 3>());
ITraits(),
CGAL::Eigen_diagonalize_traits<IFT, 3>());
}
}
// Fields.
const Input_range& m_input_range;
Neighbor_query& m_neighbor_query;
const Point_map m_point_map;
std::vector<std::size_t> m_order;
std::vector<Local_FT> m_scores;
const To_local_converter m_to_local_converter;
};
} // namespace Point_set

View File

@ -67,7 +67,6 @@ namespace Point_set {
class Sphere_neighbor_query {
public:
/// \name Types
/// @{
@ -75,14 +74,15 @@ namespace Point_set {
using Traits = GeomTraits;
using Input_range = InputRange;
using Point_map = PointMap;
using Point = typename Point_map::value_type;
/// \endcond
/// Number type.
typedef typename GeomTraits::FT FT;
/// \cond SKIP_IN_MANUAL
/// @}
private:
using Index_to_point_map =
internal::Item_property_map<Input_range, Point_map>;
@ -102,10 +102,8 @@ namespace Point_set {
using Tree
= CGAL::Kd_tree<Search_traits, Splitter, CGAL::Tag_true, CGAL::Tag_true>;
/// \endcond
/// @}
public:
/// \name Initialization
/// @{
@ -185,16 +183,19 @@ namespace Point_set {
/// @}
/// \cond SKIP_IN_MANUAL
// A property map that can be used to access points when
// iterating over the indices counting items in the input range.
const Index_to_point_map& index_to_point_map() const {
return m_index_to_point_map;
}
/// \endcond
private:
// Fields.
const Input_range& m_input_range;
const FT m_sphere_radius;
const Point_map m_point_map;
const Index_to_point_map m_index_to_point_map;
Tree m_tree;
};

View File

@ -78,22 +78,31 @@ namespace Polygon_mesh {
class Least_squares_plane_fit_region {
public:
/// \name Types
/// @{
/// \cond SKIP_IN_MANUAL
using Traits = GeomTraits;
using Face_graph = PolygonMesh;
using Face_range = FaceRange;
using Vertex_to_point_map = VertexToPointMap;
/// \endcond
/// Number type.
typedef typename GeomTraits::FT FT;
/// @}
private:
using Point_3 = typename Traits::Point_3;
using Vector_3 = typename Traits::Vector_3;
using Plane_3 = typename Traits::Plane_3;
using Local_traits = Exact_predicates_inexact_constructions_kernel;
using Local_FT = typename Local_traits::FT;
using Local_point_3 = typename Local_traits::Point_3;
using Local_plane_3 = typename Local_traits::Plane_3;
using To_local_converter = Cartesian_converter<Traits, Local_traits>;
using ITraits = Exact_predicates_inexact_constructions_kernel;
using IFT = typename ITraits::FT;
using IPoint_3 = typename ITraits::Point_3;
using IPlane_3 = typename ITraits::Plane_3;
using IConverter = Cartesian_converter<Traits, ITraits>;
using Squared_length_3 = typename Traits::Compute_squared_length_3;
using Squared_distance_3 = typename Traits::Compute_squared_distance_3;
@ -102,16 +111,8 @@ namespace Polygon_mesh {
using Get_sqrt = internal::Get_sqrt<Traits>;
using Sqrt = typename Get_sqrt::Sqrt;
/// \endcond
/// \name Types
/// @{
/// Number type.
typedef typename GeomTraits::FT FT;
/// @}
public:
/// \name Initialization
/// @{
@ -164,7 +165,7 @@ namespace Polygon_mesh {
m_scalar_product_3(traits.compute_scalar_product_3_object()),
m_cross_product_3(traits.construct_cross_product_vector_3_object()),
m_sqrt(Get_sqrt::sqrt_object(traits)),
m_to_local_converter() {
m_iconverter() {
CGAL_precondition(m_face_range.size() > 0);
@ -266,7 +267,7 @@ namespace Polygon_mesh {
} else { // update reference plane and normal
std::vector<Local_point_3> points;
std::vector<IPoint_3> points;
for (std::size_t i = 0; i < region.size(); ++i) {
CGAL_precondition(region[i] < m_face_range.size());
@ -278,13 +279,13 @@ namespace Polygon_mesh {
for (const auto vertex : vertices) {
const Point_3& tmp_point = get(m_vertex_to_point_map, vertex);
points.push_back(m_to_local_converter(tmp_point));
points.push_back(m_iconverter(tmp_point));
}
}
CGAL_postcondition(points.size() > 0);
Local_plane_3 fitted_plane;
Local_point_3 fitted_centroid;
IPlane_3 fitted_plane;
IPoint_3 fitted_centroid;
// The best fit plane will be a plane fitted to all vertices of all
// region faces with its normal being perpendicular to the plane.
@ -299,8 +300,8 @@ namespace Polygon_mesh {
points.begin(), points.end(),
fitted_plane, fitted_centroid,
CGAL::Dimension_tag<0>(),
Local_traits(),
CGAL::Eigen_diagonalize_traits<Local_FT, 3>());
ITraits(),
CGAL::Eigen_diagonalize_traits<IFT, 3>());
const Plane_3 unoriented_plane_of_best_fit =
Plane_3(
@ -351,6 +352,25 @@ namespace Polygon_mesh {
/// @}
private:
const Face_graph& m_face_graph;
const Face_range m_face_range;
const FT m_distance_threshold;
const FT m_normal_threshold;
const std::size_t m_min_region_size;
const Vertex_to_point_map m_vertex_to_point_map;
const Squared_length_3 m_squared_length_3;
const Squared_distance_3 m_squared_distance_3;
const Scalar_product_3 m_scalar_product_3;
const Cross_product_3 m_cross_product_3;
const Sqrt m_sqrt;
const IConverter m_iconverter;
Plane_3 m_plane_of_best_fit;
Vector_3 m_normal_of_best_fit;
template<typename Face>
void get_face_centroid(
@ -444,27 +464,6 @@ namespace Polygon_mesh {
return max_face_distance;
}
// Fields.
const Face_graph& m_face_graph;
const Face_range m_face_range;
const FT m_distance_threshold;
const FT m_normal_threshold;
const std::size_t m_min_region_size;
const Vertex_to_point_map m_vertex_to_point_map;
const Squared_length_3 m_squared_length_3;
const Squared_distance_3 m_squared_distance_3;
const Scalar_product_3 m_scalar_product_3;
const Cross_product_3 m_cross_product_3;
const Sqrt m_sqrt;
const To_local_converter m_to_local_converter;
Plane_3 m_plane_of_best_fit;
Vector_3 m_normal_of_best_fit;
};
} // namespace Polygon_mesh

View File

@ -77,7 +77,6 @@ namespace Polygon_mesh {
class Least_squares_plane_fit_sorting {
public:
/// \name Types
/// @{
@ -100,6 +99,15 @@ namespace Polygon_mesh {
/// @}
private:
using ITraits = Exact_predicates_inexact_constructions_kernel;
using IFT = typename ITraits::FT;
using IPoint_3 = typename ITraits::Point_3;
using IPlane_3 = typename ITraits::Plane_3;
using IConverter = Cartesian_converter<Traits, ITraits>;
using Compare_scores = internal::Compare_scores<IFT>;
public:
/// \name Initialization
/// @{
@ -127,7 +135,7 @@ namespace Polygon_mesh {
m_neighbor_query(neighbor_query),
m_face_range(faces(m_face_graph)),
m_vertex_to_point_map(vertex_to_point_map),
m_to_local_converter() {
m_iconverter() {
CGAL_precondition(m_face_range.size() > 0);
@ -170,20 +178,18 @@ namespace Polygon_mesh {
/// @}
private:
const Face_graph& m_face_graph;
Neighbor_query& m_neighbor_query;
const Face_range m_face_range;
const Vertex_to_point_map m_vertex_to_point_map;
std::vector<std::size_t> m_order;
std::vector<IFT> m_scores;
const IConverter m_iconverter;
// Types.
using Local_traits = Exact_predicates_inexact_constructions_kernel;
using Local_FT = typename Local_traits::FT;
using Local_point_3 = typename Local_traits::Point_3;
using Local_plane_3 = typename Local_traits::Plane_3;
using To_local_converter = Cartesian_converter<Traits, Local_traits>;
using Compare_scores = internal::Compare_scores<Local_FT>;
// Functions.
void compute_scores() {
std::vector<std::size_t> neighbors;
std::vector<Local_point_3> points;
std::vector<IPoint_3> points;
for (std::size_t i = 0; i < m_face_range.size(); ++i) {
@ -202,33 +208,22 @@ namespace Polygon_mesh {
for (const auto vertex : vertices) {
const auto& tmp_point = get(m_vertex_to_point_map, vertex);
points.push_back(m_to_local_converter(tmp_point));
points.push_back(m_iconverter(tmp_point));
}
}
CGAL_postcondition(points.size() > 0);
Local_plane_3 fitted_plane;
Local_point_3 fitted_centroid;
IPlane_3 fitted_plane;
IPoint_3 fitted_centroid;
m_scores[i] = CGAL::linear_least_squares_fitting_3(
points.begin(), points.end(),
fitted_plane, fitted_centroid,
CGAL::Dimension_tag<0>(),
Local_traits(),
CGAL::Eigen_diagonalize_traits<Local_FT, 3>());
ITraits(),
CGAL::Eigen_diagonalize_traits<IFT, 3>());
}
}
// Fields.
const Face_graph& m_face_graph;
Neighbor_query& m_neighbor_query;
const Face_range m_face_range;
const Vertex_to_point_map m_vertex_to_point_map;
std::vector<std::size_t> m_order;
std::vector<Local_FT> m_scores;
const To_local_converter m_to_local_converter;
};
} // namespace Polygon_mesh

View File

@ -58,15 +58,16 @@ namespace Polygon_mesh {
class One_ring_neighbor_query {
public:
/// \cond SKIP_IN_MANUAL
using Face_graph = PolygonMesh;
using Face_range = FaceRange;
using Face_to_index_map
= internal::Item_to_index_property_map<Face_range>;
/// \endcond
private:
using Face_to_index_map
= internal::Item_to_index_property_map<Face_range>;
public:
/// \name Initialization
/// @{
@ -129,12 +130,16 @@ namespace Polygon_mesh {
/// @}
private:
/// \cond SKIP_IN_MANUAL
// A property map that can be used to access indices of the input faces.
const Face_to_index_map& face_to_index_map() const {
return m_face_to_index_map;
}
/// \endcond
// Fields.
private:
const Face_graph& m_face_graph;
const Face_range m_face_range;
const Face_to_index_map m_face_to_index_map;
};

View File

@ -108,20 +108,18 @@ namespace internal {
using Traits = typename Kernel_traits<Plane_3>::Kernel;
using FT = typename Traits::FT;
using Local_traits =
CGAL::Exact_predicates_inexact_constructions_kernel;
using To_local_converter =
Cartesian_converter<Traits, Local_traits>;
using ITraits = CGAL::Exact_predicates_inexact_constructions_kernel;
using IConverter = Cartesian_converter<Traits, ITraits>;
using Local_FT = typename Local_traits::FT;
using Local_point_3 = typename Local_traits::Point_3;
using Local_plane_3 = typename Local_traits::Plane_3;
using IFT = typename ITraits::FT;
using IPoint_3 = typename ITraits::Point_3;
using IPlane_3 = typename ITraits::Plane_3;
planes.clear();
planes.reserve(regions.size());
std::vector<Local_point_3> points;
const To_local_converter to_local_converter = To_local_converter();
std::vector<IPoint_3> points;
const IConverter iconverter = IConverter();
for (const auto& region : regions) {
CGAL_assertion(region.size() > 0);
@ -132,21 +130,21 @@ namespace internal {
CGAL_precondition(region[i] < input_range.size());
const auto& key = *(input_range.begin() + region[i]);
points.push_back(to_local_converter(get(point_map, key)));
points.push_back(iconverter(get(point_map, key)));
}
CGAL_postcondition(points.size() == region.size());
Local_plane_3 fitted_plane;
Local_point_3 fitted_centroid;
IPlane_3 fitted_plane;
IPoint_3 fitted_centroid;
CGAL::linear_least_squares_fitting_3(
points.begin(), points.end(),
fitted_plane, fitted_centroid,
CGAL::Dimension_tag<0>(),
Local_traits(),
CGAL::Eigen_diagonalize_traits<Local_FT, 3>());
ITraits(),
CGAL::Eigen_diagonalize_traits<IFT, 3>());
const Plane_3 plane = Plane_3(
const Plane_3 plane = Plane_3(
static_cast<FT>(fitted_plane.a()),
static_cast<FT>(fitted_plane.b()),
static_cast<FT>(fitted_plane.c()),