diff --git a/Installation/changes.html b/Installation/changes.html index 09cca2e2225..f9fffa21871 100644 --- a/Installation/changes.html +++ b/Installation/changes.html @@ -112,6 +112,19 @@ and src/ directories).

Release 4.5

Release date: September 2014

+

Snap_rounding_2

+ +

Spatial_searching

+ +

Vanilla package (fake package, to be removed by the RM)

-

Release 4.4

Release date: April 2014

diff --git a/Snap_rounding_2/doc/Snap_rounding_2/Concepts/SnapRoundingTraits_2.h b/Snap_rounding_2/doc/Snap_rounding_2/Concepts/SnapRoundingTraits_2.h index a4f44c9912c..ef9cbdd51d1 100644 --- a/Snap_rounding_2/doc/Snap_rounding_2/Concepts/SnapRoundingTraits_2.h +++ b/Snap_rounding_2/doc/Snap_rounding_2/Concepts/SnapRoundingTraits_2.h @@ -41,6 +41,11 @@ Models the concept `SRTraits_2::IsoRectangle_2` */ typedef unspecified_type Iso_rectangle_2; +/*! +Models the concept `SearchTraits::Cartesian_const_iterator_2` +*/ +typedef unspecified_type Cartesian_const_iterator_2; + /// @} /// \name Functor Types @@ -93,6 +98,21 @@ Models the concept `SRTraits_2::MinkowskiSumWithPixel_2`. */ typedef unspecified_type Minkowski_sum_with_pixel_2; +/*! +Models the concept `ArrTraits::ConstructMinVertex_2`. +*/ +typedef unspecified_type Construct_min_vertex_2; + +/*! +Models the concept `ArrTraits::ConstructMaxVertex_2`. +*/ +typedef unspecified_type Construct_max_vertex_2; + +/*! +Models the concept `SearchTraits::Construct_cartesian_const_iterator_2`. +*/ +typedef unspecified_type Construct_cartesian_const_iterator_2; + /// @} /// \name Accessing Functor Objects diff --git a/Snap_rounding_2/examples/Snap_rounding_2/data/snap_rounding_data b/Snap_rounding_2/examples/Snap_rounding_2/data/snap_rounding_data new file mode 100644 index 00000000000..246dc1873d4 --- /dev/null +++ b/Snap_rounding_2/examples/Snap_rounding_2/data/snap_rounding_data @@ -0,0 +1,5 @@ +4 +0 0 10 10 +0 10 10 0 +3 0 3 10 +7 0 7 10 \ No newline at end of file diff --git a/Snap_rounding_2/examples/Snap_rounding_2/snap_rounding_data.cpp b/Snap_rounding_2/examples/Snap_rounding_2/snap_rounding_data.cpp new file mode 100644 index 00000000000..e530e4f1238 --- /dev/null +++ b/Snap_rounding_2/examples/Snap_rounding_2/snap_rounding_data.cpp @@ -0,0 +1,139 @@ +// Copyright 2009,2014 Max-Planck-Institute Saarbruecken (Germany). +// All rights reserved. +// +// This file is part of CGAL (www.cgal.org). +// You can redistribute it and/or modify it under the terms of the GNU +// General Public License as published by the Free Software Foundation, +// either version 3 of the License, or (at your option) any later version. +// +// Licensees holding a valid commercial license may use this file in +// accordance with the commercial license agreement provided with the software. +// +// This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE +// WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. +// +// $URL$ +// $Id$ +// +// +// author(s) : Waqar Khan + + +/* Usage + * + * This example converts arbitrary-precision arrangment into fixed-precision using Snap Rounding and by using INPUT DATA FROM A USER SPECIFIED FILE. + * (Mandatory) path to the input file containing the arrangment information. + * (Optional) path to the output file where the results of snap rounding will be stored. + * Not providing this argument will print the result on standard output. + * + * Input file format + * Line # 1: Number of line-segments present in the file. + * Line # 2 to N+1: segment_start_point_x segment_start_point_y segment_end_point_x segment_end_point_y + * + * Each line should contain information about just one segment. +*/ + +#include +#include +#include +#include +#include +#include + +typedef CGAL::Quotient Number_type; +typedef CGAL::Cartesian Kernel; +typedef CGAL::Snap_rounding_traits_2 Traits; +typedef Kernel::Segment_2 Segment_2; +typedef Kernel::Point_2 Point_2; +typedef std::list Segment_list_2; +typedef std::list Polyline_2; +typedef std::list Polyline_list_2; + +int main(int argc, char* argv[]) +{ + //if(argc > 3 || argc < 2) + if(argc > 3) + { + std::cout<< "Incorrect input. path to the INPUT file. (optional) path to the OUTPUT file. No arguments to choose the default data file" << std::endl; + return -1; + } + + Segment_list_2 seg_list; + Polyline_list_2 output_list; + + std::ifstream my_read_file; + std::ofstream my_write_file; + + if(argc > 1) + my_read_file.open(argv[1]); + else + my_read_file.open("data/snap_rounding_data"); + + if(!my_read_file.is_open()) + { + std::cout<< "Error opening the input file"<< std::endl; + return -1; + } + + if(argc==3) + { + my_write_file.open(argv[2]); + + if(!my_read_file.is_open()) + { + std::cout<< "Error opening the output file"<< std::endl; + return -1; + } + } + + unsigned int number_of_lines = 0; + my_read_file >> number_of_lines; + + for(unsigned int i=0; i> point_start_x; + my_read_file >> point_start_y; + my_read_file >> point_end_x; + my_read_file >> point_end_y; + + seg_list.push_back(Segment_2(Point_2(point_start_x, point_start_y), Point_2(point_end_x, point_end_y))); + } + + // Generate an iterated snap-rounding representation, where the centers of + // the hot pixels bear their original coordinates, using 1 kd trees: + CGAL::snap_rounding_2 + (seg_list.begin(), seg_list.end(), output_list, 1.0, true, false, 1); + + int counter = 0; + Polyline_list_2::const_iterator iter1; + + if(argc == 3) //output to the file + { + for (iter1 = output_list.begin(); iter1 != output_list.end(); ++iter1) + { + my_write_file << "Polyline number " << ++counter << ":\n"; + Polyline_2::const_iterator iter2; + + for (iter2 = iter1->begin(); iter2 != iter1->end(); ++iter2) + my_write_file << " (" << iter2->x() << ":" << iter2->y() << ")\n"; + } + + my_write_file.close(); + } + else //output to std output + { + for (iter1 = output_list.begin(); iter1 != output_list.end(); ++iter1) + { + std::cout << "Polyline number " << ++counter << ":\n"; + Polyline_2::const_iterator iter2; + + for (iter2 = iter1->begin(); iter2 != iter1->end(); ++iter2) + std::cout << " (" << iter2->x() << ":" << iter2->y() << ")\n"; + } + } + + my_read_file.close(); + + return(0); +} diff --git a/Snap_rounding_2/include/CGAL/Snap_rounding_kd_2.h b/Snap_rounding_2/include/CGAL/Snap_rounding_kd_2.h old mode 100644 new mode 100755 index 10008562f5e..6c0d1e459e1 --- a/Snap_rounding_2/include/CGAL/Snap_rounding_kd_2.h +++ b/Snap_rounding_2/include/CGAL/Snap_rounding_kd_2.h @@ -1,4 +1,4 @@ -// Copyright (c) 2001 Tel-Aviv University (Israel). +// Copyright (c) 2001, 2009, 2014 Tel-Aviv University (Israel), Max-Planck-Institute Saarbruecken (Germany). // All rights reserved. // // This file is part of CGAL (www.cgal.org). @@ -16,13 +16,14 @@ // $Id$ // // -// author(s) : Eli Packer +// author(s) : Eli Packer , +// Waqar Khan + #ifndef CGAL_SNAP_ROUNDING_KD_2_H #define CGAL_SNAP_ROUNDING_KD_2_H #include #include -#include #include #include #include @@ -31,23 +32,81 @@ #include +#include +#include +#include + namespace CGAL { +namespace internal { + +////////////////////// +////////////////////// +//Point_with_hot_pixel_history +////////////////////// + template -class My_point : public Traits::Point_2 { +class Point_with_hot_pixel_history : public Traits::Point_2 { + private: - typedef typename Traits::Point_2 Point_2; - typedef typename Traits::FT NT; + + typedef typename Traits::Point_2 Base; + typedef typename Traits::Point_2 Point_2; + typedef typename Traits::FT NT; public: + Point_2 orig; SAVED_OBJECT object; - My_point(const Point_2& p, const Point_2& inp_orig, SAVED_OBJECT obj) : - Point_2(p), orig(inp_orig), object(obj) {} - My_point(const Point_2& p) : Point_2(p), orig(Point_2(0, 0)) {} - My_point() : Point_2(),orig() {} - My_point(NT x, NT y) : Point_2(x, y), orig(Point_2(0, 0)) {} -}; + + Point_with_hot_pixel_history(const Base& p, const Point_2& inp_orig, SAVED_OBJECT obj) : Base(p), orig(inp_orig), object(obj) {} + + Point_with_hot_pixel_history(const Base& p) : Base(p), orig(Point_2(0, 0)) {} + + Point_with_hot_pixel_history() : Base(), orig() {} + + Point_with_hot_pixel_history(NT x, NT y) : Base(x, y), orig(Point_2(0, 0)) {} + +}; // Point_with_hot_pixel_history + + +////////////////////// +////////////////////// +//Search_traits_kd_tree_2 +// +//(Search traits modified to be used by the Spacial Searching kd_trees for Snap rounding) +////////////////////// + +template < class Traits_, class Point_ = typename Traits_::Point_2 > +class Search_traits_kd_tree_2 { + +public: + typedef Traits_ Traits; + typedef Point_ Point_d; + + typedef typename Traits::Iso_rectangle_2 Iso_box_d; + typedef typename Traits::Cartesian_const_iterator_2 Cartesian_const_iterator_d; + typedef typename Traits::Construct_cartesian_const_iterator_2 Construct_cartesian_const_iterator_d; + + typedef typename Traits::Construct_min_vertex_2 Construct_min_vertex_d; + typedef typename Traits::Construct_max_vertex_2 Construct_max_vertex_d; + + typedef typename Traits::Construct_iso_rectangle_2 Construct_iso_box_d; + typedef typename Traits::FT FT; + + Construct_cartesian_const_iterator_d construct_cartesian_const_iterator_d_object() const + { + return Construct_cartesian_const_iterator_d(); + } + +}; // Search_traits_kd_tree_2 + +} // namespace internal + +///////////////////// +///////////////////// +//Multiple_kd_tree +///////////////////// template class Multiple_kd_tree { @@ -62,22 +121,25 @@ private: typedef typename Traits::Direction_2 Direction_2; typedef typename Traits::Line_2 Line_2; typedef typename Traits::Aff_transformation_2 Transformation_2; - typedef My_point My_point_saved; - typedef CGAL::Kdtree_interface_2d Kd_interface; - typedef CGAL::Kdtree_d Kd_tree; - typedef typename Kd_tree::Box Box; - typedef std::list Points_List; - typedef std::pair Direction_nt_pair; - typedef std::pair Kd_triple; - typedef std::pair Kd_direction_nt_pair; - typedef std::list Kd_triple_list; + + typedef CGAL::internal::Point_with_hot_pixel_history Point_with_hot_pixel_history_saved; + typedef CGAL::internal::Search_traits_kd_tree_2 + Search_traits; + typedef CGAL::Kd_tree Kd_tree; + typedef CGAL::Fuzzy_iso_box Box; + + typedef std::list Points_List; + typedef std::pair Direction_nt_pair; + typedef std::pair Kd_triple; + typedef std::pair Kd_direction_nt_pair; + typedef std::list Kd_triple_list; typedef std::pair Point_saved_pair; typedef std::list Point_saved_pair_list; typedef typename Point_saved_pair_list::iterator Point_saved_pair_iter; - typedef typename std::list My_point_saved_list; - typedef typename My_point_saved_list::iterator My_point_saved_iter; + typedef typename std::list Point_with_hot_pixel_history_saved_list; + typedef typename Point_with_hot_pixel_history_saved_list::iterator Point_with_hot_pixel_history_saved_iter; typedef std::list Point_list; typedef typename Point_list::iterator Point_iter; @@ -88,11 +150,14 @@ private: typedef std::list Direction_list; typedef typename Direction_list::const_iterator Direction_const_iter; + private: Traits m_gt; const double pi, half_pi; int number_of_trees; - Kd_triple_list kd_trees_list; + + Kd_triple_list kd_trees_list; + Point_saved_pair_list input_points_list; std::map angle_to_sines_appr; // was const int @@ -115,35 +180,38 @@ private: /*! */ Kd_triple create_kd_tree(NT angle) { - Points_List l; - Kd_tree *tree = new Kd_tree(2); - for (Point_saved_pair_iter iter = input_points_list.begin(); - iter != input_points_list.end(); ++iter) + Kd_tree *tree = new Kd_tree(); + + tree->reserve(input_points_list.size()); + + for (Point_saved_pair_iter iter = input_points_list.begin(); iter != input_points_list.end(); ++iter) { Point_2 p(iter->first); rotate(p,angle); - My_point_saved rotated_point(p,iter->first,iter->second); - l.push_back(rotated_point); + Point_with_hot_pixel_history_saved rotated_point(p,iter->first,iter->second); + + tree->insert(rotated_point); } - tree->build(l); + tree->build(); - //checking validity - if (!tree->is_valid()) tree->dump(); - CGAL_assertion(tree->is_valid()); typename Traits::To_double to_dbl; double buffer_angle(to_dbl(angle) - half_pi / (2 * number_of_trees)); - if (buffer_angle < 0) buffer_angle = 0; + if (buffer_angle < 0) + buffer_angle = 0; + Line_2 li(std::tan(buffer_angle), -1, 0); Direction_2 d(li); + // rotate_by 180 degrees Transformation_2 t(ROTATION, 0, -1); d = d.transform(t); Direction_nt_pair kp(d, angle); - Kd_triple kt(tree,kp); + + Kd_triple kt(tree, kp); return(kt); } @@ -155,10 +223,12 @@ private: inline NT min BOOST_PREVENT_MACRO_SUBSTITUTION (NT x1, NT x2, NT x3, NT x4, NT x5, NT x6) - {return(min BOOST_PREVENT_MACRO_SUBSTITUTION (min BOOST_PREVENT_MACRO_SUBSTITUTION (min BOOST_PREVENT_MACRO_SUBSTITUTION (x1, x2), min BOOST_PREVENT_MACRO_SUBSTITUTION (x3, x4)),min BOOST_PREVENT_MACRO_SUBSTITUTION (x5, x6)));} + {return(min BOOST_PREVENT_MACRO_SUBSTITUTION (min BOOST_PREVENT_MACRO_SUBSTITUTION (min BOOST_PREVENT_MACRO_SUBSTITUTION (x1, x2), + min BOOST_PREVENT_MACRO_SUBSTITUTION (x3, x4)),min BOOST_PREVENT_MACRO_SUBSTITUTION (x5, x6)));} inline NT max BOOST_PREVENT_MACRO_SUBSTITUTION (NT x1, NT x2, NT x3, NT x4, NT x5, NT x6) - {return(max BOOST_PREVENT_MACRO_SUBSTITUTION (max BOOST_PREVENT_MACRO_SUBSTITUTION (max BOOST_PREVENT_MACRO_SUBSTITUTION (x1, x2), max BOOST_PREVENT_MACRO_SUBSTITUTION (x3, x4)),max BOOST_PREVENT_MACRO_SUBSTITUTION (x5, x6)));} + {return(max BOOST_PREVENT_MACRO_SUBSTITUTION (max BOOST_PREVENT_MACRO_SUBSTITUTION (max BOOST_PREVENT_MACRO_SUBSTITUTION (x1, x2), + max BOOST_PREVENT_MACRO_SUBSTITUTION (x3, x4)),max BOOST_PREVENT_MACRO_SUBSTITUTION (x5, x6)));} /*! */ Direction_2 get_direction(Segment_2 seg) @@ -330,6 +400,7 @@ public: pi(3.1415), half_pi(1.57075), number_of_trees(inp_number_of_trees), input_points_list(inp_points_list) { + Kd_triple kd; // check that there are at least two trees @@ -353,9 +424,13 @@ public: angle += half_pi / number_of_trees,++i) { buffer_angle = angle - half_pi / (2 * number_of_trees); - if (buffer_angle < 0) buffer_angle = 0; + + if (buffer_angle < 0) + buffer_angle = 0; + li = Line_2(std::tan(buffer_angle), -1, 0); d = Direction_2(li); + // rotate_by 180 degrees Transformation_2 t(ROTATION, 0, -1); d = d.transform(t); @@ -369,7 +444,9 @@ public: #ifdef CGAL_SR_DEBUG int number_of_actual_kd_trees = 0; #endif + i = 0; + for (NT angle = 0; i < number_of_trees; angle += NT(half_pi / number_of_trees),++i) { @@ -377,6 +454,7 @@ public: (double)number_of_segments / (double)number_of_trees / 2.0) { kd = create_kd_tree(angle); + kd_trees_list.push_back(kd); #ifdef CGAL_SR_DEBUG @@ -397,14 +475,15 @@ public: } - ~Multiple_kd_tree() { - for(typename Kd_triple_list::iterator it = kd_trees_list.begin(); - it != kd_trees_list.end(); ++it) { + ~Multiple_kd_tree() + { + //delete all the kd_trees. + for(typename Kd_triple_list::iterator it = kd_trees_list.begin(); it != kd_trees_list.end(); ++it) delete (it->first); - } - for(typename Point_saved_pair_list::iterator it = input_points_list.begin(); - it != input_points_list.end(); ++it) { + //delete all the points. + for(typename Point_saved_pair_list::iterator it = input_points_list.begin(); + it != input_points_list.end(); ++it) { delete (it->second); } @@ -444,63 +523,71 @@ public: { // determine right kd-tree to work on, depending on the segment's slope Direction_2 d = get_direction(s); + int i = 0; int n = kd_trees_list.size(); bool found = false; typename Kd_triple_list::const_iterator iter = kd_trees_list.begin(); - while(i < n && !found) { - if (iter->second.first > d) found = true; + while(i < n && !found) + { + if (iter->second.first > d) + found = true; + ++i; ++iter; } - if (!found) iter = kd_trees_list.begin(); - else --iter; + if (!found) + iter = kd_trees_list.begin(); + + else + --iter; Point_list points_list; m_gt.minkowski_sum_with_pixel_2_object()(points_list, s, unit_square); Point_iter points_iter; - for (points_iter = points_list.begin(); points_iter != points_list.end(); - ++points_iter) + for (points_iter = points_list.begin(); points_iter != points_list.end(); ++points_iter) rotate(*points_iter, iter->second.second); // query points_iter = points_list.begin(); - Point_2 point_left,point_right,point_bot,point_top; + Point_2 point_left, point_right, point_bot, point_top; point_left = point_right = point_bot = point_top = *points_iter; - for (++points_iter; points_iter != points_list.end(); ++points_iter) { + + for (++points_iter; points_iter != points_list.end(); ++points_iter) + { point_left = small_x_point(point_left,*points_iter); point_right = big_x_point(point_right,*points_iter); point_bot = small_y_point(point_bot,*points_iter); point_top = big_y_point(point_top,*points_iter); } - typedef typename Traits::Construct_iso_rectangle_2 - Construct_iso_rectangle_2; - Construct_iso_rectangle_2 construct_rec = - m_gt.construct_iso_rectangle_2_object(); - Iso_rectangle_2 rec = - construct_rec(point_left, point_right, point_bot, point_top); + typedef typename Traits::Construct_iso_rectangle_2 Construct_iso_rectangle_2; + + Construct_iso_rectangle_2 construct_rec = m_gt.construct_iso_rectangle_2_object(); + + Iso_rectangle_2 rec = construct_rec(point_left, point_right, point_bot, point_top); Point_2 p1 = rec.vertex(0); Point_2 p2 = rec.vertex(2); - My_point_saved point1(p1); - My_point_saved point2(p2); + Point_with_hot_pixel_history_saved point1(p1); + Point_with_hot_pixel_history_saved point2(p2); - Box b(point1, point2, 2); + Box b(point1, point2); // the kd-tree query - My_point_saved_list res; - iter->first->search(std::back_inserter(res), b); + Point_with_hot_pixel_history_saved_list result; + + iter->first->search(std::back_inserter(result), b); // create result result_list.empty(); - for (My_point_saved_iter my_point_iter = res.begin(); - my_point_iter != res.end(); ++my_point_iter) + + for( Point_with_hot_pixel_history_saved_iter my_point_iter = result.begin(); my_point_iter != result.end(); ++my_point_iter ) result_list.push_back(my_point_iter->object); } }; diff --git a/Snap_rounding_2/include/CGAL/Snap_rounding_traits_2.h b/Snap_rounding_2/include/CGAL/Snap_rounding_traits_2.h old mode 100644 new mode 100755 index 2c252e55afa..bd5e23f0bae --- a/Snap_rounding_2/include/CGAL/Snap_rounding_traits_2.h +++ b/Snap_rounding_2/include/CGAL/Snap_rounding_traits_2.h @@ -1,4 +1,4 @@ -// Copyright (c) 2001 Tel-Aviv University (Israel). +// Copyright (c) 2001,2009,2014 Tel-Aviv University (Israel), Max-Planck-Institute Saarbruecken (Germany). // All rights reserved. // // This file is part of CGAL (www.cgal.org). @@ -14,9 +14,11 @@ // // $URL$ // $Id$ -// // -// author(s) : Eli Packer +// +// author(s) : Eli Packer , +// Waqar Khan + #ifndef CGAL_SNAP_ROUNDING_2_TRAITS_H #define CGAL_SNAP_ROUNDING_2_TRAITS_H @@ -33,28 +35,29 @@ class Snap_rounding_traits_2 : public CGAL::Arr_segment_traits_2 { public: // otherwise Segment_data cannot access the types - typedef typename Base_kernel::FT NT; - typedef typename Base_kernel::FT FT; - typedef typename Base_kernel::Point_2 Point_2; - typedef typename Base_kernel::Segment_2 Segment_2; - typedef typename Base_kernel::Iso_rectangle_2 Iso_rectangle_2; - typedef typename Base_kernel::Vector_2 Vector_2; - typedef typename Base_kernel::Line_2 Line_2; - typedef typename Base_kernel::Aff_transformation_2 Aff_transformation_2; - typedef typename Base_kernel::Direction_2 Direction_2; - typedef typename Base_kernel::Construct_vertex_2 Construct_vertex_2 ; - typedef typename Base_kernel::Construct_segment_2 Construct_segment_2 ; - typedef typename Base_kernel::Construct_iso_rectangle_2 - Construct_iso_rectangle_2; - typedef typename Base_kernel::Compare_y_2 Compare_y_2; + typedef typename Base_kernel::FT NT; + typedef typename Base_kernel::FT FT; + typedef typename Base_kernel::Point_2 Point_2; + typedef typename Base_kernel::Segment_2 Segment_2; + typedef typename Base_kernel::Iso_rectangle_2 Iso_rectangle_2; + typedef typename Base_kernel::Vector_2 Vector_2; + typedef typename Base_kernel::Line_2 Line_2; + typedef typename Base_kernel::Aff_transformation_2 Aff_transformation_2; + typedef typename Base_kernel::Direction_2 Direction_2; + typedef typename Base_kernel::Construct_vertex_2 Construct_vertex_2 ; + typedef typename Base_kernel::Construct_segment_2 Construct_segment_2 ; + typedef typename Base_kernel::Construct_iso_rectangle_2 Construct_iso_rectangle_2; + typedef typename Base_kernel::Compare_y_2 Compare_y_2; - typedef CGAL::Arr_segment_traits_2 Base_traits; + typedef typename Base_kernel::Construct_min_vertex_2 Construct_min_vertex_2; + typedef typename Base_kernel::Construct_max_vertex_2 Construct_max_vertex_2; + typedef typename Base_kernel::Cartesian_const_iterator_2 Cartesian_const_iterator_2; + typedef typename Base_kernel::Construct_cartesian_const_iterator_2 Construct_cartesian_const_iterator_2; - typedef typename Base_traits::Compare_x_2 Compare_x_2; - + typedef CGAL::Arr_segment_traits_2 Base_traits; + typedef typename Base_traits::Compare_x_2 Compare_x_2; + typedef CGAL::To_double To_double; - typedef CGAL::To_double To_double; - public: /*! Functor */ class Snap_2 { @@ -198,7 +201,6 @@ public: return k.construct_iso_rectangle_2_object(); } - }; } //namespace CGAL diff --git a/Spatial_searching/doc/Spatial_searching/CGAL/Kd_tree.h b/Spatial_searching/doc/Spatial_searching/CGAL/Kd_tree.h index 7303ff40aa0..05750c7f0be 100644 --- a/Spatial_searching/doc/Spatial_searching/CGAL/Kd_tree.h +++ b/Spatial_searching/doc/Spatial_searching/CGAL/Kd_tree.h @@ -3,162 +3,173 @@ namespace CGAL { /*! \ingroup SearchClasses -The class `Kd_tree` defines a `k-d` tree. +The class `Kd_tree` defines a `k-d` tree. \cgalHeading{Parameters} -Expects for the first template argument a model of the concept -`SearchTraits`, for example `Search_traits_2 >`. +Expects for the first template argument a model of the concept +`SearchTraits`, for example `Search_traits_2 >`. -Expects for the second template argument a model for the concept `Splitter`. -It defaults to `Sliding_midpoint`. +Expects for the second template argument a model for the concept `Splitter`. +It defaults to `Sliding_midpoint`. -Expects for the third template argument `Tag_true`, if the -tree shall be built with extended nodes, and `Tag_false` otherwise. +Expects for the third template argument `Tag_true`, if the +tree shall be built with extended nodes, and `Tag_false` otherwise. -\sa `CGAL::Kd_tree_node` -\sa `CGAL::Search_traits_2` -\sa `CGAL::Search_traits_3` -\sa `CGAL::Search_traits` +\sa `CGAL::Kd_tree_node` +\sa `CGAL::Search_traits_2` +\sa `CGAL::Search_traits_3` +\sa `CGAL::Search_traits` */ template< typename Traits, typename Splitter, typename UseExtendedNode > class Kd_tree { public: -/// \name Types +/// \name Types /// @{ /*! -Point class. -*/ -typedef Traits::Point_d Point_d; +Point class. +*/ +typedef Traits::Point_d Point_d; /*! -Number type. -*/ -typedef Traits::FT FT; +Number type. +*/ +typedef Traits::FT FT; /*! -Splitter type. -*/ -typedef unspecified_type Splitter; +Splitter type. +*/ +typedef unspecified_type Splitter; /*! -Bidirectional const iterator with value type `Point_d` that allows -to enumerate all points in the tree. -*/ -typedef unspecified_type iterator; +Bidirectional const iterator with value type `Point_d` that allows +to enumerate all points in the tree. +*/ +typedef unspecified_type iterator; /*! -A handle with value type `Kd_tree_node`. -*/ -typedef unspecified_type Node_handle; +A handle with value type `Kd_tree_node`. +*/ +typedef unspecified_type Node_handle; /*! -A const handle with value type `Kd_tree_node`. -*/ -typedef unspecified_type Node_const_handle; +A const handle with value type `Kd_tree_node`. +*/ +typedef unspecified_type Node_const_handle; /*! -Random access const iterator with value type `const Point_d*`. -*/ -typedef unspecified_type Point_d_iterator; +Random access const iterator with value type `const Point_d*`. +*/ +typedef unspecified_type Point_d_iterator; /*! -A type that counts the number of elements in a `k-d` tree. -*/ -typedef unspecified_type size_type; +A type that counts the number of elements in a `k-d` tree. +*/ +typedef unspecified_type size_type; -/// @} +/// @} -/// \name Creation +/// \name Creation /// @{ /*! -Constructs an empty `k-d` tree. -*/ -Kd_tree(Splitter s=Splitter(),Traits t=Traits()); +Constructs an empty `k-d` tree. +*/ +Kd_tree(Splitter s=Splitter(),Traits t=Traits()); /*! -Constructs a `k-d` tree on the elements from the sequence -`[first, beyond)` using the splitting rule implemented by `s`. -The value type of the `InputIterator` must be `Point_d`. +Constructs a `k-d` tree on the elements from the sequence +`[first, beyond)` using the splitting rule implemented by `s`. +The value type of the `InputIterator` must be `Point_d`. -*/ -template Kd_tree(InputIterator first, InputIterator beyond, Splitter s=Splitter(),Traits t=Traits()); +*/ +template Kd_tree(InputIterator first, InputIterator beyond, Splitter s=Splitter(),Traits t=Traits()); -/// @} +/// @} -/// \name Operations +/// \name Operations /// @{ /*! -Inserts the point `p` in the `k-d` tree. -*/ -void insert(Point_d p); +Inserts the point `p` in the `k-d` tree. +*/ +void insert(Point_d p); /*! -Inserts the elements from the sequence `[first, beyond)` in the `k-d` tree. -The value type of the `InputIterator` must be `Point_d`. -*/ -template void insert(InputIterator first, InputIterator beyond); +Inserts the elements from the sequence `[first, beyond)` in the `k-d` tree. +The value type of the `InputIterator` must be `Point_d`. +*/ +template void insert(InputIterator first, InputIterator beyond); + + +/* +Pre-allocates memory in order to store at least 'size' points. +*/ +void reserve(size_t size); + +/* +Returns the number of points for which memory has been pre-allocated. + */ +size_t capacity(); /*! -Reports the points that are approximately contained by `q`. -The types `FuzzyQueryItem::Point_d` and `Point_d` must be equivalent. -To use this function `Traits` must be a model of the concept `RangeSearchTraits`. +Reports the points that are approximately contained by `q`. +The types `FuzzyQueryItem::Point_d` and `Point_d` must be equivalent. +To use this function `Traits` must be a model of the concept `RangeSearchTraits`. -*/ -template -OutputIterator search(OutputIterator it, FuzzyQueryItem q) const; +*/ +template +OutputIterator search(OutputIterator it, FuzzyQueryItem q) const; /*! -Returns a const iterator to the first point in the tree. -*/ -iterator begin() const; +Returns a const iterator to the first point in the tree. +*/ +iterator begin() const; /*! -Returns the appropriate past-the-end const iterator. -*/ -iterator end() const; +Returns the appropriate past-the-end const iterator. +*/ +iterator end() const; /*! -Removes all points from the `k-d` tree. -*/ -void clear(); +Removes all points from the `k-d` tree. +*/ +void clear(); /*! -Returns the number of points that are stored in the tree. -*/ -size_type size() const; +Returns the number of points that are stored in the tree. +*/ +size_type size() const; /*! -return the instance of the traits used to construct the tree. -*/ -Traits traits() const; +return the instance of the traits used to construct the tree. +*/ +Traits traits() const; /*! -Returns a handle to the root node of the tree. -*/ -Node_handle root(); +Returns a handle to the root node of the tree. +*/ +Node_handle root(); /*! -Returns a const handle to the root node of the tree. -*/ -Node_const_handle root() const; +Returns a const handle to the root node of the tree. +*/ +Node_const_handle root() const; /*! Returns a const reference to the bounding box of the root node of the tree. -*/ -const Kd_tree_rectangle& bounding_box() const; +*/ +const Kd_tree_rectangle& bounding_box() const; /*! -Inserts statistics of the tree into the output stream `s`. -*/ -std::ostream& statistics(std::ostream& s) const; +Inserts statistics of the tree into the output stream `s`. +*/ +std::ostream& statistics(std::ostream& s) const; /// @} diff --git a/Spatial_searching/include/CGAL/Kd_tree.h b/Spatial_searching/include/CGAL/Kd_tree.h index 23fec0af12d..2d541378128 100644 --- a/Spatial_searching/include/CGAL/Kd_tree.h +++ b/Spatial_searching/include/CGAL/Kd_tree.h @@ -1,4 +1,4 @@ -// Copyright (c) 2002,2011 Utrecht University (The Netherlands). +// Copyright (c) 2002,2011,2014 Utrecht University (The Netherlands), Max-Planck-Institute Saarbruecken (Germany). // All rights reserved. // // This file is part of CGAL (www.cgal.org). @@ -14,9 +14,9 @@ // // $URL$ // $Id$ -// // -// Author(s) : Hans Tangelder () +// Author(s) : Hans Tangelder (), +// : Waqar Khan #ifndef CGAL_KD_TREE_H #define CGAL_KD_TREE_H @@ -45,7 +45,7 @@ public: typedef Splitter_ Splitter; typedef typename SearchTraits::Point_d Point_d; typedef typename Splitter::Container Point_container; - + typedef typename SearchTraits::FT FT; typedef Kd_tree_node Node; typedef Kd_tree Tree; @@ -58,7 +58,7 @@ public: typedef typename Splitter::Separator Separator; typedef typename std::vector::const_iterator iterator; typedef typename std::vector::const_iterator const_iterator; - + typedef typename std::vector::size_type size_type; private: @@ -74,7 +74,7 @@ private: // Instead of storing the points in arrays in the Kd_tree_node // we put all the data in a vector in the Kd_tree. // and we only store an iterator range in the Kd_tree_node. - // + // std::vector data; @@ -94,7 +94,7 @@ private: // the allocation of the nodes. // The leaf node - Node_handle + Node_handle create_leaf_node(Point_container& c) { Node_handle nh = nodes.emplace(static_cast(c.size()), Node::LEAF); @@ -103,40 +103,40 @@ private: return nh; } - + // The internal node - Node_handle + Node_handle create_internal_node(Point_container& c, const Tag_true&) { return create_internal_node_use_extension(c); } - Node_handle + Node_handle create_internal_node(Point_container& c, const Tag_false&) { return create_internal_node(c); } - - + + // TODO: Similiar to the leaf_init function above, a part of the code should be // moved to a the class Kd_tree_node. // It is not proper yet, but the goal was to see if there is // a potential performance gain through the Compact_container - Node_handle + Node_handle create_internal_node_use_extension(Point_container& c) { Node_handle nh = nodes.emplace(Node::EXTENDED_INTERNAL); - + Point_container c_low(c.dimension(),traits_); split(nh->separator(), c, c_low); - + int cd = nh->separator().cutting_dimension(); - + nh->low_val = c_low.bounding_box().min_coord(cd); nh->high_val = c.bounding_box().max_coord(cd); - + CGAL_assertion(nh->separator().cutting_value() >= nh->low_val); CGAL_assertion(nh->separator().cutting_value() <= nh->high_val); @@ -150,21 +150,21 @@ private: }else{ nh->upper_ch = create_leaf_node(c); } - + return nh; } - + // Note also that I duplicated the code to get rid if the if's for // the boolean use_extension which was constant over the construction - Node_handle + Node_handle create_internal_node(Point_container& c) { Node_handle nh = nodes.emplace(Node::INTERNAL); - + Point_container c_low(c.dimension(),traits_); split(nh->separator(), c, c_low); - + if (c_low.size() > split.bucket_size()){ nh->lower_ch = create_internal_node(c_low); }else{ @@ -185,11 +185,11 @@ public: Kd_tree(Splitter s = Splitter(),const SearchTraits traits=SearchTraits()) : traits_(traits),split(s), built_(false) {} - + template Kd_tree(InputIterator first, InputIterator beyond, - Splitter s = Splitter(),const SearchTraits traits=SearchTraits()) - : traits_(traits),split(s), built_(false) + Splitter s = Splitter(),const SearchTraits traits=SearchTraits()) + : traits_(traits),split(s), built_(false) { pts.insert(pts.end(), first, beyond); } @@ -197,13 +197,13 @@ public: bool empty() const { return pts.empty(); } - - void + + void build() { const Point_d& p = *pts.begin(); typename SearchTraits::Construct_cartesian_const_iterator_d ccci=traits_.construct_cartesian_const_iterator_d_object(); - int dim = static_cast(std::distance(ccci(p), ccci(p,0))); + int dim = static_cast(std::distance(ccci(p), ccci(p,0))); data.reserve(pts.size()); for(unsigned int i = 0; i < pts.size(); i++){ @@ -214,12 +214,12 @@ public: if (c.size() <= split.bucket_size()){ tree_root = create_leaf_node(c); }else { - tree_root = create_internal_node(c, UseExtendedNode()); + tree_root = create_internal_node(c, UseExtendedNode()); } built_ = true; } -private: +private: //any call to this function is for the moment not threadsafe void const_build() const { #ifdef CGAL_HAS_THREADS @@ -230,7 +230,7 @@ private: const_cast(this)->build(); //THIS IS NOT THREADSAFE } public: - + bool is_built() const { return built_; @@ -245,35 +245,47 @@ public: built_ = false; } } - + void clear() { invalidate_built(); pts.clear(); } - + void insert(const Point_d& p) { invalidate_built(); pts.push_back(p); - } - + } + template - void + void insert(InputIterator first, InputIterator beyond) { invalidate_built(); pts.insert(pts.end(),first, beyond); } + //For efficiency; reserve the size of the points vectors in advance (if the number of points is already known). + void reserve(size_t size) + { + pts.reserve(size); + } + + //Get the capacity of the underlying points vector. + size_t capacity() + { + return pts.capacity(); + } + template - OutputIterator + OutputIterator search(OutputIterator it, const FuzzyQueryItem& q) const { if(! pts.empty()){ - + if(! is_built()){ const_build(); } @@ -291,27 +303,27 @@ public: const SearchTraits& - traits() const + traits() const { return traits_; } - Node_const_handle - root() const - { + Node_const_handle + root() const + { if(! is_built()){ const_build(); } - return tree_root; + return tree_root; } - Node_handle + Node_handle root() { if(! is_built()){ build(); } - return tree_root; + return tree_root; } void @@ -324,12 +336,12 @@ public: } const Kd_tree_rectangle& - bounding_box() const + bounding_box() const { if(! is_built()){ const_build(); } - return *bbox; + return *bbox; } const_iterator @@ -344,23 +356,23 @@ public: return pts.end(); } - size_type - size() const + size_type + size() const { return pts.size(); } // Print statistics of the tree. - std::ostream& + std::ostream& statistics(std::ostream& s) const { if(! is_built()){ const_build(); } s << "Tree statistics:" << std::endl; - s << "Number of items stored: " + s << "Number of items stored: " << root()->num_items() << std::endl; - s << "Number of nodes: " + s << "Number of nodes: " << root()->num_nodes() << std::endl; s << " Tree depth: " << root()->depth() << std::endl; return s; diff --git a/Spatial_searching/test/Spatial_searching/iso_rectangle_2_query_2.cpp b/Spatial_searching/test/Spatial_searching/iso_rectangle_2_query_2.cpp new file mode 100644 index 00000000000..17193f40023 --- /dev/null +++ b/Spatial_searching/test/Spatial_searching/iso_rectangle_2_query_2.cpp @@ -0,0 +1,71 @@ +#include +#include +#include +#include +#include + +#include + +typedef CGAL::Simple_cartesian K; +typedef K::Point_2 Point_d; +typedef CGAL::Random_points_in_square_2 Random_points_iterator; +typedef CGAL::Counting_iterator N_Random_points_iterator; +typedef CGAL::Search_traits_2 Traits; +typedef CGAL::Kd_tree Tree; +typedef CGAL::Fuzzy_iso_box Fuzzy_iso_box; + +int +main() { + const size_t N = 1000; + + std::list points; + points.push_back(Point_d(0,0)); + + Tree tree; + Random_points_iterator rpg; + + //inserting N points one-by-one, thus the use of "reserve" is recommended, and thus we use it + + tree.reserve(N); + + //to test wether the tree.capacity() function works properly. + if( tree.capacity() < N) + { + std::cerr << "ERROR: Something is wrong with allocating points memory." << std::endl; + return -1; + } + + for(size_t i = 0; i < N; i++) + { + tree.insert(*rpg++); + } + + std::list result; + + // define range query + Point_d p(0.2, 0.2); + Point_d q(0.7, 0.7); + + // Searching an exact range + // using default value 0.0 for epsilon fuzziness paramater + // Fuzzy_box exact_range(r); replaced by + Fuzzy_iso_box exact_range(p,q); + std::cout << "tree.search(..)" << std::endl; + //tree.report_all_points(std::ostream_iterator(std::cout,"\n")); + tree.search( std::back_inserter( result ), exact_range); + + std::cout << "The points in the box [0.2,0.7]x[0.2,0.7] are: " << std::endl; + std::copy (result.begin(), result.end(), std::ostream_iterator(std::cout,"\n") ); + std::cout << std::endl; + + result.clear(); + // Searching a fuzzy range + // using value 0.1 for fuzziness paramater + Fuzzy_iso_box approximate_range(p, q, 0.1); + tree.search(std::back_inserter( result ), approximate_range); + std::cout << "The points in the fuzzy box [<0.1-0.3>,<0.6-0.9>]x[<0.1-0.3>,<0.6-0.9>] are: " + << std::endl; + std::copy (result.begin(), result.end(), std::ostream_iterator(std::cout,"\n") ); + std::cout << std::endl; + return 0; +} diff --git a/kdtree/dont_submit b/kdtree/dont_submit deleted file mode 100644 index 1e107f52e47..00000000000 --- a/kdtree/dont_submit +++ /dev/null @@ -1 +0,0 @@ -examples diff --git a/kdtree/examples/kdtrees/example1.cin b/kdtree/examples/kdtrees/example1.cin deleted file mode 100644 index ba884a49aa2..00000000000 --- a/kdtree/examples/kdtrees/example1.cin +++ /dev/null @@ -1,5 +0,0 @@ -3 -3 -7 -7 - diff --git a/kdtree/examples/kdtrees/example1.cpp b/kdtree/examples/kdtrees/example1.cpp deleted file mode 100644 index af45b7f6b66..00000000000 --- a/kdtree/examples/kdtrees/example1.cpp +++ /dev/null @@ -1,80 +0,0 @@ -// Copyright (c) 1997 Tel-Aviv University (Israel). -// All rights reserved. -// -// This file is part of an example program for CGAL. This example -// program may be used, distributed and modified without limitation. -// - -/*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* - * example1.C - - * Simple example the CGAL KD-tree module. - * - * Written by Sariel Har-Peled - * Iddo Hanniel -\*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*/ - -#include - -#include -#include -#include -#include -#include -#include - -#include - -typedef CGAL::Cartesian K; -typedef K::Point_2 point; -typedef CGAL::Kdtree_interface_2d kd_interface; -typedef CGAL::Kdtree_d kd_tree; -typedef kd_tree::Box box; -typedef std::list points_list; - -int main() -{ - CGAL::Kdtree_d tree(2); - points_list l, res; - - std::srand( (unsigned)time(NULL) ); - - std::cout << "Insering evenly 81 points in the square (0,0)-(10,10) ...\n\n"; - for (int i=1; i<10; i++) - for (int j=1; j<10; j++) - { - point p(i,j); - l.push_front(p); - } - - // building the tree - tree.build( l ); - - // checking validity - if ( ! tree.is_valid() ) - tree.dump(); - assert( tree.is_valid() ); - - // Defining and searching the box r - double lx,ly,rx,ry; - std::cout << "Define your query square.\nEnter left x coordinate: " ; - std::cin >> lx ; - std::cout << "Enter left y coordinate: "; - std::cin >> ly; - std::cout << "Enter right x coordinate: " ; - std::cin >> rx ; - std::cout << "Enter right y coordinate: "; - std::cin >> ry; - std::cout << std::endl; - - box r(point(lx,ly), point(rx,ry) ,2); - - tree.search( std::back_inserter( res ), r ); - - std::cout << "Listing of the points in the square: \n" ; - std::copy (res.begin(),res.end(),std::ostream_iterator(std::cout," \n") ); - std::cout << std::endl; - - tree.delete_all(); - - return 0; -} diff --git a/kdtree/examples/kdtrees/example2.cpp b/kdtree/examples/kdtrees/example2.cpp deleted file mode 100644 index 8584c14eb3a..00000000000 --- a/kdtree/examples/kdtrees/example2.cpp +++ /dev/null @@ -1,93 +0,0 @@ -// Copyright (c) 1997 Tel-Aviv University (Israel). -// All rights reserved. -// -// This file is part of an example program for CGAL. This example -// program may be used, distributed and modified without limitation. -// - -/*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* - * example2.C - - * Simple example the CGAL KD-tree module. - * - * Written by Sariel Har-Peled - * Iddo Hanniel -\*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*/ - -#include - -#include -#include -#include -#include -#include -#include - -#include - -typedef CGAL::Cartesian K; -typedef K::Point_3 point; -typedef CGAL::Kdtree_interface_3d kd_interface; -typedef CGAL::Kdtree_d kd_tree; -typedef kd_tree::Box box; -typedef std::list points_list; - -//RANDOM FUNCTIONS -// dblRand - a random number between 0..1 -#ifndef RAND_MAX -#define RAND_MAX 0x7fffffff -#endif - -inline double dblRand( void ) -{ - return (double)std::rand() / (double)RAND_MAX; -} - -void random_points( int num, points_list &l ) -{ - double x,y,z; - - for (int j = 0; j < num; j++) - { - x = dblRand()*10 ; - y = dblRand()*10 ; - z = dblRand()*10 ; - point p(x,y,z); - l.push_front(p); - } -} - -int main() -{ - CGAL::Kdtree_d tree(3); - - std::srand( (unsigned)time(NULL) ); - - std::cout << "Choosing randomly 30 points in the cube (0,0,0)-(10,10,10)\n" ; - - points_list l , res; - random_points( 30, l); - - std::cout << "Listing of random points:\n" ; - std::copy (l.begin(),l.end(),std::ostream_iterator(std::cout,"\n") ); - std::cout << std::endl; - - // Building the tree for the random points - tree.build( l ); - - // Checking validity - if ( ! tree.is_valid() ) - tree.dump(); - assert( tree.is_valid() ); - - // Searching the box r - box r(point(2,2,2), point(7,7,7) ,3); - tree.search( std::back_inserter( res ), r ); - - std::cout << "Listing of the points in the box (2,2,2)-(7,7,7) : \n" ; - std::copy (res.begin(),res.end(),std::ostream_iterator(std::cout,"\n") ); - std::cout << std::endl; - - tree.delete_all(); - - return 0; -} diff --git a/kdtree/examples/kdtrees/example3.cpp b/kdtree/examples/kdtrees/example3.cpp deleted file mode 100644 index 13b2f6509e3..00000000000 --- a/kdtree/examples/kdtrees/example3.cpp +++ /dev/null @@ -1,155 +0,0 @@ -// Copyright (c) 1997 Tel-Aviv University (Israel). -// All rights reserved. -// -// This file is part of an example program for CGAL. This example -// program may be used, distributed and modified without limitation. -// - -/*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* - * example3.C - - * Simple example the CGAL KD-tree module. - * Example with user defined point_d. - * - * Written by Sariel Har-Peled - * Iddo Hanniel -\*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*/ - -#include - -#include -#include -#include -#include -#include -#include - -#include - -template -class Point_float_d -{ -private: - double vec[ DIM ]; - -public: - Point_float_d() - { - for ( int ind = 0; ind < DIM; ind++ ) - vec[ ind ] = 0; - } - - int dimension() const - { - return DIM; - } - -//not essential by specification but needed for initializing a general d-point - void set_coord(int k, double x) - { - assert( 0 <= k && k < DIM ); - vec[ k ] = x; - } - - double & operator[](int k) - { - assert( 0 <= k && k < DIM ); - return vec[ k ]; - } - - double operator[](int k) const - { - assert( 0 <= k && k < DIM ); - return vec[ k ]; - } -}; - -// not essential by specification but nice to have -template -std::ostream &operator<<(std::ostream &os, const Point_float_d &p) -{ - std::cout << "("; - for(int i = 0; i < DIM; i++) - { - std::cout << p[i] ; - if (i < p.dimension() - 1) std::cout << ", "; - } - std::cout << ")"; - return os; -} - -typedef Point_float_d<4> point; -typedef CGAL::Kdtree_interface kd_interface; -typedef CGAL::Kdtree_d kd_tree; -typedef kd_tree::Box box; -typedef std::list points_list; - -//RANDOM FUNCTIONS -// dblRand - a random number between 0..1 -#ifndef RAND_MAX -#define RAND_MAX 0x7fffffff -#endif - -inline double dblRand( void ) -{ - return (double)std::rand() / (double)RAND_MAX; -} - -void random_points( int num, points_list &l, int DIM) -{ - double x; - - for (int j = 0; j < num; j++) - { - point p; - for (int i=0; i tree(3); - - std::srand( (unsigned)time(NULL) ); - - std::cout << "Choosing randomly 30 points in the cube (0,0,0)-(10,10,10)\n" ; - - points_list l , res; - random_points( 30, l , 4); - - std::cout << "Listing of random points:\n" ; - std::copy (l.begin(),l.end(),std::ostream_iterator(std::cout,"\n") ); - std::cout << std::endl; - - // Building the tree for the random points - tree.build( l ); - - // Checking validity - if ( ! tree.is_valid() ) - tree.dump(); - assert( tree.is_valid() ); - - // Searching the box r - point p,q; - for (int k=0;k<4;k++) - { - p.set_coord(k,2); - q.set_coord(k,8); - } - - box r(p, q, 4); - tree.search( std::back_inserter( res ), r ); - - std::cout << "Listing of the points in the box (2,2,2,2)-(8,8,8,8) : \n" ; - std::copy (res.begin(),res.end(), - std::ostream_iterator(std::cout,"\n") ); - std::cout << std::endl; - - tree.delete_all(); - - return 0; -} diff --git a/kdtree/examples/kdtrees/example4.cpp b/kdtree/examples/kdtrees/example4.cpp deleted file mode 100644 index bc2fc9b0fea..00000000000 --- a/kdtree/examples/kdtrees/example4.cpp +++ /dev/null @@ -1,86 +0,0 @@ -// Copyright (c) 1997 Tel-Aviv University (Israel). -// All rights reserved. -// -// This file is part of an example program for CGAL. This example -// program may be used, distributed and modified without limitation. -// - -/*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* - * example2.C - bench mark - * Simple example the CGAL KD-tree module. - * - * Written by Sariel Har-Peled - * Iddo Hanniel -\*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*/ - -#include - -#include -#include -#include -#include -#include -#include - -#include -#include -#include - -typedef CGAL::Cartesian K; -typedef K::Point_3 Point; -typedef CGAL::Kdtree_interface_3d kd_interface; -typedef CGAL::Kdtree_d kd_tree; -typedef kd_tree::Box box; -typedef std::list points_list; - -int main() -{ - CGAL::Kdtree_d tree(3); - CGAL::Timer t; - const int dim=3; - - // const int data_point_number=1000000; - const int data_point_number=10000; - - - - - - - typedef std::list point_list; - point_list data_points,res; - - // get data points - - // add random points of dimension dim to data_points - CGAL::Random Rnd; - // std::cout << "started tstrandom()" << std::endl; - for (int i1=0; i1 -#include -#include -#include -using std::list; // to avoid compiler crash on MSVC++ - -namespace CGAL { - -/*======================================================================= - * Kdtree_interface - - * This is the default interface of point. It assume that PT (the - * point type have the following properties: - * default constructor - * int dimension() - * const coord_type & operator[]( int ) const - * ... operator=( const Pt & ) - copy operator -\*=======================================================================*/ - -template -class Kdtree_interface -{ -public: - typedef PT Point; - - static int dimension( const PT & pnt ) - { - // return pnt.dimensions(); - return pnt.dimension(); - } - - static int compare( int d, const PT & a, const PT & b ) - { - if ( a[ d ] < b[ d ] ) - return -1; - if ( a[ d ] > b[ d ] ) - return 1; - - return 0; - } - static void copy_coord( int d, PT & a, const PT & b ) - { - a[ d ] = b[ d ]; - } -}; - - - -template -class Kdtree_interface_2d -{ -public: - typedef PT Point; - - static int dimension( const PT & pnt ) - { - // return pnt.dimensions(); - return pnt.dimension(); - } - - static int compare( int d, const PT & a, const PT & b ) - { - if ( a[ d ] < b[ d ] ) - return -1; - if ( a[ d ] > b[ d ] ) - return 1; - - return 0; - } - static void copy_coord( int d, PT & a, const PT & b ) - { - if ( d == 0 ) - a = PT( b[ 0 ], a[1] ); - else - if ( d == 1 ) - a = PT( a[ 0 ], b[1] ); - else { - CGAL_error(); - } - } -}; - - -template -class Kdtree_interface_3d -{ -public: - typedef PT Point; - - static int dimension( const PT & pnt ) - { - // return pnt.dimensions(); - return pnt.dimension(); - } - - static int compare( int d, const PT & a, const PT & b ) - { - if ( a[ d ] < b[ d ] ) - return -1; - if ( a[ d ] > b[ d ] ) - return 1; - - return 0; - } - static void copy_coord( int d, PT & a, const PT & b ) - { - if ( d == 0 ) - a = PT( b[ 0 ], a[1], a[ 2 ] ); - else - if ( d == 1 ) - a = PT( a[ 0 ], b[1], a[ 2 ] ); - else - if ( d == 2 ) - a = PT( a[ 0 ], a[1], b[ 2 ] ); - else { - CGAL_error(); - } - } -}; - - -/*========================================================================= - * kdtree_d - - * A the kdtree class. - * - * Remark: The kd-trees allocates all the memory it needs in advance, - * This results in a rather efficient memory management, and a fast - * iplementation. -\*=========================================================================*/ -template -class Kdtree_d -{ - class Plane; - -public: - typedef typename Traits::Point Point; - typedef list List_points; - - - //------------------------------------------------------------------------- - // Extended_Point_d - - // A class for representing an extended d-dimal point: with - // ability to support +/- infinity. Templated by the kd-treee interface - // type. - //------------------------------------------------------------------------- - class ExtPoint - { - private: - class coordinate_type - { - public: - const Point * p_pnt; - int type; - //signed char type; - }; - - coordinate_type * p_arr; - int dim; - Point def_pnt; - - void init( int _dim ) - { - CGAL_precondition( _dim > 0 ); - dim = _dim; - - p_arr = (coordinate_type *)std::malloc( sizeof( coordinate_type ) - * dim ); - //printf( "p_arr(new): %p\n", (void *)p_arr ); - CGAL_assertion( p_arr != NULL ); - - std::memset( p_arr, 0, sizeof( coordinate_type ) * dim ); - } - - public: - enum { MINUS_INFINITY = -1, FINITE = 0, PLUS_INFINITY = 1 }; - - ExtPoint( int _type, int _dim ) - { - CGAL_precondition( _type == MINUS_INFINITY || _type == PLUS_INFINITY ); - init( _dim ); - - for ( int ind = 0; ind < dim; ind++ ) - p_arr[ ind ].type = _type; - } - - ExtPoint() - { - p_arr = NULL; - dim = -1; - } - - ExtPoint( const ExtPoint & p ) - { - init( p.dim ); - - def_pnt = p.def_pnt; - for ( int ind = 0; ind < dim; ind++ ) { - p_arr[ ind ] = p.p_arr[ ind ]; - if ( p.p_arr[ ind ].p_pnt == &p.def_pnt ) - p_arr[ ind ].p_pnt = &def_pnt; - } - } - - ExtPoint & operator=( const ExtPoint & p ) - { - term(); - - init( p.dim ); - - def_pnt = p.def_pnt; - for ( int ind = 0; ind < dim; ind++ ) { - p_arr[ ind ] = p.p_arr[ ind ]; - if ( p.p_arr[ ind ].p_pnt == &p.def_pnt ) - p_arr[ ind ].p_pnt = &def_pnt; - } - - return *this; - } - - ExtPoint( const Point & point, int _dim ) - { - init( _dim ); - - def_pnt = point; - for ( int ind = 0; ind < _dim; ind++ ) { - p_arr[ ind ].p_pnt = &def_pnt; - p_arr[ ind ].type = FINITE; - } - } - - void term() - { - if ( p_arr != NULL ) { - //printf( "a: %p\n", p_arr ); - std::free( p_arr ); - //printf( "_a\n" ); - p_arr = NULL; - } - dim = 0; - } - - ~ExtPoint() - { - term(); - } - - void set_coord( int k, Point & point ) - { - CGAL_precondition( 0 <= k && k < dim ); - - p_arr[ k ].type = FINITE; - //p_arr[ k ].p_pnt = &point; - - Traits::copy_coord( k, def_pnt, point ); - p_arr[ k ].p_pnt = &def_pnt; - } - - void set_coord( int k, const ExtPoint & point ) - { - CGAL_precondition( 0 <= k && k < dim ); - CGAL_precondition( 0 <= k && k < point.dim ); - - p_arr[ k ] = point.p_arr[ k ]; - if ( p_arr[ k ].type == FINITE ) { - Traits::copy_coord( k, def_pnt, *(p_arr[ k ].p_pnt) ); - p_arr[ k ].p_pnt = &def_pnt; - } - } - - int compare( int k, const ExtPoint & point ) const - { - CGAL_precondition( 0 <= k && k < dim ); - // the following does not compile on msvc++... - // coordinate_type & a( p_arr[ k ] ), - // & b( point.p_arr[ k ] ); - coordinate_type & a = p_arr[ k ]; - coordinate_type & b = point.p_arr[ k ]; - - if ( a.type != FINITE ) { - if ( b.type != FINITE ) { - return a.type - b.type; - } else { - return a.type; - } - } else { - if ( b.type != FINITE ) - return -b.type; - else - return Traits::compare( k, *a.p_pnt, *b.p_pnt ); - } - } - - - int compare_vector( const ExtPoint & point ) const - { - int ind, res; - - for ( ind = 0; ind < dim; ind++ ) { - res = compare( ind, point ); - if ( res != 0 ) - return res; - } - - return 0; - } - - int compare( int k, const Point & point ) const - { - CGAL_precondition( 0 <= k && k < dim ); - - // coordinate_type & a( p_arr[ k ] ); - coordinate_type & a = p_arr[ k ]; - - if ( a.type != FINITE ) - return a.type; - else - return Traits::compare( k, *a.p_pnt, point ); - } - - int dimension() const - { - return dim; - } - - int get_coord_status( int d ) const - { - CGAL_precondition( 0 <= d && d < dim ); - - return p_arr[ d ].type; - } - - - const Point * get_coord_point( int d ) const - { - CGAL_precondition( 0 <= d && d < dim ); - - return p_arr[ d ].p_pnt; - } - }; - - - // Box - represents an axis parallel box. - class Box - { - public: - int dim; - ExtPoint left, right; - - private: - friend class Plane; - - ExtPoint & get_vertex( bool f_left ) - { - return f_left? left : right; - } - - public: - // constructors - - //CHECK - Box() - { - } - - Box( const Box & box ) - { - dim = box.dim; - left = box.left; - right = box.right; - } - - - Box( const Point &l, const Point &r, int _dim ) - { - dim = _dim; - left = ExtPoint( l, dim ); - right = ExtPoint( r, dim ); - } - - Box( int _dim ) : left( ExtPoint::MINUS_INFINITY, _dim ), - right( ExtPoint::PLUS_INFINITY, _dim ) - { - dim = _dim; - } - - - // data access - void set_left( Point &l) - { - left = ExtPoint( l, dim ); - }; - - void set_right( Point &r) - { - right = ExtPoint( r, dim ); - } - - const ExtPoint &get_left() const - { - return left; - } - - const ExtPoint &get_right() const - { - return right; - } - - - void set_coord_left( int k, Point & p ) - { - left.set_coord( k, p ); - } - - - void set_coord_right( int k, Point & p ) - { - right.set_coord( k, p ); - } - - - // operations - bool is_in( const Box &o) const - // checks if o is completely inside - { - int dim = left.dimension(); - - for (int i = 0; i < dim; i++) - { - if ( (left.compare(i, o.get_left()) > 0 ) - || (right.compare(i, o.get_right()) < 0 ) ) - return false; - } - - return true; - } - - - bool is_in( const Point & o ) const - // checks if o is completely inside - { - int _dim = left.dimension(); - for (int i = 0; i < _dim; i++) - { - if ( (left.compare( i, o ) > 0 ) || - (right.compare( i, o ) <= 0 ) ) - return false; - } - return true; - } - - - bool is_coord_in_range( int k, const Point & o ) const - // checks if o is completely inside - { - return ( ! ( (left.compare( k, o ) > 0 ) - || (right.compare( k, o ) <= 0 ) ) ); - } - - - bool is_intersect( const Box &o) const - // checks if there is an intersection between o and this - { - int dim = left.dimension(); - for (int i = 0; i < dim; i++) - { - if ( (left.compare(i, o.get_right()) >= 0) || - (right.compare(i, o.get_left()) <= 0) ) - return false; - } - return true; - } - - - // checks if there is an intersection between o and this box - // only in a specific coordinate... - bool is_intersect_in_dim( int d, const Box & o ) const - { - return (! ( (left.compare( d, o.get_right() ) >= 0 ) - || (right.compare( d, o.get_left() ) <= 0) )); - } - - - // checks if there is an intersection between o and this box - // only in a specific coordinate... - bool is_intersect_in_dim_closed( int d, const Box & o ) const - { - return (! ( (left.compare( d, o.get_right() ) > 0 ) - || (right.compare( d, o.get_left() ) < 0) )); - } - - - bool intersect(Box &o) - // intersects this with o. the intersection will be in this - // returns false if intersection is empty - { - int dim = left.dimension(); - for (int i = 0; i < dim; i++) - { - // left is the maximal of the lefts - if (left.compare(i, o.get_left()) == -1) - left.set_coord(i, o.get_left()); - - // right is the minimal of the rights - if (right.compare(i, o.get_right()) == 1) - right.set_coord(i, o.get_right()); - } - return !(is_empty()); - } - - bool is_empty() const - // return true if this is not an interval (left[k] > right[k]) - { - int dim = left.dimension(); - for (int i = 0; i < dim; i++) - { - if (left.compare(i, right) == 1) - return true; - } - return false; - } - - bool is_empty_open() const - // return true if this is not an interval (left[k] > right[k]) - { - int dim = left.dimension(); - for (int i = 0; i < dim; i++) - { - if ( left.compare(i, right) >= 0 ) - return true; - } - return false; - } - - int comp( const Box & o ) const - { - int res; - - res = left.compare_vector( o.left ); - if ( res != 0 ) - return res; - - return right.compare_vector( o.right ); - } - // destructor - needed in ...recursive ... DVP - - ~Box() - { - left.term(); - right.term(); - dim = 0; - } - - }; - - -private: - class Plane - { - private: - int coord; - Point * normal; - bool f_plus; // orientation of half space - // is (0, 0, ... , +inifinity, 0, ..., 0) inside plane - - public: - Plane() - { - normal = NULL; - coord = 0; - } - - Plane( int k, Point & p ) - { - normal = &p; - coord = k; - } - - Plane( const Plane & p ) - { - coord = p.coord; - normal = p.normal; - } - - void dump( void ) - { - std::cout << "(" << coord << ": " << *normal << ")"; - } - - bool is_in( const Point & p ) const - { - int cmp; - - cmp = Traits::compare( coord, p, *normal ); - - if ( ! f_plus ) - cmp = -cmp; - - return cmp >= 0; - } - - void set_plane(int k, Point &p) - { - coord = k; - normal = &p; - //normal->copy( coord, p ); - } - - void split( Box & region, bool f_neg ) - { - ExtPoint * p_p = &(region.get_vertex( ! f_neg )); - - if ( f_neg ) { - if ( p_p->compare( coord, *normal ) > 0 ) - p_p->set_coord( coord, *normal ); - } else - if ( p_p->compare( coord, *normal ) < 0 ) - p_p->set_coord( coord, *normal ); - } - - void orient_half_space( bool f_neg_side ) - { - f_plus = ! f_neg_side; - } - - int get_coord() const - { - return coord; - } - }; - -private: - class Node - { - public: - Plane plane; - Point * pnt; - - Node * left, * right; - - enum { LEFT, RIGHT }; - - const Plane & get_hs( int side ) const - { - - ((Plane *)&plane)->orient_half_space( side == LEFT ); - - return plane; - } - - - bool is_points_in_hs( const Plane & pl ) const - { - if ( is_point() ) - return pl.is_in( *pnt ); - - if ( left != NULL && ( ! left->is_points_in_hs( pl ) ) ) - return false; - if ( right != NULL && ( ! right->is_points_in_hs( pl ) ) ) - return false; - - return true; - } - - - bool is_valid() const - { - if ( is_point() ) - return true; - - if ( left != NULL ) - if ( ! left->is_points_in_hs( get_hs( LEFT ) ) ) - return false; - if ( right != NULL ) - if ( ! right->is_points_in_hs( get_hs( RIGHT ) ) ) - return false; - - return true; - } - - - void dump( int depth ) - { - int ind; - - for ( ind = 0; ind < depth; ind++ ) - std::cout << " "; - - if ( is_point() ) { - std::cout << *pnt << "\n"; - return; - } - - plane.dump(); - std::cout << "\n"; - left->dump( depth + 1 ); - for ( ind = 0; ind < depth; ind++ ) - std::cout << " "; - - std::cout << "!!!!!!!!!!!!\n"; - right->dump( depth + 1 ); - } - - bool is_point() const - { - return ((left == NULL) && (right == NULL)); - } - - typedef std::back_insert_iterator back_iter; - - Node() : plane() - { - left = right = NULL; - } - - void copy_subtree_points( back_iter & result, - const Box & rect ) - { - if ( is_point() ) { - if ( rect.is_in( *pnt ) ) - (*result++) = *pnt; - return; - } - if ( left != NULL ) - left->copy_subtree_points( result, rect ); - if ( right != NULL ) - right->copy_subtree_points( result, rect ); - } - - static void search_recursive( back_iter & result, - Node * node, - const Box & rect, - Box & _region, - Plane & plane, - bool f_split_plus ) - { - //printf( "search_recusrive\n" ); - Box * p_r = new Box( _region ); - - //printf( "z" ); - //fflush( stdout ); - - plane.split( *p_r, f_split_plus ); - - //printf( "c" ); - //fflush( stdout ); - CGAL_precondition( node != NULL ); - - //printf( "b" ); - //fflush( stdout ); - if ( rect.is_in( *p_r ) ) - { - //printf( "5" ); - //fflush( stdout ); - node->copy_subtree_points( result, rect ); - //printf( "\tsearch_recursive done...\n" ); - //printf( "6" ); - //fflush( stdout ); - delete p_r; - return; - } - - //printf( "v" ); - //fflush( stdout ); - - if ( rect.is_intersect_in_dim_closed( plane.get_coord(), *p_r ) ) - node->search( result, rect, *p_r ); - //printf( "x" ); - //fflush( stdout ); - delete p_r; - } - - void search( std::back_insert_iterator result, - const Box &rect, Box ®ion ) - { - if (is_point()) { - if ( rect.is_in( *pnt ) ) - (*result++) = *pnt; - return; - } - - //this is not a point so it is a hypeplane - if ( left != NULL ) - search_recursive( result, left, rect, - region, plane, true ); - if ( right != NULL ) - search_recursive( result, right, rect, - region, plane, false ); - } - }; - - typedef Point * Point_ptr; - - int size; - Point * p_arr_pt; - Node *root; - int dim; - - Node * p_node_arr; - int node_count; - - Node * malloc_node( void ) - { - Node * p_ret; - - p_ret = &(p_node_arr[ node_count ]); - node_count++; - - CGAL_assertion( node_count <= ( 2 * size )); - - *p_ret = Node(); - - return p_ret; - } - - static int comp( const Point & a, const Point & b, int dim ) - { - return Traits::compare( dim, a, b ); - } - - static int partition( Point_ptr * arr, int left, int right, - Point * p_pivot, int dim ) - { - int i, j; - Point_ptr tmp; - - if ( left >= right ) - return left; - - i = left; - j = right; - - while ( i < j ) { - if ( comp( *(arr[ i ]), *(arr[ j ]), dim ) > 0 ) { - tmp = arr[ i ]; - arr[ i ] = arr[ j ]; - arr[ j ] = tmp; - } - if ( comp( *(arr[ i ]), *p_pivot, dim ) < 0 ) { - i++; - } else - if ( comp( *p_pivot, *(arr[ j ]), dim ) <= 0 ) - j--; - } - - return (i > left)? i - 1 : left; - } - - - /* split the array into two sub-arrays, such that all the elements - * from left to pos_mid are smaller than the elements from pos+1 to - * right. - */ - static void split_arr( Point_ptr * arr, - int left, - int right, - int pos_mid, - int dim ) - { - int pos; - - if ( left >= right ) - return; - - pos = partition( arr, left, right, arr[ (left + right ) / 2 ], - dim ); - if ( pos == pos_mid ) - return; - - if ( pos < pos_mid ) - split_arr( arr, pos+1, right, pos_mid, dim ); - else - split_arr( arr, left, pos, pos_mid, dim ); - } - - - static Point_ptr get_max_element( Point_ptr * arr, - int left, int right, int d ) - { - int max_pos = left; - Point mx = *(arr[ max_pos ]); - - for ( int ind = left + 1; ind <= right; ind++ ) - if ( comp( mx, *(arr[ ind ]), d ) < 0 ) { - mx = *(arr[ ind ]); - max_pos = ind; - } - - return arr[ max_pos ]; - } - - Node *build_r( Point_ptr * arr, int left, int right, - int d ) - { - int num, pos, next_d; - Node * n; - - num = right - left + 1; - - if ( num < 1) - return NULL; - - // if the list contains only one point, - // construct a leaf for this node - if ( num == 1) { - //n = new node; - n = malloc_node(); - n->pnt = arr[ left ]; - - return n; - } - - // else divide space into two regions in - // dim-dim and cotinue recursively - pos = (left + right) / 2; - split_arr( arr, left, right, pos, d ); - - Point * p_median = get_max_element( arr, left, pos, d ); - - // create division plane; - Plane plane( d, *p_median ); - //n = new node; - // CGAL_assertion( n != NULL ); - n = malloc_node(); - - n->plane = plane; - - next_d = d + 1; - if ( next_d >= dim ) - next_d = 0; - - // build left sub-tree - n->left = build_r( arr, left, pos, next_d ); - - // build right sub-tree - n->right = build_r( arr, pos + 1, right, next_d ); - - return n; - } - -public: - typedef list list_points; - - Kdtree_d(int k = 2) - { - dim = k; - root = NULL; - p_arr_pt = NULL; - p_node_arr = NULL; - } - - ~Kdtree_d() - { - delete_all(); - } - - - bool is_valid( bool verbose = false, int level = 0 ) const - { - (void)verbose; - (void)level; - - if ( root == NULL ) - return true; - - return root->is_valid(); - } - - - void dump() - { - root->dump( 0); - } - - void delete_all() - { - root = NULL; - - if ( p_arr_pt != NULL ) - delete[] p_arr_pt; - p_arr_pt = NULL; - if ( p_node_arr != NULL ) - delete[] p_node_arr; - p_node_arr = NULL; - } - - void search( std::back_insert_iterator result, - Box & rect ) - { - if (root == NULL) - return; // it is an empty tree - nothing to search in - - Box region = Box( dim ); - - root->search( result, rect, region ); - } - - void build(list &l) - { - int i; - Point_ptr * p_arr; - - size = l.size(); - p_arr_pt = new Point[ size ]; - CGAL_assertion( p_arr_pt != NULL ); - - p_arr = new Point_ptr[ size ]; - CGAL_assertion( p_arr != NULL ); - - p_node_arr = new Node[ 2 * size ]; - CGAL_assertion( p_node_arr != NULL ); - - node_count = 0; - - /* fill the array */ - i = 0; - for ( typename std::list::iterator j = l.begin(); - j != l.end(); - j++ ) - { - p_arr_pt[ i ] = (*j); - p_arr[ i ] = p_arr_pt + i; - i++; - } - - // recursively build the tree from the sorted list - // starting to divide it in coordinate 0 - root = build_r( p_arr, 0, size - 1, 0 ); - - //printf( "b\n" ); - delete[] p_arr; - } -}; - - -} //namespace CGAL - -#endif /* CGAL_KDTREE_D_H */ diff --git a/kdtree/package_info/kdtree/copyright b/kdtree/package_info/kdtree/copyright deleted file mode 100644 index 930771b9d2c..00000000000 --- a/kdtree/package_info/kdtree/copyright +++ /dev/null @@ -1 +0,0 @@ -Tel-Aviv University (Israel). diff --git a/kdtree/package_info/kdtree/description.txt b/kdtree/package_info/kdtree/description.txt deleted file mode 100644 index 12bb7366575..00000000000 --- a/kdtree/package_info/kdtree/description.txt +++ /dev/null @@ -1 +0,0 @@ -The KD-tree implementation . diff --git a/kdtree/package_info/kdtree/license.txt b/kdtree/package_info/kdtree/license.txt deleted file mode 100644 index 8bb8efcb72b..00000000000 --- a/kdtree/package_info/kdtree/license.txt +++ /dev/null @@ -1 +0,0 @@ -GPL (v3 or later) diff --git a/kdtree/package_info/kdtree/long_description.txt b/kdtree/package_info/kdtree/long_description.txt deleted file mode 100644 index efdd3de5314..00000000000 --- a/kdtree/package_info/kdtree/long_description.txt +++ /dev/null @@ -1,11 +0,0 @@ -CGAL KD-tree impelementation ----------------------------- - - The following contains the CGAL KD-tree implementation. The examples/kdtrees/ -directory contains three simple examples for the use of kd-trees in 2D, 3D -(using points from the Cgal kernel) and 4D (using user-defined points). - - The source is under include/CGAL/kdtree_d.h, and it can be used -independently from the rest of CGAL. - ------------------------------------------------------------------------ diff --git a/kdtree/package_info/kdtree/maintainer b/kdtree/package_info/kdtree/maintainer deleted file mode 100644 index 7e028c78627..00000000000 --- a/kdtree/package_info/kdtree/maintainer +++ /dev/null @@ -1 +0,0 @@ -cgal-develop