$include_dir="/home/hyper-archives/boost-commit/include"; include("$include_dir/msg-header.inc") ?>
Subject: [Boost-commit] svn:boost r69603 - trunk/libs/geometry/test/algorithms/overlay/robustness
From: barend.gehrels_at_[hidden]
Date: 2011-03-06 08:15:13
Author: barendgehrels
Date: 2011-03-06 08:15:08 EST (Sun, 06 Mar 2011)
New Revision: 69603
URL: http://svn.boost.org/trac/boost/changeset/69603
Log:
Added program_options to both intersection_pies.cpp and random_ellipses_stars.cpp now
Changed difference-test into a setting instead of a define
Text files modified: 
   trunk/libs/geometry/test/algorithms/overlay/robustness/intersection_pies.cpp        |    28 +++++----                               
   trunk/libs/geometry/test/algorithms/overlay/robustness/intersection_pies.vcproj     |     4                                         
   trunk/libs/geometry/test/algorithms/overlay/robustness/random_ellipses_stars.cpp    |    98 +++++++++++++++++++++++++++-------      
   trunk/libs/geometry/test/algorithms/overlay/robustness/random_ellipses_stars.vcproj |    48 ++++++++++++++++                        
   trunk/libs/geometry/test/algorithms/overlay/robustness/recursive_polygons.cpp       |    31 ++++++-----                             
   trunk/libs/geometry/test/algorithms/overlay/robustness/recursive_polygons.vcproj    |     4                                         
   trunk/libs/geometry/test/algorithms/overlay/robustness/test_overlay_p_q.hpp         |   112 +++++++++++++++++++++++---------------- 
   7 files changed, 227 insertions(+), 98 deletions(-)
Modified: trunk/libs/geometry/test/algorithms/overlay/robustness/intersection_pies.cpp
==============================================================================
--- trunk/libs/geometry/test/algorithms/overlay/robustness/intersection_pies.cpp	(original)
+++ trunk/libs/geometry/test/algorithms/overlay/robustness/intersection_pies.cpp	2011-03-06 08:15:08 EST (Sun, 06 Mar 2011)
@@ -135,7 +135,7 @@
 
 template <typename T, bool Clockwise, bool Closed>
 void test_pie(int total_segment_count, T factor_p, T factor_q,
-            bool multi, bool single_selftangent, bool svg)
+            bool multi, bool single_selftangent, p_q_settings const& settings)
 {
     boost::timer t;
     typedef bg::model::d2::point_xy<T> point_type;
@@ -168,7 +168,7 @@
 
                         std::ostringstream out;
                         out << "pie_" << a << "_" << b << "_" << offset << "_" << y;
-                        if (test_overlay_p_q<polygon, T>(out.str(), p, q, svg, 0.01))
+                        if (test_overlay_p_q<polygon, T>(out.str(), p, q, settings))
                         {
                             good_count++;
                         }
@@ -202,7 +202,7 @@
                                     q1.outer().push_back(q2.outer()[i]);
                                 }
                                 //holify(q1);
-                                good = test_overlay_p_q<polygon, T>(out.str(), p, q1, svg, 0.01);
+                                good = test_overlay_p_q<polygon, T>(out.str(), p, q1, settings);
                             }
                             else
                             {
@@ -210,7 +210,7 @@
                                 mq.push_back(q);
                                 mq.push_back(q2);
                                 //holify_multi(mq);
-                                good = test_overlay_p_q<polygon, T>(out.str(), p, mq, svg, 0.01);
+                                good = test_overlay_p_q<polygon, T>(out.str(), p, mq, settings);
                             }
 
                             if (good)
@@ -235,9 +235,9 @@
 
 
 template <typename T, bool Clockwise, bool Closed>
-void test_all(bool multi, bool single_selftangent, bool svg)
+void test_all(bool multi, bool single_selftangent, p_q_settings const& settings)
 {
-    test_pie<T, Clockwise, Closed>(24, 0.55, 0.45, multi, single_selftangent, svg);
+    test_pie<T, Clockwise, Closed>(24, 0.55, 0.45, multi, single_selftangent, settings);
 }
 
 int main(int argc, char** argv)
@@ -245,9 +245,9 @@
     try
     {
         namespace po = boost::program_options;
-        po::options_description description("=== recursive_polygons ===\nAllowed options");
+        po::options_description description("=== intersection_pies ===\nAllowed options");
 
-        bool svg = false;
+        p_q_settings settings;
         bool multi = false;
         bool ccw = false;
         bool open = false;
@@ -256,9 +256,11 @@
         description.add_options()
             ("help", "Help message")
             ("multi", po::value<bool>(&multi)->default_value(false), "Multiple tangencies at one point")
+            ("diff", po::value<bool>(&settings.also_difference)->default_value(false), "Include testing on difference")
             ("ccw", po::value<bool>(&ccw)->default_value(false), "Counter clockwise polygons")
             ("open", po::value<bool>(&open)->default_value(false), "Open polygons")
-            ("svg", po::value<bool>(&svg)->default_value(false), "Create an SVG filename for all tests")
+            ("wkt", po::value<bool>(&settings.wkt)->default_value(false), "Create a WKT of the inputs, for all tests")
+            ("svg", po::value<bool>(&settings.svg)->default_value(false), "Create a SVG for all tests")
         ;
 
         po::variables_map varmap;
@@ -274,19 +276,19 @@
         // template par's are: CoordinateType, Clockwise, Closed
         if (ccw && open)
         {
-            test_all<double, false, false>(multi, single_selftangent, svg);
+            test_all<double, false, false>(multi, single_selftangent, settings);
         }
         else if (ccw)
         {
-            test_all<double, false, true>(multi, single_selftangent, svg);
+            test_all<double, false, true>(multi, single_selftangent, settings);
         }
         else if (open)
         {
-            test_all<double, true, false>(multi, single_selftangent, svg);
+            test_all<double, true, false>(multi, single_selftangent, settings);
         }
         else
         {
-            test_all<double, true, true>(multi, single_selftangent, svg);
+            test_all<double, true, true>(multi, single_selftangent, settings);
         }
         //test_all<long double>();
     }
Modified: trunk/libs/geometry/test/algorithms/overlay/robustness/intersection_pies.vcproj
==============================================================================
--- trunk/libs/geometry/test/algorithms/overlay/robustness/intersection_pies.vcproj	(original)
+++ trunk/libs/geometry/test/algorithms/overlay/robustness/intersection_pies.vcproj	2011-03-06 08:15:08 EST (Sun, 06 Mar 2011)
@@ -41,7 +41,7 @@
                         <Tool
                                 Name="VCCLCompilerTool"
                                 Optimization="0"
-				AdditionalIncludeDirectories=""c:\gmp\gmp-dynamic";c:\svn\numeric_adaptor;.;../../../../../..;../../.."
+				AdditionalIncludeDirectories="../../../../../..;."
                                 PreprocessorDefinitions="WIN32;_DEBUG;_WINDOWS;TEST_WITH_SVG;BOOST_ALL_NO_LIB"
                                 BasicRuntimeChecks="3"
                                 RuntimeLibrary="1"
@@ -117,7 +117,7 @@
                         />
                         <Tool
                                 Name="VCCLCompilerTool"
-				AdditionalIncludeDirectories=""c:\gmp\gmp-dynamic";c:\svn\numeric_adaptor;.;../../../../../..;../../.."
+				AdditionalIncludeDirectories="../../../../../..;."
                                 PreprocessorDefinitions="WIN32;NDEBUG;_WINDOWS;BOOST_ALL_NO_LIB"
                                 UsePrecompiledHeader="0"
                                 WarningLevel="3"
Modified: trunk/libs/geometry/test/algorithms/overlay/robustness/random_ellipses_stars.cpp
==============================================================================
--- trunk/libs/geometry/test/algorithms/overlay/robustness/random_ellipses_stars.cpp	(original)
+++ trunk/libs/geometry/test/algorithms/overlay/robustness/random_ellipses_stars.cpp	2011-03-06 08:15:08 EST (Sun, 06 Mar 2011)
@@ -15,8 +15,8 @@
 #define BOOST_GEOMETRY_NO_BOOST_TEST
 
 
+#include <boost/program_options.hpp>
 #include <boost/timer.hpp>
-#include <boost/lexical_cast.hpp>
 #include <boost/random/linear_congruential.hpp>
 #include <boost/random/uniform_int.hpp>
 #include <boost/random/uniform_real.hpp>
@@ -87,15 +87,16 @@
 
     }
     bg::exterior_ring(polygon).push_back(bg::exterior_ring(polygon).front());
+    bg::correct(polygon);
 }
 
 
-template <typename T>
+template <typename T, bool Clockwise, bool Closed>
 void test_star_ellipse(int seed, int index, star_params const& par_p,
-            star_params const& par_q, bool svg, double tolerance)
+            star_params const& par_q, p_q_settings const& settings)
 {
     typedef bg::model::d2::point_xy<T> point_type;
-    typedef bg::model::polygon<point_type> polygon;
+    typedef bg::model::polygon<point_type, Clockwise, Closed> polygon;
 
     polygon p, q;
     make_star(p, par_p);
@@ -103,11 +104,11 @@
 
     std::ostringstream out;
     out << "rse_" << seed << "_" << index;
-    test_overlay_p_q<polygon, T>(out.str(), p, q, svg, tolerance);
+    test_overlay_p_q<polygon, T>(out.str(), p, q, settings);
 }
 
-template <typename T>
-void test_all(int seed, int count, bool svg, double tolerance)
+template <typename T, bool Clockwise, bool Closed>
+void test_type(int seed, int count, p_q_settings const& settings)
 {
     boost::timer t;
 
@@ -157,36 +158,93 @@
 
     for(int i = 0; i < count; i++)
     {
-        test_star_ellipse<T>(seed, i + 1,
+        test_star_ellipse<T, Clockwise, Closed>(seed, i + 1,
             star_params(int_generator() * 2 + 1,
                     factor_generator(), factor_generator(),
                     location_generator(), location_generator(), rotation_generator()),
             star_params(int_generator() * 2 + 1,
                     factor_generator(), factor_generator(),
                     location_generator(), location_generator(), rotation_generator()),
-            svg, tolerance);
+            settings);
     }
     std::cout
         << "type: " << string_from_type<T>::name()
         << " time: " << t.elapsed()  << std::endl;
 }
 
+template <bool Clockwise, bool Closed>
+void test_all(std::string const& type, int seed, int count, p_q_settings settings)
+{
+    if (type == "float")
+    {
+        settings.tolerance = 1.0e-3;
+        test_type<float, Clockwise, Closed>(seed, count, settings);
+    }
+    else if (type == "double")
+    {
+        test_type<double, Clockwise, Closed>(seed, count, settings);
+    }
+#if defined(HAVE_TTMATH)
+    else if (type == "ttmath")
+    {
+        test_type<ttmath_big, Clockwise, Closed>(seed, count, settings);
+    }
+#endif
+}
+
+
 int main(int argc, char** argv)
 {
     try
     {
-        int count = argc > 1 ? boost::lexical_cast<int>(argv[1]) : 10;
-        int seed = (argc > 2 && std::string(argv[2]) != std::string("#"))
-            ? boost::lexical_cast<int>(argv[2])
-            : static_cast<unsigned int>(std::time(0));
-        bool svg = argc > 3 && std::string(argv[3]) == std::string("svg");
+        namespace po = boost::program_options;
+        po::options_description description("=== random_ellipses_stars ===\nAllowed options");
 
-        test_all<float>(seed, count, svg, 1e-3);
-        //test_all<double>(seed, count, svg, 1e-6);
-
-#if defined(HAVE_TTMATH)
-   // test_star_ellipse<ttmath_big>(selection, "t");
-#endif
+        int count = 1;
+        int seed = static_cast<unsigned int>(std::time(0));
+        std::string type = "float";
+        bool ccw = false;
+        bool open = false;
+        p_q_settings settings;
+
+        description.add_options()
+            ("help", "Help message")
+            ("seed", po::value<int>(&seed), "Initialization seed for random generator")
+            ("count", po::value<int>(&count)->default_value(1), "Number of tests")
+            ("diff", po::value<bool>(&settings.also_difference)->default_value(false), "Include testing on difference")
+            ("ccw", po::value<bool>(&ccw)->default_value(false), "Counter clockwise polygons")
+            ("open", po::value<bool>(&open)->default_value(false), "Open polygons")
+            ("type", po::value<std::string>(&type)->default_value("float"), "Type (float,double)")
+            ("wkt", po::value<bool>(&settings.wkt)->default_value(false), "Create a WKT of the inputs, for all tests")
+            ("svg", po::value<bool>(&settings.svg)->default_value(false), "Create a SVG for all tests")
+        ;
+
+        po::variables_map varmap;
+        po::store(po::parse_command_line(argc, argv, description), varmap);
+        po::notify(varmap);
+
+        if (varmap.count("help"))
+        {
+            std::cout << description << std::endl;
+            return 1;
+        }
+
+        if (ccw && open)
+        {
+            test_all<false, false>(type, seed, count, settings);
+        }
+        else if (ccw)
+        {
+            test_all<false, true>(type, seed, count, settings);
+        }
+        else if (open)
+        {
+            test_all<true, false>(type, seed, count, settings);
+        }
+        else
+        {
+            test_all<true, true>(type, seed, count, settings);
+        }
     }
     catch(std::exception const& e)
     {
Modified: trunk/libs/geometry/test/algorithms/overlay/robustness/random_ellipses_stars.vcproj
==============================================================================
--- trunk/libs/geometry/test/algorithms/overlay/robustness/random_ellipses_stars.vcproj	(original)
+++ trunk/libs/geometry/test/algorithms/overlay/robustness/random_ellipses_stars.vcproj	2011-03-06 08:15:08 EST (Sun, 06 Mar 2011)
@@ -42,7 +42,7 @@
                                 Name="VCCLCompilerTool"
                                 Optimization="0"
                                 AdditionalIncludeDirectories="../../../../../..;../../..;."
-				PreprocessorDefinitions="WIN32;_DEBUG;_WINDOWS;TEST_WITH_SVG"
+				PreprocessorDefinitions="WIN32;_DEBUG;_WINDOWS;BOOST_ALL_NO_LIB"
                                 BasicRuntimeChecks="3"
                                 RuntimeLibrary="1"
                                 UsePrecompiledHeader="0"
@@ -118,7 +118,7 @@
                         <Tool
                                 Name="VCCLCompilerTool"
                                 AdditionalIncludeDirectories="../../../../../..;../../..;."
-				PreprocessorDefinitions="WIN32;NDEBUG;_WINDOWS"
+				PreprocessorDefinitions="WIN32;NDEBUG;_WINDOWS;BOOST_ALL_NO_LIB"
                                 RuntimeLibrary="0"
                                 UsePrecompiledHeader="0"
                                 WarningLevel="3"
@@ -169,6 +169,50 @@
         <References>
         </References>
         <Files>
+		<Filter
+			Name="program options"
+			>
+			<File
+				RelativePath="..\..\..\..\..\program_options\src\cmdline.cpp"
+				>
+			</File>
+			<File
+				RelativePath="..\..\..\..\..\program_options\src\config_file.cpp"
+				>
+			</File>
+			<File
+				RelativePath="..\..\..\..\..\program_options\src\convert.cpp"
+				>
+			</File>
+			<File
+				RelativePath="..\..\..\..\..\program_options\src\options_description.cpp"
+				>
+			</File>
+			<File
+				RelativePath="..\..\..\..\..\program_options\src\parsers.cpp"
+				>
+			</File>
+			<File
+				RelativePath="..\..\..\..\..\program_options\src\positional_options.cpp"
+				>
+			</File>
+			<File
+				RelativePath="..\..\..\..\..\program_options\src\split.cpp"
+				>
+			</File>
+			<File
+				RelativePath="..\..\..\..\..\program_options\src\utf8_codecvt_facet.cpp"
+				>
+			</File>
+			<File
+				RelativePath="..\..\..\..\..\program_options\src\value_semantic.cpp"
+				>
+			</File>
+			<File
+				RelativePath="..\..\..\..\..\program_options\src\variables_map.cpp"
+				>
+			</File>
+		</Filter>
                 <File
                         RelativePath=".\random_ellipses_stars.cpp"
 			>
Modified: trunk/libs/geometry/test/algorithms/overlay/robustness/recursive_polygons.cpp
==============================================================================
--- trunk/libs/geometry/test/algorithms/overlay/robustness/recursive_polygons.cpp	(original)
+++ trunk/libs/geometry/test/algorithms/overlay/robustness/recursive_polygons.cpp	2011-03-06 08:15:08 EST (Sun, 06 Mar 2011)
@@ -66,7 +66,7 @@
 template <typename MultiPolygon, typename Generator>
 bool test_recursive_boxes(MultiPolygon& result, int& index,
             Generator& generator,
-            bool svg, int level, bool triangular)
+            int level, bool triangular, p_q_settings const& settings)
 {
     MultiPolygon p, q;
 
@@ -84,8 +84,8 @@
     {
         bg::correct(p);
         bg::correct(q);
-        if (! test_recursive_boxes(p, index, generator, svg, level - 1, triangular)
-            || ! test_recursive_boxes(q, index, generator, svg, level - 1, triangular))
+        if (! test_recursive_boxes(p, index, generator, level - 1, triangular, settings)
+            || ! test_recursive_boxes(q, index, generator, level - 1, triangular, settings))
         {
             return false;
         }
@@ -99,7 +99,7 @@
         <
             polygon,
             typename bg::coordinate_type<MultiPolygon>::type
-        >(out.str(), p, q, svg, 0.001))
+        >(out.str(), p, q, settings))
     {
         return false;
     }
@@ -118,7 +118,7 @@
 
 
 template <typename T, bool Clockwise, bool Closed>
-void test_all(int seed, int count, int field_size, bool svg, int level, bool triangular)
+void test_all(int seed, int count, int field_size, int level, bool triangular, p_q_settings const& settings)
 {
     boost::timer t;
 
@@ -141,10 +141,10 @@
     for(int i = 0; i < count; i++)
     {
         mp p;
-        test_recursive_boxes<mp>(p, index, coordinate_generator, svg, level, triangular);
+        test_recursive_boxes<mp>(p, index, coordinate_generator, level, triangular, settings);
     }
     std::cout
-        << "boxes " << index
+        << "polygons: " << index
         << " type: " << string_from_type<T>::name()
         << " time: " << t.elapsed()  << std::endl;
 }
@@ -162,26 +162,29 @@
         int field_size = 10;
         bool ccw = false;
         bool open = false;
-        bool svg = false;
+        p_q_settings settings;
         std::string form = "box";
 
         description.add_options()
             ("help", "Help message")
             ("seed", po::value<int>(&seed), "Initialization seed for random generator")
             ("count", po::value<int>(&count)->default_value(1), "Number of tests")
+            ("diff", po::value<bool>(&settings.also_difference)->default_value(false), "Include testing on difference")
             ("level", po::value<int>(&level)->default_value(3), "Level to reach (higher->slower)")
             ("size", po::value<int>(&field_size)->default_value(10), "Size of the field")
             ("form", po::value<std::string>(&form)->default_value("box"), "Form of the polygons (box, triangle)")
             ("ccw", po::value<bool>(&ccw)->default_value(false), "Counter clockwise polygons")
             ("open", po::value<bool>(&open)->default_value(false), "Open polygons")
-            ("svg", po::value<bool>(&svg)->default_value(false), "Create an SVG filename for all tests")
+            ("wkt", po::value<bool>(&settings.wkt)->default_value(false), "Create a WKT of the inputs, for all tests")
+            ("svg", po::value<bool>(&settings.svg)->default_value(false), "Create a SVG for all tests")
         ;
 
         po::variables_map varmap;
         po::store(po::parse_command_line(argc, argv, description), varmap);
         po::notify(varmap);
 
-        if (varmap.count("help"))
+        if (varmap.count("help") 
+            || (form != "box" && form != "triangle"))
         {
             std::cout << description << std::endl;
             return 1;
@@ -192,19 +195,19 @@
 
         if (ccw && open)
         {
-            test_all<double, false, false>(seed, count, field_size, svg, level, triangular);
+            test_all<double, false, false>(seed, count, field_size, level, triangular, settings);
         }
         else if (ccw)
         {
-            test_all<double, false, true>(seed, count, field_size, svg, level, triangular);
+            test_all<double, false, true>(seed, count, field_size, level, triangular, settings);
         }
         else if (open)
         {
-            test_all<double, true, false>(seed, count, field_size, svg, level, triangular);
+            test_all<double, true, false>(seed, count, field_size, level, triangular, settings);
         }
         else
         {
-            test_all<double, true, true>(seed, count, field_size, svg, level, triangular);
+            test_all<double, true, true>(seed, count, field_size, level, triangular, settings);
         }
 
 #if defined(HAVE_TTMATH)
Modified: trunk/libs/geometry/test/algorithms/overlay/robustness/recursive_polygons.vcproj
==============================================================================
--- trunk/libs/geometry/test/algorithms/overlay/robustness/recursive_polygons.vcproj	(original)
+++ trunk/libs/geometry/test/algorithms/overlay/robustness/recursive_polygons.vcproj	2011-03-06 08:15:08 EST (Sun, 06 Mar 2011)
@@ -41,7 +41,7 @@
                         <Tool
                                 Name="VCCLCompilerTool"
                                 Optimization="0"
-				AdditionalIncludeDirectories="../../../../../..;../../..;."
+				AdditionalIncludeDirectories="../../../../../..;."
                                 PreprocessorDefinitions="WIN32;_DEBUG;_WINDOWS;TEST_WITH_SVG;BOOST_ALL_NO_LIB"
                                 BasicRuntimeChecks="3"
                                 RuntimeLibrary="1"
@@ -117,7 +117,7 @@
                         />
                         <Tool
                                 Name="VCCLCompilerTool"
-				AdditionalIncludeDirectories="../../../../../..;../../..;."
+				AdditionalIncludeDirectories="../../../../../..;."
                                 PreprocessorDefinitions="WIN32;NDEBUG;_WINDOWS;BOOST_ALL_NO_LIB"
                                 RuntimeLibrary="0"
                                 UsePrecompiledHeader="0"
Modified: trunk/libs/geometry/test/algorithms/overlay/robustness/test_overlay_p_q.hpp
==============================================================================
--- trunk/libs/geometry/test/algorithms/overlay/robustness/test_overlay_p_q.hpp	(original)
+++ trunk/libs/geometry/test/algorithms/overlay/robustness/test_overlay_p_q.hpp	2011-03-06 08:15:08 EST (Sun, 06 Mar 2011)
@@ -32,20 +32,36 @@
 #include <geometry_test_common.hpp>
 
 
+struct p_q_settings
+{
+    bool svg;
+    bool also_difference;
+    bool wkt;
+    double tolerance;
+
+    p_q_settings()
+        : svg(false)
+        , also_difference(false)
+        , wkt(false)
+        , tolerance(1.0e-6)
+    {}
+};
+
 template <typename OutputType, typename CalculationType, typename G1, typename G2>
 static bool test_overlay_p_q(std::string const& caseid,
             G1 const& p, G2 const& q,
-            bool svg, double tolerance, bool force_output = false)
+            p_q_settings const& settings)
 {
     bool result = true;
 
     typedef typename bg::coordinate_type<G1>::type coordinate_type;
     typedef typename bg::point_type<G1>::type point_type;
 
-    bg::model::multi_polygon<OutputType> out_i, out_u, out_d;
+    bg::model::multi_polygon<OutputType> out_i, out_u, out_d, out_d2;
 
     CalculationType area_p = bg::area(p);
     CalculationType area_q = bg::area(q);
+    CalculationType area_d1 = 0, area_d2 = 0;
 
     bg::intersection(p, q, out_i);
     CalculationType area_i = bg::area(out_i);
@@ -55,22 +71,28 @@
 
     double sum = (area_p + area_q) - area_u - area_i;
 
-    bool wrong = std::abs(sum) > tolerance;
+    bool wrong = std::abs(sum) > settings.tolerance;
 
-#ifdef BOOST_GEOMETRY_ROBUSTNESS_USE_DIFFERENCE
-    bg::difference(p, q, out_d);
-    CalculationType area_d = bg::area(out_d);
-    double sum_d = (area_u - area_q) - area_d;
-    bool wrong_d = std::abs(sum_d) > tolerance;
-    
-    if (wrong_d)
+    if (settings.also_difference)
     {
-        wrong = true;
+        bg::difference(p, q, out_d);
+        bg::difference(q, p, out_d2);
+        area_d1 = bg::area(out_d);
+        area_d2 = bg::area(out_d2);
+        double sum_d1 = (area_u - area_q) - area_d1;
+        double sum_d2 = (area_u - area_p) - area_d2;
+        bool wrong_d1 = std::abs(sum_d1) > settings.tolerance;
+        bool wrong_d2 = std::abs(sum_d2) > settings.tolerance;
+        
+        if (wrong_d1 || wrong_d2)
+        {
+            wrong = true;
+        }
     }
-#endif
 
+    bool svg = settings.svg;
 
-    if (wrong || force_output)
+    if (wrong || settings.wkt)
     {
         if (wrong)
         {
@@ -87,13 +109,17 @@
             << " area u: " << area_u
             << " area p: " << area_p
             << " area q: " << area_q
-            << " sum: " << sum
-#ifdef BOOST_GEOMETRY_ROBUSTNESS_USE_DIFFERENCE
-            << " area d: " << area_d
-            << " sum d: " << sum_d
-#endif
+            << " sum: " << sum;
+
+        if (settings.also_difference)
+        {
+            std::cout 
+                << " area d1: " << area_d1
+                << " area d2: " << area_d2;
+        }
+        std::cout
             << std::endl
-            << std::setprecision(20)
+            << std::setprecision(9)
             << " p: " << bg::wkt(p) << std::endl
             << " q: " << bg::wkt(q) << std::endl
             << " i: " << bg::wkt(out_i) << std::endl
@@ -102,15 +128,6 @@
 
     }
 
-    // For POSTGIS output
-    /***
-    std::cout 
-        << "union select " << area_i << " as bg,ST_area(ST_Intersection(ST_GeomFromText('" << bg::wkt(p) << "'), ST_GeomFromText('" << bg::wkt(q) << "'))) as pg" << std::endl
-        << "union select " << area_u << " as bg,ST_area(ST_Union(ST_GeomFromText('" << bg::wkt(p) << "'), ST_GeomFromText('" << bg::wkt(q) << "'))) as pg" << std::endl
-        << std::endl;
-    ***/
-
-
     if(svg)
     {
         std::ostringstream filename;
@@ -126,33 +143,38 @@
         mapper.add(p);
         mapper.add(q);
 
-        //mapper.add(point_type(0,0));
-        //mapper.add(point_type(3,3));
-
         // Input shapes in green/blue
         mapper.map(p, "fill-opacity:0.5;fill:rgb(153,204,0);"
                 "stroke:rgb(153,204,0);stroke-width:3");
         mapper.map(q, "fill-opacity:0.3;fill:rgb(51,51,153);"
                 "stroke:rgb(51,51,153);stroke-width:3");
 
-#ifdef BOOST_GEOMETRY_ROBUSTNESS_USE_DIFFERENCE
-        for (BOOST_AUTO(it, out_d.begin()); it != out_d.end(); ++it)
-        {
-            mapper.map(*it, "fill-opacity:0.1;stroke-opacity:0.4;fill:rgb(255,255,0);"
-                    "stroke:rgb(255,255,0);stroke-width:4");
-        }
-#else
-        for (BOOST_AUTO(it, out_i.begin()); it != out_i.end(); ++it)
+        if (settings.also_difference)
         {
-            mapper.map(*it, "fill-opacity:0.1;stroke-opacity:0.4;fill:rgb(255,0,0);"
-                    "stroke:rgb(255,0,0);stroke-width:4");
+            for (BOOST_AUTO(it, out_d.begin()); it != out_d.end(); ++it)
+            {
+                mapper.map(*it, 
+                    "opacity:0.8;fill:none;stroke:rgb(255,128,0);stroke-width:4;stroke-dasharray:1,7;stroke-linecap:round");
+            }
+            for (BOOST_AUTO(it, out_d2.begin()); it != out_d2.end(); ++it)
+            {
+                mapper.map(*it, 
+                    "opacity:0.8;fill:none;stroke:rgb(255,0,255);stroke-width:4;stroke-dasharray:1,7;stroke-linecap:round");
+            }
         }
-        for (BOOST_AUTO(it, out_u.begin()); it != out_u.end(); ++it)
+        else
         {
-            mapper.map(*it, "fill-opacity:0.1;stroke-opacity:0.4;fill:rgb(255,0,0);"
-                    "stroke:rgb(255,0,255);stroke-width:4");
+            for (BOOST_AUTO(it, out_i.begin()); it != out_i.end(); ++it)
+            {
+                mapper.map(*it, "fill-opacity:0.1;stroke-opacity:0.4;fill:rgb(255,0,0);"
+                        "stroke:rgb(255,0,0);stroke-width:4");
+            }
+            for (BOOST_AUTO(it, out_u.begin()); it != out_u.end(); ++it)
+            {
+                mapper.map(*it, "fill-opacity:0.1;stroke-opacity:0.4;fill:rgb(255,0,0);"
+                        "stroke:rgb(255,0,255);stroke-width:4");
+            }
         }
-#endif
     }
     return result;
 }