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 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(std::cout,"\n") );
- std::cout << std::endl;
-
- return 0;
-}
diff --git a/kdtree/include/CGAL/kdtree_d.h b/kdtree/include/CGAL/kdtree_d.h
deleted file mode 100644
index 11380e83a25..00000000000
--- a/kdtree/include/CGAL/kdtree_d.h
+++ /dev/null
@@ -1,1060 +0,0 @@
-// Copyright (c) 1997 Tel-Aviv University (Israel).
-// 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) : Sariel Har-Peled (sariel@math.tau.ac.il)
-// Eyal Flato (flato@math.tau.ac.il)
-
-#ifndef CGAL_KDTREE_D_H
-#define CGAL_KDTREE_D_H
-
-#include
-#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