point_set.h
上传用户:gzelex
上传日期:2007-01-07
资源大小:707k
文件大小:5k
开发平台:

MultiPlatform

  1. /*******************************************************************************
  2. +
  3. +  LEDA-R  3.2.3
  4. +
  5. +  point_set.h
  6. +
  7. +  Copyright (c) 1995  by  Max-Planck-Institut fuer Informatik
  8. +  Im Stadtwald, 66123 Saarbruecken, Germany     
  9. +  All rights reserved.
  10. *******************************************************************************/
  11. #ifndef LEDA_POINT_SET_H
  12. #define LEDA_POINT_SET_H
  13. #include <LEDA/point.h>
  14. #include <LEDA/impl/delaunay_tree.h>
  15. typedef DT_item       ps_item;
  16. class Point_Set : public delaunay_tree {
  17. void* ptr;  // d2_dictionary(double,double,DT_item)*
  18. public:
  19.  Point_Set();
  20. ~Point_Set();
  21. ps_item       lookup(point);
  22. list<ps_item> range_search(double, double, double, double);
  23.  
  24. list<point>  all_points();
  25. ps_item      insert(point p, void* i);
  26. ps_item      nearest_neighbor(point p){ return delaunay_tree::neighbor(p); }
  27. void         change_inf(ps_item it, void* i) { delaunay_tree::change_inf(it,i);}
  28. void         del(point);
  29. void         del_item(ps_item it) { del(key(it)); }
  30. list<ps_item> all_items();
  31. list<ps_item> convex_hull();
  32. void          clear();
  33. int           size();
  34. bool          empty()   { return (size()==0) ? true:false; }
  35. };
  36. /*{Manpage {point_set} {I} {Sets of Two-Dimensional Points}}*/ 
  37. template<class I>
  38. class point_set : public Point_Set {
  39. /*{Mdefinition
  40. An instance $S$ of the parameterized data type name is a collection
  41. of items ($ps_item$). Every item in $S$ contains a two-dimensional point as
  42. key (data type $point$), and an information from data type $I$, called the 
  43. information type of $S$. The number of items in $S$ is called the size of $S$. 
  44. A point set of size zero is said to be empty. We use $<p,i>$ to denote the
  45. item with point $p$, and information $i$. For each  point $p$ there is at most
  46. one item $<p,i> in S$. Beside the normal dictionary operations, the data
  47. type $point_set$ provides operations for rectangular range queries and
  48. nearest neighbor queries.}*/
  49. void clear_inf(GenPtr& x) { LEDA_CLEAR(I,x); }
  50. void copy_inf(GenPtr& x)  { LEDA_COPY(I,x);  }
  51. public:
  52. /*{Mcreation S }*/
  53.  point_set()   {}
  54. /*{Mcreate creates an instance var of type name and initializes var to 
  55.             the empty set.}*/
  56. ~point_set()   { clear(); }
  57. /*{Moperations 2.5 5}*/
  58. point key(ps_item it) {return Point_Set::key(it);}
  59. /*{Mop     returns the point of item $it$.\
  60.             precond $it$ is an item in var.}*/
  61. I   inf(ps_item it)          { return LEDA_ACCESS(I,Point_Set::inf(it)); }
  62. /*{Mop     returns the information of item $it$.\
  63.     precond $it$ is an item in var.}*/
  64. ps_item insert(point p, I i) { return Point_Set::insert(p,Convert(i));}
  65. /*{Mop    associates the information $i$ with point $p$. 
  66.    If there is an item $<p,j>$ in var then $j$ 
  67.    is replaced by $i$, else a new item $<p,i>$ 
  68.    is added to $S$. In both cases the item is 
  69.    returned.}*/
  70. ps_item lookup(point p) {return Point_Set::lookup(p);}
  71. /*{Mop    returns the item with point $p$ (nil if no 
  72.    such item exists in var).}*/
  73. ps_item nearest_neighbor(point q) {return Point_Set::nearest_neighbor(q);}
  74. /*{Mop    returns the item $<p,i> in S$ such that 
  75.    the distance between $p$ and $q$ is minimal.}*/
  76. list<ps_item> range_search(double x0, double x1, double y0, double y1)
  77. { return Point_Set::range_search(x0,x1,y0,y1);}
  78. /*{Mopl   returns all items $<p,i> in S$ with\
  79.    $x_0 le p$.xcoord() $le x_1$ and\
  80.    $y_0 le p$.ycoord() $le y_1$.}*/
  81. list<ps_item> convex_hull() {return Point_Set::convex_hull();}
  82. /*{Mop    returns the list of items containing all points 
  83.    of the convex hull of var in clockwise order.}*/
  84. void del(point p) {Point_Set::del(p);}
  85. /*{Mop    deletes the item with point $p$ from var.}*/
  86. void del_item(ps_item it) {Point_Set::del_item(it);}
  87. /*{Mop    removes item $it$ from var.\
  88.            precond $it$ is an item in var.}*/
  89. void    change_inf(ps_item it, I i) { Point_Set::change_inf(it,Convert(i));}
  90. /*{Mop    makes $i$ the information of item $it$.\
  91.    precond $it$ is an item in var.}*/
  92. list<ps_item> all_items() {return Point_Set::all_items();}
  93. /*{Mop    returns the list of all items in $S$.}*/ 
  94. list<point> all_points() {return Point_Set::all_points();}
  95. /*{Mop    returns the list of all points in $S$.}*/ 
  96. void clear() {Point_Set::clear();}
  97. /*{Mop    makes var the empty point_set.}*/
  98. bool empty() {return Point_Set::empty();}
  99. /*{Mop    returns true iff var is empty.}*/
  100. int size() {return Point_Set::size();}
  101. /*{Mop    returns the size of var.}*/
  102. };
  103. #define forall_ps_items(i,D) forall(i, (D.all_items()) )
  104. /*{Mimplementation
  105. Point sets are implemented by a combination of two-dimensional range trees
  106. cite{Wi85,Lu78} and Voronoi diagrams.  Operations insert, lookup, del_item, 
  107. del take time $O(log^2 n)$, key, inf, empty, size, change_inf take time 
  108. $O(1)$, and clear takes time $O(nlog n)$. A range_search operation takes time
  109. $O(k+log^2 n)$, where $k$ is the size of the returned list. A nearest_neighbor
  110. query takes time $O(n^2)$, if it follows any update operation (insert or
  111. delete) and $O(log n)$ otherwise. Here $n$ is the current size of the 
  112. point set. The space requirement is $O(n^2)$.}*/
  113. #endif