$include_dir="/home/hyper-archives/boost-commit/include"; include("$include_dir/msg-header.inc") ?>
From: JakeVoytko_at_[hidden]
Date: 2007-08-08 13:31:23
Author: jakevoytko
Date: 2007-08-08 13:31:18 EDT (Wed, 08 Aug 2007)
New Revision: 38508
URL: http://svn.boost.org/trac/boost/changeset/38508
Log:
Added basic handing for numerical limits and plot window clipping
Text files modified: 
   sandbox/SOC/2007/visualization/boost/svg_plot/detail/axis_plot_frame.hpp         |     7 +---                                    
   sandbox/SOC/2007/visualization/boost/svg_plot/detail/numeric_limits_handling.hpp |    22 ++++++++++---                           
   sandbox/SOC/2007/visualization/boost/svg_plot/detail/svg_style_detail.hpp        |     2                                         
   sandbox/SOC/2007/visualization/boost/svg_plot/detail/svg_tag.hpp                 |     8 ++--                                    
   sandbox/SOC/2007/visualization/boost/svg_plot/svg.hpp                            |     6 +--                                     
   sandbox/SOC/2007/visualization/boost/svg_plot/svg_1d_plot.hpp                    |    33 +++++++++++++++++--                     
   sandbox/SOC/2007/visualization/boost/svg_plot/svg_2d_plot.hpp                    |    65 ++++++++++++++++++++++++++++++++++----- 
   sandbox/SOC/2007/visualization/boost/svg_plot/svg_test.cpp                       |    11 +++---                                  
   8 files changed, 116 insertions(+), 38 deletions(-)
Modified: sandbox/SOC/2007/visualization/boost/svg_plot/detail/axis_plot_frame.hpp
==============================================================================
--- sandbox/SOC/2007/visualization/boost/svg_plot/detail/axis_plot_frame.hpp	(original)
+++ sandbox/SOC/2007/visualization/boost/svg_plot/detail/axis_plot_frame.hpp	2007-08-08 13:31:18 EDT (Wed, 08 Aug 2007)
@@ -179,11 +179,6 @@
         }
     }
 
-    void limit_style( )
-    {
-
-    }
-
     void _draw_x_axis()
     {
         double y1(0.);
@@ -437,10 +432,12 @@
         if(detail::limit_NaN(_x))
         {
             _x = 0;
+            _transform_x(_x);
         }
         if(detail::limit_NaN(_y))
         {
             _y = 0;
+            _transform_y(_y);
         }
     }
 
Modified: sandbox/SOC/2007/visualization/boost/svg_plot/detail/numeric_limits_handling.hpp
==============================================================================
--- sandbox/SOC/2007/visualization/boost/svg_plot/detail/numeric_limits_handling.hpp	(original)
+++ sandbox/SOC/2007/visualization/boost/svg_plot/detail/numeric_limits_handling.hpp	2007-08-08 13:31:18 EDT (Wed, 08 Aug 2007)
@@ -15,23 +15,35 @@
 namespace svg{
 namespace detail{
 
-bool limit_max(double a)
+inline bool limit_max(double a)
 {
     return (a == std::numeric_limits<double>::max()
          || a == std::numeric_limits<double>::infinity());
 }
 
-bool limit_min(double a)
+inline bool limit_min(double a)
 {
     return (a == std::numeric_limits<double>::min()
         || a == -std::numeric_limits<double>::infinity()
         || a == std::numeric_limits<double>::denorm_min());
 }
 
-bool limit_NaN(double a)
+inline bool limit_NaN(double a)
 {
-    return (a == std::numeric_limits<double>::quiet_NaN()
-        || a == std::numeric_limits<double>::signaling_NaN());
+    // Ternary operator used to remove warning of performance of casting
+    // int to bool.
+    return _isnan(a) ? true : false;
+}
+
+inline bool is_limit(double a)
+{
+    return limit_max(a) || limit_min(a) || limit_NaN(a);
+}
+
+inline bool pair_is_limit(std::pair<double, double> a)
+{
+        return limit_max(a.first) || limit_min(a.first) || limit_NaN(a.first)
+        || limit_max(a.second) || limit_min(a.second) || limit_NaN(a.second);
 }
 
 }
Modified: sandbox/SOC/2007/visualization/boost/svg_plot/detail/svg_style_detail.hpp
==============================================================================
--- sandbox/SOC/2007/visualization/boost/svg_plot/detail/svg_style_detail.hpp	(original)
+++ sandbox/SOC/2007/visualization/boost/svg_plot/detail/svg_style_detail.hpp	2007-08-08 13:31:18 EDT (Wed, 08 Aug 2007)
@@ -18,7 +18,7 @@
     PLOT_X_MAJOR_GRID, PLOT_Y_AXIS, PLOT_X_AXIS, 
     PLOT_Y_MINOR_TICKS, PLOT_X_MINOR_TICKS, PLOT_Y_MAJOR_TICKS, 
     PLOT_X_MAJOR_TICKS, PLOT_PLOT_LABELS, PLOT_Y_LABEL, PLOT_X_LABEL,
-    PLOT_PLOT_LINES, PLOT_PLOT_POINTS, 
+    PLOT_PLOT_LINES, PLOT_PLOT_POINTS, PLOT_LIMIT_POINTS,
     PLOT_LEGEND_BACKGROUND, PLOT_LEGEND_POINTS, PLOT_LEGEND_TEXT,
     PLOT_TITLE, SVG_PLOT_DOC_CHILDREN};
 
Modified: sandbox/SOC/2007/visualization/boost/svg_plot/detail/svg_tag.hpp
==============================================================================
--- sandbox/SOC/2007/visualization/boost/svg_plot/detail/svg_tag.hpp	(original)
+++ sandbox/SOC/2007/visualization/boost/svg_plot/detail/svg_tag.hpp	2007-08-08 13:31:18 EDT (Wed, 08 Aug 2007)
@@ -57,7 +57,7 @@
 
         if(clip_name.size())
         {
-            s_out << " clip-path=\"url(#" << id_name << ")\"";
+            s_out << " clip-path=\"url(#" << clip_name << ")\"";
         }
     }
 
@@ -75,7 +75,7 @@
    void id(const std::string& _id) { id_name = _id; }
    std::string id( ) { return id_name; }
 
-   void clip_id(const std::string& _id) { id_name = _id; }
+   void clip_id(const std::string& _id) { clip_name = _id; }
    std::string clip_id() { return clip_name; }
 };
 
@@ -268,11 +268,11 @@
 
     void write(std::ostream& rhs)
     {
-        rhs << "<clip-path id=\"" << element_id << "\">" <<std::endl;
+        rhs << "<clipPath id=\"" << element_id << "\">" <<std::endl;
 
         rect.write(rhs);
 
-        rhs<<std::endl<<"</clip-path>";
+        rhs<<std::endl<<"</clipPath>";
     }
 };
 
Modified: sandbox/SOC/2007/visualization/boost/svg_plot/svg.hpp
==============================================================================
--- sandbox/SOC/2007/visualization/boost/svg_plot/svg.hpp	(original)
+++ sandbox/SOC/2007/visualization/boost/svg_plot/svg.hpp	2007-08-08 13:31:18 EDT (Wed, 08 Aug 2007)
@@ -156,11 +156,9 @@
         return *(static_cast<path_element*>(&(document[(unsigned int)(document.size()-1)])));
     }
 
-    svg& clip_path(const rect_element& _rect, g_element& _g,
-                        const std::string& _id)
+    svg& clip_path(const rect_element& _rect, const std::string& _id)
     {
-        document.push_back(new clip_path_element(_id,_rect));
-        _g.clip(_id);
+        clip_paths.push_back(clip_path_element(_id,_rect));
 
         return *this;
     }
Modified: sandbox/SOC/2007/visualization/boost/svg_plot/svg_1d_plot.hpp
==============================================================================
--- sandbox/SOC/2007/visualization/boost/svg_plot/svg_1d_plot.hpp	(original)
+++ sandbox/SOC/2007/visualization/boost/svg_plot/svg_1d_plot.hpp	2007-08-08 13:31:18 EDT (Wed, 08 Aug 2007)
@@ -48,11 +48,9 @@
 namespace boost {
 namespace svg {
 
-
 // -----------------------------------------------------------------
 // Parameter names for plot() function
 // -----------------------------------------------------------------
-
     
 #if defined (BOOST_MSVC)
 #  pragma warning(push)
@@ -103,14 +101,39 @@
 struct svg_plot_series
 {
     std::vector<double> series;
+    std::vector<double> series_limits;
+
     std::string title;
     plot_point_style point_style;
     
+
+    // -------------------------------------------------------------
+    // Scan each data point between the iterators that are passed, 
+    // sorting them into the correcet std::veector
+    // -------------------------------------------------------------
     template <class T>
     svg_plot_series(T _begin, T _end, const std::string& _title,
                     const plot_point_style& _style):
-                    series(_begin, _end), title(_title), point_style(_style)
+                    title(_title), point_style(_style)
     {
+        double temp;
+
+        for(T i = _begin;
+            i != _end;
+            ++i)
+        {
+            temp = *i;
+
+            if(is_limit(temp))
+            {
+                series_limits.push_back(temp);
+            }
+
+            else
+            {
+                series.push_back(temp);
+            }
+        }
     }
 };
 
@@ -350,9 +373,11 @@
     image.get_g_element(detail::PLOT_X_MAJOR_TICKS)
         .style().stroke_color(black).stroke_width(2);
 
+    image.get_g_element(detail::PLOT_LIMIT_POINTS)
+        .style().stroke_color(lightgray).fill_color(whitesmoke);
+
     image.get_g_element(detail::PLOT_X_MINOR_TICKS)
         .style().stroke_width(1);
-
 }
 
 // -----------------------------------------------------------------
Modified: sandbox/SOC/2007/visualization/boost/svg_plot/svg_2d_plot.hpp
==============================================================================
--- sandbox/SOC/2007/visualization/boost/svg_plot/svg_2d_plot.hpp	(original)
+++ sandbox/SOC/2007/visualization/boost/svg_plot/svg_2d_plot.hpp	2007-08-08 13:31:18 EDT (Wed, 08 Aug 2007)
@@ -27,6 +27,7 @@
 
 #include "svg_style.hpp"
 #include "detail/axis_plot_frame.hpp"
+#include "detail/numeric_limits_handling.hpp"
 #include "svg.hpp"
 
 #if defined (BOOST_MSVC)
@@ -92,6 +93,8 @@
 struct svg_2d_plot_series
 {
     std::multimap<double, double> series;
+    std::multimap<double, double> series_limits;
+
     std::string title;
     plot_point_style point_style;
     plot_line_style line_style;
@@ -102,12 +105,24 @@
                        std::string _title,
                        const plot_point_style& _point,
                        const plot_line_style& _line):
-                       series(_begin,_end),
                        title(_title),
                        point_style(_point),
                        line_style(_line)
     {
+        for(T i = _begin;
+            i != _end;
+            ++i)
+        {
+            if(detail::pair_is_limit(*i))
+            {
+                series_limits.insert(*i);
+            }
 
+            else
+            {
+                series.insert(*i);
+            }
+        }              
     }
 };
 
@@ -320,11 +335,11 @@
         path_element& major_grid_path =
             image.get_g_element(detail::PLOT_Y_MAJOR_GRID).path();
 
-        if(show_y_axis_lines)
-        {
-            image.get_g_element(detail::PLOT_Y_AXIS).
-                line(plot_y1, x_axis, plot_x2, x_axis);
-        }
+        //if(show_y_axis_lines)
+        //{
+            //image.get_g_element(detail::PLOT_Y_AXIS).
+            //    line(plot_y1, x_axis, plot_x2, x_axis);
+        //}
 
         // y_minor_jump is the interval between minor ticks.
         double y_minor_jump = y_major/((double)(y_num_minor + 1.) );
@@ -456,6 +471,8 @@
         g_element& g_ptr = image.get_g_element(detail::PLOT_PLOT_LINES)
                                 .add_g_element();
 
+        g_ptr.clip_id(plot_window_clip);
+
         g_ptr.style().stroke_color(series.line_style.color);
         path_element& path = g_ptr.path();
 
@@ -522,6 +539,8 @@
 
         g_element& g_ptr = image.get_g_element(detail::PLOT_PLOT_LINES).add_g_element();
 
+        g_ptr.clip_id(plot_window_clip);
+
         g_ptr.style().stroke_color(series.line_style.color);
 
         path_element& path = g_ptr.path();
@@ -603,7 +622,7 @@
     {
         _clear_all();
 
-        // draw background
+        // Draw background.
         image.get_g_element(detail::PLOT_BACKGROUND).push_back(
                      new rect_element(0, 0, image.get_x_size(), 
                      image.get_y_size()));
@@ -612,6 +631,14 @@
         _calculate_plot_window();
         _calculate_transform();
 
+        // Define the clip path for the plot window.
+        // We don't want to allow overlap of the plot window lines, thus the
+        // minor adjustments.
+
+        image.clip_path(rect_element(plot_x1 + 1, plot_y1 + 1, 
+                                     plot_x2 - plot_x1 - 2, plot_y2 - plot_y1 - 2),
+                        plot_window_clip);
+
         if(use_axis)
         {
             _draw_y_axis();
@@ -628,11 +655,11 @@
             _draw_x_label();
         }
 
-        // draw lines
+        // Draw lines between non-limit points
 
         _draw_plot_lines();
 
-        // draw points
+        // Draw non-limit points.
         double x(0.), y(0.);
         for(unsigned int i=0; i<series.size(); ++i)
         {
@@ -657,6 +684,23 @@
                 }
             }
         }
+
+        // Draw limit points.
+        for(unsigned int i=0; i<series.size(); ++i)
+        {
+            g_element& g_ptr = image.get_g_element(detail::PLOT_LIMIT_POINTS);
+            
+            for(std::multimap<double,double>::const_iterator j = series[i].series_limits.begin(); 
+                j!=series[i].series_limits.end(); ++j)
+            {
+                x = j->first;
+                y = j->second;
+
+                _transform_point(x, y);
+                
+                _draw_plot_point(x, y, g_ptr, plot_point_style(blank, blank, 10, circle));
+            }
+        }
     }
 
 public:
@@ -693,6 +737,9 @@
     image.get_g_element(detail::PLOT_BACKGROUND)
         .style().fill_color(white);
 
+    image.get_g_element(detail::PLOT_LIMIT_POINTS)
+        .style().stroke_color(lightgray).fill_color(whitesmoke);
+
     image.get_g_element(detail::PLOT_Y_AXIS)
         .style().stroke_color(black);
 
Modified: sandbox/SOC/2007/visualization/boost/svg_plot/svg_test.cpp
==============================================================================
--- sandbox/SOC/2007/visualization/boost/svg_plot/svg_test.cpp	(original)
+++ sandbox/SOC/2007/visualization/boost/svg_plot/svg_test.cpp	2007-08-08 13:31:18 EDT (Wed, 08 Aug 2007)
@@ -4,7 +4,6 @@
 #include <vector>
 #include <cmath>
 #include <map>
-#include <iostream>
 #include <limits>
 
 using std::multimap;
@@ -25,7 +24,6 @@
     return tan(x);
 }
 
-
 class dConvert
 {
 public:
@@ -37,8 +35,6 @@
     }
 };
 
-using namespace std;
-
 int main()
 {
     using namespace boost::svg;
@@ -50,13 +46,16 @@
     svg_1d_plot my_1d_plot;
 
     double pi = 3.1415926535;
-  
+
+    data2[.5] = std::numeric_limits<double>::max();
+    data2[1.3] = std::numeric_limits<double>::infinity();
+    data2[2] = std::numeric_limits<double>::quiet_NaN();
+
     for(double i=0; i<10; i+=pi/8.)
     {
         data2[i] = g(i);
     }
 
-    cout<<"Done with first part"<<endl;
     // size/scale settings
     my_2d_plot.image_size(500, 350);