$include_dir="/home/hyper-archives/boost-commit/include"; include("$include_dir/msg-header.inc") ?>
Subject: [Boost-commit] svn:boost r76548 - in trunk: boost/geometry/extensions/strategies libs/geometry/test_extensions/algorithms/buffer
From: barend.gehrels_at_[hidden]
Date: 2012-01-16 17:13:31
Author: barendgehrels
Date: 2012-01-16 17:13:22 EST (Mon, 16 Jan 2012)
New Revision: 76548
URL: http://svn.boost.org/trac/boost/changeset/76548
Log:
Small update for buffer (essentially removed the define which caused an incorrect bufferline)
Text files modified: 
   trunk/boost/geometry/extensions/strategies/buffer.hpp                 |    20 ++++----                                
   trunk/libs/geometry/test_extensions/algorithms/buffer/test_buffer.hpp |    89 ++++++++++++++++++++++++++------------- 
   2 files changed, 69 insertions(+), 40 deletions(-)
Modified: trunk/boost/geometry/extensions/strategies/buffer.hpp
==============================================================================
--- trunk/boost/geometry/extensions/strategies/buffer.hpp	(original)
+++ trunk/boost/geometry/extensions/strategies/buffer.hpp	2012-01-16 17:13:22 EST (Mon, 16 Jan 2012)
@@ -25,7 +25,9 @@
 #include <boost/geometry/extensions/strategies/buffer_side.hpp>
 
 
-#define BOOST_GEOMETRY_BUFFER_NO_HELPER_POINTS
+// This should NOT be defined, it omits essential points in concavities.
+// Code is commented now
+// #define BOOST_GEOMETRY_BUFFER_NO_HELPER_POINTS
 
 
 namespace boost { namespace geometry
@@ -136,11 +138,11 @@
         if (side::apply(perp1, ip, perp2) == signum)
         {
 
-#ifdef BOOST_GEOMETRY_BUFFER_NO_HELPER_POINTS
+//#ifdef BOOST_GEOMETRY_BUFFER_NO_HELPER_POINTS
             // Because perp1 crosses perp2 at IP, it is not necessary to
             // include IP
-            buffered.push_back(ip);
-#else
+            //buffered.push_back(ip);
+//#else
             // If it is concave (corner to left), add helperline
             // The helper-line IS essential for buffering holes. Without,
             // holes might be generated, while they should NOT be there.
@@ -148,7 +150,7 @@
             // We might consider to make it optional (because more efficient)
             buffered.push_back(perp1);
             buffered.push_back(perp2);
-#endif
+//#endif
         }
         else
         {
@@ -312,13 +314,13 @@
 
         if (side::apply(perp1, ip, perp2) == signum)
         {
-#ifdef BOOST_GEOMETRY_BUFFER_NO_HELPER_POINTS
-            buffered.push_back(ip);
-#else
+//#ifdef BOOST_GEOMETRY_BUFFER_NO_HELPER_POINTS
+//            buffered.push_back(ip);
+//#else
             // If it is concave (corner to left), add helperline
             buffered.push_back(perp1);
             buffered.push_back(perp2);
-#endif
+//#endif
         }
         else
         {
Modified: trunk/libs/geometry/test_extensions/algorithms/buffer/test_buffer.hpp
==============================================================================
--- trunk/libs/geometry/test_extensions/algorithms/buffer/test_buffer.hpp	(original)
+++ trunk/libs/geometry/test_extensions/algorithms/buffer/test_buffer.hpp	2012-01-16 17:13:22 EST (Mon, 16 Jan 2012)
@@ -10,6 +10,7 @@
 #ifndef BOOST_GEOMETRY_TEST_BUFFER_HPP
 #define BOOST_GEOMETRY_TEST_BUFFER_HPP
 
+#define BOOST_GEOMETRY_DEBUG_WITH_MAPPER
 #define TEST_WITH_SVG
 
 #include <fstream>
@@ -73,7 +74,7 @@
 
     BOOST_FOREACH(turn_info const& turn, turns)
     {
-        mapper.map(turn.point, "fill:rgb(255,128,0);stroke:rgb(0,0,100);stroke-width:1");
+        mapper.map(turn.point, "fill:rgb(255,128,0);stroke:rgb(0,0,100);stroke-width:1", 3);
     }
 }
 
@@ -103,6 +104,33 @@
 
     typedef typename bg::ring_type<GeometryOut>::type ring_type;
 
+    std::ostringstream filename;
+    filename << "buffer_"
+        << (bg::geometry_id<Geometry>::value == 2 ? "line" : "poly") << "_"
+        << caseid << "_"
+        << string_from_type<coordinate_type>::name()
+        << "_" << join
+        << ".svg";
+
+    std::ofstream svg(filename.str().c_str());
+
+    bg::svg_mapper<point_type> mapper(svg, 500, 500);
+
+    {
+        bg::model::box<point_type> box;
+        bg::envelope(geometry, box);
+        double d = distance_left;
+        if (distance_right > 0)
+        {
+            d += distance_right;
+        }
+
+        bg::buffer(box, box, d * 1.1);
+        mapper.add(box);
+    }
+
+
+
     typedef JoinStrategy
         <
             point_type,
@@ -110,8 +138,13 @@
 #ifdef BOOST_GEOMETRY_DEBUG_WITH_MAPPER
             , bg::svg_mapper<point_type>
 #endif
-        > join_strategy;
+        > join_strategy_type;
 
+#ifdef BOOST_GEOMETRY_DEBUG_WITH_MAPPER
+    join_strategy_type join_strategy(mapper);
+#else
+    join_strategy_type join_strategy;
+#endif
 
 
     std::vector<GeometryOut> buffered;
@@ -121,8 +154,14 @@
         GeometryOut buffered_step1;
         bg::detail::buffer::polygon_buffer
             <
-                Geometry, GeometryOut, join_strategy
-            >::apply(geometry, buffered_step1, distance_left, join_strategy());
+                Geometry, GeometryOut, join_strategy_type
+            >::apply(geometry, buffered_step1, 
+                            distance_left, 
+                            join_strategy
+#ifdef BOOST_GEOMETRY_DEBUG_WITH_MAPPER
+                            , mapper
+#endif
+                                    );
         buffered.push_back(buffered_step1);
     }
 #else
@@ -137,8 +176,14 @@
 
         bg::detail::buffer::linestring_buffer
             <
-                Geometry, GeometryOut, distance, join_strategy
-            >::apply(geometry, inserter, distance(distance_left, distance_left / 2.0), join_strategy());
+                Geometry, GeometryOut, distance, join_strategy_type
+            >::apply(geometry, inserter, 
+                            distance(distance_left, distance_left / 2.0), 
+                            join_strategy
+#ifdef BOOST_GEOMETRY_DEBUG_WITH_MAPPER
+                            , mapper
+#endif
+                                    );
     }
 #endif
 
@@ -150,36 +195,18 @@
     //    std::cout << bg::wkt(polygon) << std::endl;
     //}
 
-    {
-        std::ostringstream filename;
-        filename << "buffer_"
-            << (bg::geometry_id<Geometry>::value == 2 ? "line" : "poly") << "_"
-            << caseid << "_"
-            << string_from_type<coordinate_type>::name()
-            << "_" << join
-            << ".svg";
-
-        std::ofstream svg(filename.str().c_str());
-
-        bg::svg_mapper<point_type> mapper(svg, 500, 500);
-
-        BOOST_FOREACH(GeometryOut const& polygon, buffered)
-        {
-            mapper.add(polygon);
-        }
 
-        // Map input geometry in green
-        mapper.map(geometry, "opacity:0.5;fill:rgb(0,128,0);stroke:rgb(0,128,0);stroke-width:1");
+    // Map input geometry in green
+    mapper.map(geometry, "opacity:0.5;fill:rgb(0,128,0);stroke:rgb(0,128,0);stroke-width:1");
 
-        BOOST_FOREACH(GeometryOut const& polygon, buffered)
-        {
-            mapper.map(polygon, "opacity:0.8;fill:none;stroke:rgb(0,0,0);stroke-width:2");
-            post_map(polygon, mapper);
-        }
+    BOOST_FOREACH(GeometryOut const& polygon, buffered)
+    {
+        mapper.map(polygon, "opacity:0.8;fill:none;stroke:rgb(0,0,0);stroke-width:2");
+        post_map(polygon, mapper);
     }
-
 }
 
+
 #ifdef BOOST_GEOMETRY_CHECK_WITH_POSTGIS
 static int counter = 0;
 #endif