$include_dir="/home/hyper-archives/boost-commit/include"; include("$include_dir/msg-header.inc") ?>
Subject: [Boost-commit] svn:boost r76730 - in trunk: boost/geometry/extensions/algorithms/buffer libs/geometry/test_extensions/algorithms/buffer
From: barend.gehrels_at_[hidden]
Date: 2012-01-28 05:58:35
Author: barendgehrels
Date: 2012-01-28 05:58:33 EST (Sat, 28 Jan 2012)
New Revision: 76730
URL: http://svn.boost.org/trac/boost/changeset/76730
Log:
Buffer update - this solves indentation-case up to 0.6 and tests it
Text files modified: 
   trunk/boost/geometry/extensions/algorithms/buffer/buffer_appender.hpp    |    31 ++++++++++++++++++++++---------         
   trunk/libs/geometry/test_extensions/algorithms/buffer/polygon_buffer.cpp |    13 +++++++++----                           
   trunk/libs/geometry/test_extensions/algorithms/buffer/test_buffer.hpp    |    23 ++++++++++++++---------                 
   3 files changed, 45 insertions(+), 22 deletions(-)
Modified: trunk/boost/geometry/extensions/algorithms/buffer/buffer_appender.hpp
==============================================================================
--- trunk/boost/geometry/extensions/algorithms/buffer/buffer_appender.hpp	(original)
+++ trunk/boost/geometry/extensions/algorithms/buffer/buffer_appender.hpp	2012-01-28 05:58:33 EST (Sat, 28 Jan 2012)
@@ -84,8 +84,10 @@
 #endif
         }
 
+        cleanup();
+
         int index = do_append(point);
-        m_pieces.push_back(piece(index));
+        m_pieces.push_back(piece('J', index));
     }
 
     inline void append_end_join(point_type const& point)
@@ -122,11 +124,13 @@
 
     struct piece
     {
+        char type; // For DEBUG, this will either go or changed into enum
         int begin, end;
 
-        inline piece(int b = -1)
-            : begin(b)
-            , end(-1)
+        inline piece(char t = '\0', int b = -1, int e = -1)
+            : type(t)
+            , begin(b)
+            , end(e)
         {}
     };
 
@@ -145,7 +149,7 @@
 
     inline bool check(point_type const& point)
     {
-        for (std::deque<piece>::reverse_iterator rit 
+        for (std::deque<piece>::const_reverse_iterator rit 
                     = m_pieces.rbegin();
             rit != m_pieces.rend();
             ++rit)
@@ -163,7 +167,7 @@
         return false;
     }
 
-    inline bool calculate(point_type const& point, piece& the_piece)
+    inline bool calculate(point_type const& point, piece const& the_piece)
     {
         int const n = boost::size(m_range);
 
@@ -206,20 +210,29 @@
 
                 // Add this IP also as first point on the deque.
                 // We clear the deque - the indexes might be invalidated anyway
-                int index = do_append(is.intersections[0]);
+                int is_index = do_append(is.intersections[0]);
 
                 // For many the index of intersection point is OK, but
                 // for bowls >= 6 (see test-program) we need to intersect with the same segment again:
-                index = the_piece.begin;
+                int begin_index = the_piece.begin;
 
                 m_pieces.resize(0);
-                m_pieces.push_back(piece(index));
+                m_pieces.push_back(piece('F', begin_index, is_index));
+                m_pieces.push_back(piece('I', is_index));
 
                 return true;
             }
         }
         return false;
     }
+
+    void cleanup()
+    {
+        if (m_pieces.size() > 0 && m_pieces.back().end == -1)
+        {
+            m_pieces.resize(0);
+        }
+    }
 };
 
 
Modified: trunk/libs/geometry/test_extensions/algorithms/buffer/polygon_buffer.cpp
==============================================================================
--- trunk/libs/geometry/test_extensions/algorithms/buffer/polygon_buffer.cpp	(original)
+++ trunk/libs/geometry/test_extensions/algorithms/buffer/polygon_buffer.cpp	2012-01-28 05:58:33 EST (Sat, 28 Jan 2012)
@@ -61,10 +61,15 @@
     test_one<polygon_type, buf::join_miter, polygon_type>(true, "concave_simplex", concave_simplex, 'm', 14.47708, 0.5);
     test_one<polygon_type, buf::join_round, polygon_type>(true, "concave_simplex", concave_simplex, 'r', 13.10366, 0.5);
 
-    test_one<polygon_type, buf::join_miter, polygon_type>("indentation4", indentation, 'm', 25.7741125496954, 0.4);
-    test_one<polygon_type, buf::join_round, polygon_type>("indentation4", indentation, 'r', 25.5641980024698, 0.4);
-    test_one<polygon_type, buf::join_miter, polygon_type>("indentation5", indentation, 'm', 25.7741125496954, 0.5);
-    test_one<polygon_type, buf::join_round, polygon_type>("indentation5", indentation, 'r', 25.5641980024698, 0.5);
+    test_one<polygon_type, buf::join_miter, polygon_type>(true, "indentation4", indentation, 'm', 25.7741, 0.4);
+    test_one<polygon_type, buf::join_round, polygon_type>(true, "indentation4", indentation, 'r', 24.5695, 0.4);
+    test_one<polygon_type, buf::join_miter, polygon_type>(true, "indentation5", indentation, 'm', 28.2426, 0.5);
+    test_one<polygon_type, buf::join_round, polygon_type>(true, "indentation5", indentation, 'r', 26.7452, 0.5);
+    test_one<polygon_type, buf::join_miter, polygon_type>(true, "indentation6", indentation, 'm', 30.6712, 0.6);
+
+    // SQL Server gives 30.34479159164
+    test_one<polygon_type, buf::join_round, polygon_type>(true, "indentation6", indentation, 'r', 30.3445, 0.6);
+
     test_one<polygon_type, buf::join_miter, polygon_type>("indentation8", indentation, 'm', 35.594305909533, 0.8);
     test_one<polygon_type, buf::join_round, polygon_type>("indentation8", indentation, 'r', 35.0012686715019, 0.8);
     test_one<polygon_type, buf::join_miter, polygon_type>("indentation12", indentation, 'm', 46.3541038841777, 1.2);
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-28 05:58:33 EST (Sat, 28 Jan 2012)
@@ -10,7 +10,7 @@
 #ifndef BOOST_GEOMETRY_TEST_BUFFER_HPP
 #define BOOST_GEOMETRY_TEST_BUFFER_HPP
 
-//#define BOOST_GEOMETRY_DEBUG_WITH_MAPPER
+// #define BOOST_GEOMETRY_DEBUG_WITH_MAPPER
 #define TEST_WITH_SVG
 
 #include <fstream>
@@ -180,7 +180,19 @@
                                     );
     }
 #endif
-    buffered.push_back(buffered_step1);
+
+    if (boost::contains(complete.str(), "indentation4")
+     || boost::contains(complete.str(), "indentation5")
+     || boost::contains(complete.str(), "indentation6"))
+    {
+        // Some controlled cases are already dissolved,
+        // such that we can detect regressions there
+        bg::dissolve(buffered_step1, buffered);
+    }
+    else
+    {
+        buffered.push_back(buffered_step1);
+    }
 
     //std::cout << caseid << std::endl;
     //std::cout << "INPUT: " << bg::wkt(geometry) << std::endl;
@@ -253,13 +265,6 @@
 
     typedef typename bg::point_type<Geometry>::type point_type;
 
-    //std::cout << caseid << std::endl;
-    if (join == 'm')
-    {
-        //return;
-    }
-
-
 
 #ifdef BOOST_GEOMETRY_CHECK_WITH_POSTGIS
     std::cout