$include_dir="/home/hyper-archives/boost-commit/include"; include("$include_dir/msg-header.inc") ?>
Subject: [Boost-commit] svn:boost r56594 - in sandbox/ggl/other/comparisons: cgal common geos ggl gtl
From: barend.gehrels_at_[hidden]
Date: 2009-10-05 09:32:03
Author: barendgehrels
Date: 2009-10-05 09:32:02 EDT (Mon, 05 Oct 2009)
New Revision: 56594
URL: http://svn.boost.org/trac/boost/changeset/56594
Log:
Added self-intersection test using IsValid (geos), Is_simple (cgal), intersects (ggl)
Text files modified: 
   sandbox/ggl/other/comparisons/cgal/cgal_check.cpp |    68 +++++++++++++++++++++++++++------------ 
   sandbox/ggl/other/comparisons/common/common.hpp   |    18 +++++++++-                              
   sandbox/ggl/other/comparisons/geos/geos_check.cpp |    24 ++++++++++++++                          
   sandbox/ggl/other/comparisons/ggl/ggl_check.cpp   |    33 +++++++++++++++++--                     
   sandbox/ggl/other/comparisons/gtl/gtl_check.cpp   |    35 +++++++++++---------                    
   5 files changed, 134 insertions(+), 44 deletions(-)
Modified: sandbox/ggl/other/comparisons/cgal/cgal_check.cpp
==============================================================================
--- sandbox/ggl/other/comparisons/cgal/cgal_check.cpp	(original)
+++ sandbox/ggl/other/comparisons/cgal/cgal_check.cpp	2009-10-05 09:32:02 EDT (Mon, 05 Oct 2009)
@@ -310,6 +310,26 @@
     }
     ***/
 
+    if (compare::MEASURE_INTERSECTS)
+    {
+        int n = 0;
+
+        boost::timer t;
+        for (int i = 0; i < 1; i++)
+        {
+            for (std::vector<POLY>::const_iterator it = polygons.begin();
+                it != polygons.end();
+                ++it)
+            {
+                if (! CGAL::is_simple_2(it->vertices_begin(), it->vertices_end(), K()))
+                {
+                    n++;
+                }
+            }
+        }
+        compare::report_intersects(t, polygons.size(), n);
+    }
+
 
     #ifndef SKIP_OVERLAY
     if (compare::MEASURE_OVERLAY)
@@ -320,33 +340,37 @@
 
         for (int i = 0; i < compare::OVERLAY_COUNT; i++)
         {
-        int k = 0;
-        std::vector<POLY>::const_iterator eit = ellipses.begin();
-        for (std::vector<POLY>::iterator it = polygons.begin();
-            it != polygons.end() && eit != ellipses.end();
-            ++it, ++eit, ++k)
-        {
-            area1 += CGAL::to_double(it->area());
+            int k = 0;
+            std::vector<POLY>::const_iterator eit = ellipses.begin();
 
-            std::list<HOLEY_POLY> pv;
-            try
+            //std::vector<int>::const_iterator idit = ids.begin();
+
+            for (std::vector<POLY>::iterator it = polygons.begin();
+                it != polygons.end() && eit != ellipses.end();
+                ++it, ++eit, ++k) //, ++idit)
             {
-                CGAL::intersection(*it, *eit, std::back_inserter(pv));
-                double a = 0;
-                for (std::list<HOLEY_POLY>::const_iterator pit = pv.begin(); pit != pv.end(); ++pit)
+                area1 += CGAL::to_double(it->area());
+
+                std::list<HOLEY_POLY> pv;
+                try
+                {
+                    //std::cout << " " << *idit;
+                    CGAL::intersection(*it, *eit, std::back_inserter(pv));
+                    double a = 0;
+                    for (std::list<HOLEY_POLY>::const_iterator pit = pv.begin(); pit != pv.end(); ++pit)
+                    {
+                        a += CGAL::to_double(pit->outer_boundary().area());
+                    }
+                    area2 += a;
+                }
+                catch(std::exception const& e)
+                {
+                }
+                catch(...)
                 {
-                    a += CGAL::to_double(pit->outer_boundary().area());
                 }
-                area2 += a;
-            }
-            catch(std::exception const& e)
-            {
-            }
-            catch(...)
-            {
-            }
 
-        }
+            }
         }
         compare::report_overlay(t, polygons.size(), area1, area2);
     }
Modified: sandbox/ggl/other/comparisons/common/common.hpp
==============================================================================
--- sandbox/ggl/other/comparisons/common/common.hpp	(original)
+++ sandbox/ggl/other/comparisons/common/common.hpp	2009-10-05 09:32:02 EDT (Mon, 05 Oct 2009)
@@ -128,16 +128,20 @@
 
 //#define OVERLAY_UNION
 
-    const int OVERLAY_ELLIPSE_COUNT = 101;
-    const double delta = boost::math::constants::pi<double>() * 2.0 / (compare::OVERLAY_ELLIPSE_COUNT - 1);
+
+    // For star-ellipse: use 1.1, 0.2, 101, 1001, 10001
+    // For normal ellipse: use 1.1, 1.1, 100, 1000, 10000
     const double OVERLAY_ELLIPSE_FACTOR1 = 1.1; // 1.1
     const double OVERLAY_ELLIPSE_FACTOR2 = 0.2; // 0.2
+    const int OVERLAY_ELLIPSE_COUNT = 101;
+
     const double CLIP_FACTOR = 0.9;
 
     const bool MEASURE_AREA = true;
     const bool MEASURE_CENTROID = true;
     const bool MEASURE_CLIP = true;
     const bool MEASURE_CONVEX_HULL = true;
+    const bool MEASURE_INTERSECTS = true;
     const bool MEASURE_OVERLAY = true;
     const bool MEASURE_SIMPLIFY = true;
     const bool MEASURE_TOUCH = false; // currently only for GEOS, not further worked out
@@ -150,6 +154,8 @@
     const bool SIMPLIFY_LENGTH = true;
 
 
+    const double delta = boost::math::constants::pi<double>() * 2.0 / (compare::OVERLAY_ELLIPSE_COUNT - 1);
+
 
     // Wait a while, after reading shapefiles/generating ellipses, etc
     // until all buffers/memory allocation/swapping is done.
@@ -242,6 +248,14 @@
         report_common(s, n, "TOUCH", count, count_box);
     }
 
+    inline void report_intersects(const boost::timer& t, int n, int count)
+    {
+        double s = t.elapsed();
+
+        report_common(s, n, "INTERSECTS", count, 0);
+    }
+
+
     inline void report_overlay(const boost::timer& t, int n, double area1, double area2)
     {
         double s = t.elapsed();
Modified: sandbox/ggl/other/comparisons/geos/geos_check.cpp
==============================================================================
--- sandbox/ggl/other/comparisons/geos/geos_check.cpp	(original)
+++ sandbox/ggl/other/comparisons/geos/geos_check.cpp	2009-10-05 09:32:02 EDT (Mon, 05 Oct 2009)
@@ -212,6 +212,30 @@
         }
 
 
+        if (compare::MEASURE_INTERSECTS)
+        {
+            int n = 0;
+
+            boost::timer t;
+            for (int i = 0; i < 1; i++)
+            {
+                for (std::vector<Geometry*>::const_iterator it = polygons.begin();
+                        it != polygons.end();
+                        ++it)
+                {
+                    Geometry* poly = *it;
+
+                    if (! poly->isValid())
+                    {
+                        n++;
+                    }
+                }
+            }
+            compare::report_intersects(t, polygons.size(), n);
+        }
+
+
+
         if (compare::MEASURE_OVERLAY)
         {
             bool first = true;
Modified: sandbox/ggl/other/comparisons/ggl/ggl_check.cpp
==============================================================================
--- sandbox/ggl/other/comparisons/ggl/ggl_check.cpp	(original)
+++ sandbox/ggl/other/comparisons/ggl/ggl_check.cpp	2009-10-05 09:32:02 EDT (Mon, 05 Oct 2009)
@@ -11,7 +11,7 @@
 //#define GGL_DEBUG_INTERSECTION
 // #define OUTPUT_POSTGIS
 // #define OUTPUT_SQLSERVER
-//#define OUTPUT_ORACLE
+//#define OUTPUT_ORACLE do not use this, does not work yet / is not yet checked in
 //#define OUTPUT_WKT
 
 
@@ -22,7 +22,9 @@
 #include <ggl/ggl.hpp>
 #include <ggl/geometries/geometries.hpp>
 
-#include <ggl/io/oracle/write_oracle.hpp>
+#if defined(OUTPUT_ORACLE)
+#  include <ggl/io/oracle/write_oracle.hpp>
+#endif
 
 
 
@@ -297,14 +299,14 @@
         for (std::vector<POLY>::const_iterator it = polygons.begin(); it != polygons.end(); ++it)
         {
             POLY::ring_type ring;
-            //std::cout << ggl::as_wkt<POLY>(*it) << std::endl;
+            //std::cout << ggl::wkt<POLY>(*it) << std::endl;
             ggl::convex_hull(*it, std::back_inserter(ring));
             if (compare::HULL_AREA)
             {
                 area += fabs(ggl::area(ring));
                 /*POLY p;
                 p.outer() = ring;
-                std::cout << ggl::as_wkt<POLY>(p) << " ";
+                std::cout << ggl::wkt<POLY>(p) << " ";
                 std::cout << ggl::area(it->outer()) << " -> " << ggl::area(ring)  << std::endl;
                 */
             }
@@ -313,6 +315,29 @@
         compare::report_hull(t, polygons.size(), area);
     }
 
+
+    if (compare::MEASURE_INTERSECTS)
+    {
+        int n = 0;
+
+        boost::timer t;
+        for (int i = 0; i < 1; i++)
+        {
+            for (std::vector<POLY>::const_iterator it = polygons.begin();
+                it != polygons.end();
+                ++it)
+            {
+                if (ggl::intersects(*it))
+                {
+                    //std::cout << ggl::wkt<POLY>(*it) << std::endl;
+                    n++;
+                }
+            }
+        }
+        compare::report_intersects(t, polygons.size(), n);
+    }
+
+
     if (compare::MEASURE_OVERLAY)
     {
         bool first = true;
Modified: sandbox/ggl/other/comparisons/gtl/gtl_check.cpp
==============================================================================
--- sandbox/ggl/other/comparisons/gtl/gtl_check.cpp	(original)
+++ sandbox/ggl/other/comparisons/gtl/gtl_check.cpp	2009-10-05 09:32:02 EDT (Mon, 05 Oct 2009)
@@ -161,25 +161,28 @@
         std::vector<INT_POLY> integer_polygons;
         std::vector<INT_POLY> integer_ellipses;
 
-        for (std::vector<POLY>::const_iterator it = polygons.begin();
-            it != polygons.end();
-            ++it)
+        if (compare::MEASURE_OVERLAY)
         {
-            INT_POLY ip;
-            convert_polygon(*it, ip);
-            integer_polygons.push_back(ip);
+            for (std::vector<POLY>::const_iterator it = polygons.begin();
+                it != polygons.end();
+                ++it)
+            {
+                INT_POLY ip;
+                convert_polygon(*it, ip);
+                integer_polygons.push_back(ip);
 
-            // To check if conversion is OK
-            //std::cout << boost::polygon::area(*it) << " " <<  (boost::polygon::area(ip) / GTL_INTEGER_FACTOR_SQR) << std::endl;
-        }
+                // To check if conversion is OK
+                //std::cout << boost::polygon::area(*it) << " " <<  (boost::polygon::area(ip) / GTL_INTEGER_FACTOR_SQR) << std::endl;
+            }
 
-        for (std::vector<POLY>::const_iterator it = ellipses.begin();
-            it != ellipses.end();
-            ++it)
-        {
-            INT_POLY ip;
-            convert_polygon(*it, ip);
-            integer_ellipses.push_back(ip);
+            for (std::vector<POLY>::const_iterator it = ellipses.begin();
+                it != ellipses.end();
+                ++it)
+            {
+                INT_POLY ip;
+                convert_polygon(*it, ip);
+                integer_ellipses.push_back(ip);
+            }
         }