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

MultiPlatform

  1. /*******************************************************************************
  2. +
  3. +  LEDA-R  3.2.3
  4. +
  5. +  planar_map.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_PLANAR_MAP_H
  12. #define LEDA_PLANAR_MAP_H
  13. #include <LEDA/graph.h>
  14. class face_struct;
  15. typedef face_struct* face;
  16. class face_struct {
  17. friend class planar_map;
  18.  edge      head;     // first edge of face
  19.  list_item loc;      // location in F_list
  20.  GenPtr    inf;      // user defined information
  21.  planar_map*  g;     // face of (*g)
  22.  face_struct(GenPtr x, planar_map* G) 
  23.  { 
  24.    inf = x ; 
  25.    head = nil; 
  26.    loc = nil; 
  27.    g = G;
  28.   }
  29.   LEDA_MEMORY(face_struct)
  30. friend planar_map* graph_of(face f) { return f->g; }
  31. };
  32. extern int STRAIGHT_LINE_EMBEDDING(graph& G, node_array<int>& xcoord,
  33.                                             node_array<int>& ycoord);
  34. /*{Manpage {planar_map} {} {Planar Maps} }*/
  35. class planar_map : public graph {
  36. /*{Mdefinition
  37.     An instance $M$ of the data type $planar_map$ is the combinatorial
  38.     embedding of a planar graph, i.e., $M$ is bidirected (for every edge
  39.     $(v,w)$ of $M$ the reverse edge $(w,v)$ is also in $M$) and  
  40.     there is a planar embedding of $M$ such that for every node $v$ the 
  41.     ordering of the edges in the adjacency list of $v$ corresponds to the 
  42.     counter-clockwise ordering of these edges around $v$ in the embedding.
  43.     Planar maps make use of the item type $face$ in addition to nodes and
  44.     edges.
  45. }*/
  46. list<face>       F_list;
  47. face  new_face(GenPtr i=0);
  48. void  del_face(face f) { F_list.del(f->loc); delete f; }
  49. face& FACE(edge e) { return (face&)(e->data[0]);  }
  50. virtual void copy_face_entry(GenPtr&)  const {}
  51. virtual void init_face_entry(GenPtr&)        {}
  52. virtual void clear_face_entry(GenPtr&) const {}
  53. /* inherited from graph:
  54. virtual void copy_node_entry(GenPtr&)  const {}
  55. virtual void init_node_entry(GenPtr&)        {}
  56. virtual void clear_node_entry(GenPtr&) const {}
  57. */
  58. virtual void print_face_entry(GenPtr&) const {}
  59. protected:
  60. GenPtr& entry(face f)         { return f->inf; }
  61. GenPtr& entry(node v)         { return graph::entry(v); }
  62. GenPtr  inf(face f)     const { return f->inf; }
  63. GenPtr  inf(node v)     const { return graph::inf(v); }
  64. void       clear();
  65. void       init_entries();
  66. public:
  67. /*{Mcreation M }*/
  68. planar_map() {} 
  69. planar_map(const graph& G);
  70. /*{Mcreate creates an instance $M$ of type $planar_map$ and initializes it to
  71.     the planar map represented by the directed graph $G$.\
  72.     precond $G$
  73.     represents a bidirected planar map, i.e. for every edge $(v,w)$ in $G$
  74.     the reverse edge $(w,v)$ is also in $G$ and there is a planar embedding
  75.     of $G$ such that for every node $v$ the ordering of the edges in the
  76.     adjacency list of $v$ corresponds to the counter-clockwise ordering of
  77.     these edges around $v$ in the embedding.}*/
  78. virtual ~planar_map() { clear(); }
  79. /*{Moperations 2 4.6}*/
  80. const list<face>& all_faces()       const { return F_list; }
  81. /*
  82. list<face> all_faces();
  83. */
  84. /*{Mop      returns the list of all faces of var.}*/
  85. list<face> adj_faces(node v)   const;
  86. /*{Mop      returns the list of all faces of var adjacent
  87.      to node $v$ in counter-clockwise order.}*/
  88. face       adj_face(edge e)  const { return face(e->data[0]); }
  89. /*{Mop      returns the face of var to the right of $e$.}*/
  90. list<node> adj_nodes(face f)   const;
  91. /*{Mop      returns the list of all nodes of var adjacent
  92.              to face $f$ in clockwise order.}*/
  93. list<node> adj_nodes(node v) const { return graph::adj_nodes(v); }
  94. list<edge> adj_edges(face)   const;
  95. /*{Mop      returns the list of all edges of var bounding
  96.      face $f$ in clockwise order.}*/
  97. list<edge> adj_edges(node v) const { return graph::adj_edges(v); }
  98. edge reverse(edge e)         const { return edge(e->rev); }
  99. /*{Mop      returns the reversal of edge $e$ in var. }*/
  100. edge first_face_edge(face f) const { return f->head; }
  101. /*{Mop      returns the first edge of face $f$ in var. }*/
  102. edge succ_face_edge(edge e)  const { return cyclic_adj_succ(reverse(e)); } 
  103. /*{Mop      returns the successor edge of $e$ in face $M$.adj_face($e$)
  104.      i.e., the next edge in clockwise order.}*/
  105. edge pred_face_edge(edge e)  const { return reverse(cyclic_adj_pred(e)); } 
  106. /*{Mop      returns the predecessor edge of $e$ in face $f$, 
  107.              i.e., the next edge in counter-clockwise order.}*/
  108. edge next_face_edge(edge e)  const  
  109. { e = succ_face_edge(e);
  110.   return (e==adj_face(e)->head) ? nil : e;
  111. }
  112. face first_face() const { return F_list.head(); }
  113. face next_face(face f) const
  114. { list_item it = F_list.succ(f->loc);
  115.   return (it) ? F_list.contents(it) : nil;
  116. }
  117. edge    new_edge(edge e1, edge e2, GenPtr);
  118. edge    new_edge(edge e1, edge e2) { return new_edge(e1,e2,0); }
  119. /*{Mopl    inserts the edge $e=(source(e_1),source(e_2))$
  120.     and its reversal into $M$ and returns $e$.\
  121.             precond $e_1$ and $e_2$ are bounding the same face $F$.
  122.     The operation splits $F$ into two new faces. }*/
  123. void    del_edge(edge,GenPtr);
  124. void    del_edge(edge e) { del_edge(e,0); }
  125. /*{Mop     deletes the edge $e$ from var. The two faces
  126.     adjacent to $e$ are united to one face.}*/
  127. edge    split_edge(edge,GenPtr);
  128. edge    split_edge(edge e) { return split_edge(e,0); } 
  129. /*{Mop     splits edge $e=(v,w)$ and its reversal $r=(w,v)$
  130.     into edges $(v,u)$, $(u,w)$, $(w,u)$, and $(u,v)$.
  131.     Returns the edge $(u,w)$. }*/
  132. node    new_node(const list<edge>&, GenPtr);
  133. node    new_node(const list<edge>& el) { return new_node(el,0); }
  134. /*{Mop     splits the face bounded by the edges in $el$ by
  135.     inserting a new node $u$ and connecting it to all
  136.     source nodes of edges in $el$.\ precond
  137.     all edges in $el$ bound the same face.}*/
  138. node    new_node(face, GenPtr);
  139. node    new_node(face f) { return new_node(f,0); }
  140. /*{Mop     splits face $f$ into triangles by inserting a new
  141.     node $u$ and connecting it to all nodes of $f$.
  142.     Returns $u$.}*/
  143. list<edge> triangulate();
  144. /*{Mop     triangulates all faces of var by inserting new
  145.     edges. The list of inserted edges is returned.}*/
  146. int     straight_line_embedding(node_array<int>& x, node_array<int>& y)
  147.                               { return STRAIGHT_LINE_EMBEDDING(*this,x,y); }
  148. /*{Mopl    computes a straight line embedding for $M$ with
  149.     integer coordinates ($x[v]$, $y[v]$) in the
  150.     range $0dots 2(n-1)$ for every node $v$ of $M$,
  151.     and returns the maximal used coordinate. }*/
  152. };
  153. #define forall_face_edges(e,F)
  154. for(e=graph_of(F)->first_face_edge(F); e; e=graph_of(F)->next_face_edge(e))
  155. #define forall_faces(f,G)
  156. for(f=G.first_face(); f; f=G.next_face(f))
  157. #define forall_adj_faces(f,v)
  158. if (0);else 
  159. for(edge forall_af_e=graph_of(v)->first_adj_edge(v);
  160. forall_af_e && (f = ((planar_map*)graph_of(v))->adj_face(forall_af_e));
  161. forall_af_e=graph_of(v)->adj_succ(forall_af_e))
  162. /*{Mtext
  163. bigskip
  164. {bf Iteration}
  165. {bf forall_faces}($f,M$)
  166. ${$ ``the faces of $M$ are successively assigned to $f$" $}$
  167. {bf forall_face_edges}($e,f$) \
  168. phantom{{bf forall_faces}($f,M$)}
  169. ${$ ``the edges of face $f$ are successively assigned to $e$" $}$
  170. {bf forall_adj_faces}($f,v$) \
  171. phantom{{bf forall_faces}($f,M$)}
  172. ${$ ``the faces adjacent to node $v$ are successively assigned to $f$" $}$ }*/
  173. /*{Mimplementation
  174. Planar maps are implemented by parameterized directed graphs.
  175. All operations take constant time, except for new_edge and del_edge
  176. which take time $O(f)$ where $f$ is the number of edges in the created
  177. faces and triangulate and straight_line_embedding which take time $O(n)$
  178. where $n$ is the current size (number of edges) of the planar map. }*/
  179. //------------------------------------------------------------------------------
  180. // PLANAR_MAP: generic planar map
  181. //------------------------------------------------------------------------------
  182. /*{Mtext
  183. newpage
  184. }*/
  185. /*{Manpage {PLANAR_MAP} {vtype,ftype} {Parameterized Planar Maps}}*/
  186. template <class vtype, class ftype>
  187. class PLANAR_MAP : public planar_map {
  188. /*{Mdefinition
  189. A parameterized planar map $M$ is a planar map whose nodes and faces
  190. contain additional (user defined) data. Every node  contains
  191. an element of a data type $vtype$, called the node type of $M$ and every
  192. face contains an element of a data type $ftype$ called the face type of
  193. $M$. All operations of the data type $planar_map$ are also defined for
  194. instances of any parameterized planar_map type. For parameterized
  195. planar maps there are additional operations to access or update
  196. the node and face entries.}*/
  197. void init_node_entry(GenPtr& x)  { LEDA_CREATE(vtype,x); }
  198. void init_face_entry(GenPtr& x)  { LEDA_CREATE(ftype,x); }
  199. void copy_node_entry(GenPtr& x)  const { LEDA_COPY(vtype,x); }
  200. void copy_face_entry(GenPtr& x)  const { LEDA_COPY(ftype,x); }
  201. void clear_node_entry(GenPtr& x) const { LEDA_CLEAR(vtype,x); }
  202. void clear_face_entry(GenPtr& x) const { LEDA_CLEAR(ftype,x); }
  203. void print_node_entry(ostream& o, GenPtr& x)  const
  204. { o << "("; LEDA_PRINT(vtype,x,o); o << ")"; }
  205. void print_edge_entry(ostream& o, GenPtr& x)  const
  206. { o << "(" << x << ")"; }
  207. public:
  208. /*{Mcreation M }*/
  209.    PLANAR_MAP() {}
  210.    PLANAR_MAP(const GRAPH<vtype,ftype>& G) : planar_map((graph&)G)   {}
  211. /*{Mcreate creates an instance var of type name and initializes it to
  212. the planar map represented by the parameterized directed graph $G$.
  213. The node entries of $G$ are copied into the corresponding nodes of $M$
  214. and every face $f$ of $M$ is assigned the information of one of its
  215. bounding edges in $G$.\
  216. precond $G$ represents a planar map. }*/
  217.   ~PLANAR_MAP() { clear(); }
  218. /*{Moperations 1.5 4.5 }*/
  219.    vtype  inf(node v) const   { return LEDA_ACCESS(vtype,planar_map::inf(v)); }
  220. /*{Mop      returns the information of node $v$.}*/
  221.    ftype  inf(face f) const   { return LEDA_ACCESS(ftype,planar_map::inf(f)); }
  222. /*{Mop      returns the information of face $f$.}*/
  223.    vtype& entry(node v) { return LEDA_ACCESS(vtype,planar_map::entry(v)); }
  224.    vtype& operator[] (node v)    { return entry(v); }
  225. /*{Marrop   returns a reference to the information of node $v$.}*/
  226.    ftype& entry(face f) { return LEDA_ACCESS(ftype,planar_map::entry(f)); }
  227.    ftype& operator[] (face f)    { return entry(f); }
  228. /*{Marrop   returns a reference to the information of face $f$.}*/
  229.    void   assign(node v, vtype x) { entry(v) = x; }
  230. /*{Mop      makes $x$ the information of node $v$.}*/
  231.    void   assign(face f, ftype x) { entry(f) = x; }
  232. /*{Mop      makes $x$ the information of face $f$.}*/
  233.    edge   new_edge(edge e1, edge e2)
  234.                           { return planar_map::new_edge(e1,e2,0); }
  235.    edge   new_edge(edge e1, edge e2, ftype y)
  236.                           { return planar_map::new_edge(e1,e2,Convert(y)); }
  237. /*{Mopl     inserts the edge $e=(source(e_1),source(e_2))$
  238.      and its reversal edge $e'$ into $M$.\
  239.      precond
  240.      $e_1$ and $e_2$ are bounding the same face $F$.
  241.      The operation splits $F$ into two new faces $f$,
  242.      adjacent to edge $e$ and $f'$, adjacent to edge
  243.      $e'$ with inf($f$) = inf ($F$) and inf($f'$) = $y$.}*/
  244.    edge   split_edge(edge e, vtype x)
  245.                           { return planar_map::split_edge(e,Convert(x)); }
  246. /*{Mopl    splits edge $e=(v,w)$ and its reversal $r=(w,v)$
  247.     into edges $(v,u)$, $(u,w)$, $(w,u)$, and $(u,v)$.
  248.             Assigns information $x$ to the created node $u$ and
  249.     returns the edge $(u,w)$. }*/
  250.    node   new_node(list<edge>& el, vtype x)
  251.                           { return planar_map::new_node(el,Convert(x)); }
  252. /*{Mopl    splits the face bounded by the edges in $el$ by
  253.     inserting a new node $u$ and connecting it to all
  254.     source nodes of edges in $el$. Assigns information $x$
  255.             to $u$ and returns $u$.\ 
  256.     precond all edges in $el$ bound 
  257.             the same face.}*/
  258.    node   new_node(face f, vtype x)
  259.                           { return planar_map::new_node(f,Convert(x)); }
  260. /*{Mopl      splits face $f$ into triangles by inserting a new
  261.               node $u$ with information $x$ and connecting it 
  262.       to all nodes of $f$. Returns $u$.}*/
  263.    void print_node(node v) const 
  264.    { cout << "["; Print(inf(v),cout); cout << "]";}
  265. };
  266. /*{Mimplementation
  267. Parameterized planar maps are derived from planar maps. All additional 
  268. operations for manipulating the node and edge contents take constant time.}*/
  269. #endif