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

MultiPlatform

  1. /*******************************************************************************
  2. +
  3. +  LEDA-R  3.2.3
  4. +
  5. +  segment_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_SEGMENT_SET_H
  12. #define LEDA_SEGMENT_SET_H
  13. #include <LEDA/impl/seg_tree.h>
  14. #include <LEDA/line.h>
  15. typedef seg_tree_item seg_item;
  16. typedef list<seg_item> list_seg_item_;
  17. //------------------------------------------------------------------------------
  18. // SegmentSet: a dictionary for line segments  with a fixed orientation
  19. //------------------------------------------------------------------------------
  20. class SegmentSet : public segment_tree<double,double,GenPtr> {
  21. double alpha;           // orientation given by an angle
  22. public:
  23.  
  24. segment  key(seg_item);
  25. seg_item insert(segment, GenPtr);
  26. seg_item lookup(segment);
  27. void     del(segment);
  28. list<seg_item>  intersection(segment);
  29. list<seg_item>  intersection(line);
  30.  
  31. void clear() { clear_tree(); }
  32.  SegmentSet(double a=0)  { alpha =a; }
  33. ~SegmentSet()  {}
  34. };
  35. #define forall_seg_items(i,S) forall_seg_tree_items(i,S)
  36. //------------------------------------------------------------------------------
  37. // class segment_set: generic SegmentSet
  38. //------------------------------------------------------------------------------
  39.  
  40. /*{Manpage {segment_set} {I} {Sets of Parallel Segments}}*/
  41. template<class I>
  42. class segment_set : public SegmentSet {
  43. /*{Mdefinition
  44.     An instance $S$ of the parameterized data type name is a 
  45.     collection of items ($seg_item$). Every item in $S$ contains as key a
  46.     line segment with a fixed direction $alpha$ (see data type segment) and
  47.     an information from data type $I$, called the information type of $S$.
  48.     $alpha$ is called the orientation of $S$. We use $<s,i>$ to denote the
  49.     item with segment $s$ and information $i$. For each segment $s$ there is
  50.     at most one item $<s,i> in S$.}*/
  51. public:
  52. /*{Mcreation S }*/
  53. segment_set(double a) : SegmentSet(a) {}
  54. /*{Mcreate creates an empty instance var of type name with orientation 
  55.             $a$. }*/
  56. segment_set() : SegmentSet(0) {}
  57. /*{Mcreate creates an empty instance var of type name with orientation 
  58.             zero, i.e., horizontal segments.}*/
  59.     
  60. ~segment_set()  {}
  61. /*{Moperations 2.7 4.5}*/
  62. segment key(seg_item it) {return SegmentSet::key(it);}
  63. /*{Mop   returns the segment of item $it$.\
  64.   precond $it$ is an item in var.}*/
  65. I inf(seg_item it)  { return LEDA_ACCESS(I,SegmentSet::inf(it));  }
  66. /*{Mop   returns the information of item $it$.\
  67.   precond $it$ is an item in var.}*/
  68. seg_item insert(segment s, I i)   { return SegmentSet::insert(s,Copy(i));}
  69. /*{Mop   associates the information $i$ with segment 
  70.   $s$. If there is an item $<s,j>$ in var  
  71.   then $j$ is replaced by $i$, else a new item
  72.   $<s,i>$ is added to $S$. In both cases the
  73.   item is returned.}*/
  74. seg_item lookup(segment s) {return SegmentSet::lookup(s);}
  75. /*{Mop   returns the item with segment $s$ (nil if no 
  76.   such item exists in var).}*/
  77. list<seg_item> intersection(segment q) {return SegmentSet::intersection(q);}
  78. /*{Mop   returns all items $<s,i> in S$ with 
  79.   $s cap q neq emptyset$.\
  80.   precond $q$ is 
  81.   orthogonal to the segments in var.}*/
  82. list<seg_item> intersection(line l) {return SegmentSet::intersection(l);}
  83. /*{Mop   returns all items $<s,i> in S$ with 
  84.   $s cap l neq emptyset$. precond $l$ is 
  85.   orthogonal to the segments in var.}*/
  86. void del(segment s) {SegmentSet::del(s);}
  87. /*{Mop   deletes the item with segment $s$ from var.}*/
  88. void del_item(seg_item it) {SegmentSet::del_item(it);}
  89. /*{Mop   removes item $it$ from var.\
  90.   precond $it$ is an item in var.}*/
  91. void  change_inf(seg_item it, I i) { SegmentSet::change_inf(it,Copy(i)); }
  92. /*{Mopl  makes $i$ the information of item $it$.\ 
  93.   precond $it$ is an item in var.}*/
  94. void clear() { SegmentSet::clear(); }
  95. /*{Mop   makes var the empty segment_set.}*/
  96. bool empty() {return SegmentSet::empty();}
  97. /*{Mop   returns true iff var is empty.}*/
  98. int size() {return SegmentSet::size();}
  99. /*{Mop   returns the size of var.}*/
  100. };
  101.  
  102. /*{Mimplementation
  103. Segment sets are implemented by dynamic segment trees based on BB[$alpha$]
  104. trees (cite{Wi85,Lu78}) trees. Operations key, inf, change_inf, empty, and 
  105. size take time $O(1)$, insert, lookup, del, and del_item take time 
  106. $O(log^2 n)$ and an intersection operation takes time $O(k + log^2 n)$, 
  107. where $k$ is the size of the returned list. Here $n$ is the current size of 
  108. the set. The space requirement is $O(nlog n)$.}*/
  109.  
  110. #endif