Boost logo

Boost Users :

Subject: [Boost-users] [Graph] Issue with is_straight_line_drawing?
From: David Gleich (dgleich_at_[hidden])
Date: 2008-10-02 15:00:38


Hi,

I'm concerned about the output I'm getting from the
is_straight_line_drawing function in the Boost Graph library. My
understanding was that it should report true when the graph and
positions are a planar embedding (no edge crossings).

Based on this understanding, I thought the code listed at the end of
the message should say that the drawing for a clique on 4 vertices,
with positions on a square, is not planar (see the picture below).
This arrangement has one edge crossing. The function outputs that the
graph is a plane drawing.

Did I misunderstand what the is_straight_line_drawing function is
supposed to do?

Thanks,
David Gleich

#include <iostream>
#include <boost/graph/adjacency_list.hpp>
#include <boost/graph/properties.hpp>
#include <boost/graph/graph_traits.hpp>
#include <boost/property_map.hpp>
#include <vector>

#include <boost/graph/is_straight_line_drawing.hpp>

using namespace boost;

//a class to hold the coordinates of the straight line embedding
struct coord_t {
 std::size_t x;
 std::size_t y;
};

int main(int argc, char** argv) {
 typedef adjacency_list
   < vecS, vecS, undirectedS, property<vertex_index_t, int> > graph;

 graph g(4); // make the clique on 4 vertices
 add_edge(0,1,g); add_edge(0,2,g); add_edge(0,3,g);
 add_edge(1,2,g); add_edge(1,3,g); add_edge(2,3,g);

 //Set up a property map to hold the mapping from vertices to coord_t's
 typedef std::vector< coord_t > straight_line_drawing_storage_t;
 typedef boost::iterator_property_map
   < straight_line_drawing_storage_t::iterator,
     property_map<graph, vertex_index_t>::type
>
   straight_line_drawing_t;

 straight_line_drawing_storage_t straight_line_drawing_storage
   (num_vertices(g));
 straight_line_drawing_t straight_line_drawing
   (straight_line_drawing_storage.begin(),
    get(vertex_index,g)
    );
 /*
  should be
      0
    / | \
   3--|--1
    \ | /
      2
  which is not a plane drawing.
 */
 straight_line_drawing[0].x = 1; straight_line_drawing[0].y = 2;
 straight_line_drawing[1].x = 2; straight_line_drawing[1].y = 1;
 straight_line_drawing[2].x = 1; straight_line_drawing[2].y = 0;
 straight_line_drawing[3].x = 0; straight_line_drawing[3].y = 1;

 if (is_straight_line_drawing(g, straight_line_drawing))
   std::cout << "Is a plane drawing." << std::endl;
 else
   std::cout << "Is not a plane drawing." << std::endl;

 return 0;
}

/* Compiling and example
$ g++ -v
Using built-in specs.
Target: x86_64-linux-gnu
Configured with: ../src/configure -v
--enable-languages=c,c++,fortran,objc,obj-c++,treelang --prefix=/usr
--enable-shared --with-system-zlib --libexecdir=/usr/lib
--without-included-gettext --enable-threads=posix --enable-nls
--with-gxx-include-dir=/usr/include/c++/4.2 --program-suffix=-4.2
--enable-clocale=gnu --enable-libstdcxx-debug --enable-objc-gc
--enable-mpfr --enable-checking=release --build=x86_64-linux-gnu
--host=x86_64-linux-gnu --target=x86_64-linux-gnu
Thread model: posix
gcc version 4.2.3 (Ubuntu 4.2.3-2ubuntu7)

$g++ is_straight_line_drawing.cpp -I/home/dgleich/dev/lib/boost_1_36_0/
$./a.out
Is a plane drawing.

Should be

Is not a plane drawing.
 */


Boost-users list run by williamkempf at hotmail.com, kalb at libertysoft.com, bjorn.karlsson at readsoft.com, gregod at cs.rpi.edu, wekempf at cox.net