| <html><head><!-- Copyright 2007 Aaron Windsor | |
| Distributed under the Boost Software License, Version 1.0. | |
| (See accompanying file LICENSE_1_0.txt or copy at | |
| http://www.boost.org/LICENSE_1_0.txt) | |
| --> | |
| <title>Planar Embedding Concept</title> | |
| </head> | |
| <body alink="#ff0000" | |
| bgcolor="#ffffff" | |
| link="#0000ee" | |
| text="#000000" | |
| vlink="#551a8b"> | |
| <img src="../../../boost.png" alt="C++ Boost" height="86" width="277"> | |
| <br clear=""> | |
| <h1>Planar Embedding Concept</h1> | |
| A planar embedding is an important intermediate representation of a drawing | |
| of a planar graph. Instead of specifying the absolute positions of the vertices | |
| and edges in the plane, a planar embedding specifies their positions relative | |
| to one another. A planar embedding consists of a sequence, for each vertex in | |
| the graph, of all of the edges incident on that vertex in the order in which | |
| they are to be drawn around that vertex. | |
| <p> | |
| A planar embedding is a refinement of | |
| <a href="../../property_map/doc/LvaluePropertyMap.html">LValuePropertyMap</a> that | |
| places additional restrictions the <tt>value_type</tt> used in the property | |
| map. | |
| </p><h3>Notation</h3> | |
| <table> | |
| <tbody> | |
| <tr> | |
| <td> <tt>Embedding</tt> </td> | |
| <td> is a type that models the Planar Embedding concept.</td> | |
| </tr> | |
| <tr> | |
| <td> <tt>embedding</tt> </td> | |
| <td> is an object of type <tt>Embedding</tt>. </td> | |
| </tr> | |
| <tr> | |
| <td> <tt>Graph</tt> </td> | |
| <td> is the type of the underlying graph.</td> | |
| </tr> | |
| <tr> | |
| <td> <tt>e</tt> </td> | |
| <td> is an object of type <tt>graph_traits<Graph>::edge_descriptor</tt>. | |
| </td> | |
| </tr> | |
| <tr> | |
| <td> <tt>v</tt> </td> | |
| <td> is an object of type <tt>graph_traits<Graph>::vertex_descriptor | |
| </tt>.</td> | |
| </tr><tr> | |
| <td> | |
| </td></tr></tbody></table> | |
| <h3>Associated Types</h3> | |
| <table border="1"> | |
| <tbody><tr> | |
| <td> Const Iterator </td> | |
| <td> <tt>boost::property_traits<Embedding>::value_type::const_iterator | |
| </tt> | |
| </td> | |
| <td> The iterator type used to iterate over the ordering of the edges in the | |
| planar embedding of a particular vertex | |
| </td> | |
| </tr> | |
| </tbody></table> | |
| <h3>Valid Expressions</h3> | |
| <p> | |
| <table border="1"> | |
| <tbody><tr><th>Expression</th><th>Return Type</th><th>Description</th> | |
| </tr><tr> | |
| <td> <tt>embedding[v].begin()</tt> </td> | |
| <td> <tt>boost::property_traits<Embedding>::value_type::const_iterator | |
| </tt></td> | |
| <td> Returns an iterator to the beginning of the range of edges in the | |
| embedding around vertex v</td> | |
| </tr> | |
| <tr> | |
| <td> <tt>embedding[v].end()</tt> </td> | |
| <td> <tt>boost::property_traits<Embedding>::value_type::const_iterator | |
| </tt></td> | |
| <td> Returns an iterator to the end of the range of edges in the | |
| embedding around vertex v</td> | |
| </tr> | |
| <tr> | |
| <td> <tt>embedding[v].clear()</tt> </td> | |
| <td> <tt>void</tt></td> | |
| <td> Clears all edges in the embedding around a vertex <tt>v</tt></td> | |
| </tr> | |
| <tr> | |
| <td> <tt>embedding[v].push_back(e)</tt> </td> | |
| <td> <tt>void</tt></td> | |
| <td> Adds an edge <tt>e</tt> to the end of the sequence of embedded edges | |
| around the vertex <tt>v</tt> </td> | |
| </tr> | |
| </tbody></table> | |
| </p><h3>Complexity Guarantees</h3> | |
| Starting with an empty embedding, any mixed sequence of <i>n</i> calls to a | |
| particular vertex's <tt>push_back</tt> and <tt>clear</tt> should take | |
| <i>O(n)</i> time. | |
| <h3>Models</h3> | |
| Any LValue property map that maps vertices to a <tt>std::vector</tt>, | |
| <tt>std::list</tt>, or <tt>std::deque</tt> models this | |
| concept. Below is an example of using this approach to create a model of | |
| PlanarEmbedding: | |
| <pre> | |
| #include <boost/property_map/property_map.hpp> | |
| #include <vector> | |
| ... | |
| // Assume a graph type "Graph" defined somewhere above and | |
| // an instance of Graph in a variable g. | |
| // A typedef for the storage - a vector of vectors of edge descriptors | |
| typedef | |
| std::vector< std::vector< graph_traits<Graph>::edge_descriptor > > | |
| planar_embedding_storage_t; | |
| // A typedef for the iterator property map, assuming the graph has | |
| // an interior vertex index map | |
| typedef | |
| boost::iterator_property_map< planar_embedding_storage_t::iterator, | |
| property_map<Graph, vertex_index_t>::type | |
| > | |
| planar_embedding_t; | |
| // Create an instance of the storage and the property map | |
| planar_embedding_storage_t planar_embedding_storage(num_vertices(g)); | |
| planar_embedding_t planar_embedding(planar_embedding_storage.begin(), | |
| get(vertex_index, g) | |
| ); | |
| // planar_embedding can now be passed to any function expecting a model | |
| // of PlanarEmbedding. | |
| </pre> | |
| <p> | |
| <br> | |
| </p><hr> | |
| Copyright © 2007 Aaron Windsor (<a href="mailto:aaron.windsor@gmail.com"> | |
| aaron.windsor@gmail.com</a>) | |
| </body></html> |