$include_dir="/home/hyper-archives/boost-commit/include"; include("$include_dir/msg-header.inc") ?>
From: JakeVoytko_at_[hidden]
Date: 2007-07-29 17:31:48
Author: jakevoytko
Date: 2007-07-29 17:31:46 EDT (Sun, 29 Jul 2007)
New Revision: 7581
URL: http://svn.boost.org/trac/boost/changeset/7581
Log:
Added curve interpolation beta
Text files modified: 
   sandbox/SOC/2007/visualization/boost/svg_plot/detail/axis_plot_frame.hpp |     2                                         
   sandbox/SOC/2007/visualization/boost/svg_plot/detail/svg_tag.hpp         |    80 ++++++++++++++++++                      
   sandbox/SOC/2007/visualization/boost/svg_plot/svg_1d_plot.hpp            |     2                                         
   sandbox/SOC/2007/visualization/boost/svg_plot/svg_2d_plot.hpp            |   174 ++++++++++++++++++++++++++++----------- 
   sandbox/SOC/2007/visualization/boost/svg_plot/svg_style.hpp              |     5                                         
   sandbox/SOC/2007/visualization/boost/svg_plot/svg_test.cpp               |    31 ++++--                                  
   6 files changed, 226 insertions(+), 68 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-07-29 17:31:46 EDT (Sun, 29 Jul 2007)
@@ -652,7 +652,7 @@
         return derived();
     }
 
-    Derived& x_major_tick(double _inter)
+    Derived& x_major_interval(double _inter)
     {
         derived().x_major = _inter;
         return derived();
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-07-29 17:31:46 EDT (Sun, 29 Jul 2007)
@@ -441,6 +441,60 @@
     }
 };
 
+struct s_path: public path_point
+{
+    double x1, y1, x, y;
+    
+    void write(std::ostream& o_str)
+    {
+        if(relative)
+        {
+            o_str<<"s";
+        }
+
+        else
+        {
+            o_str<<"S";
+        }
+
+        o_str<<x1<<" "<<y1<<" "
+             <<x<<" "<<y<<" ";
+    }
+
+    s_path(double _x1, double _y1,
+           double _x, double _y, bool _rel = false):
+           x1(_x1), y1(_y1), x(_x), y(_y), path_point(_rel)
+    {
+        
+    }
+};
+
+struct t_path: public path_point
+{
+    double x, y;
+    
+    void write(std::ostream& o_str)
+    {
+        if(relative)
+        {
+            o_str<<"t";
+        }
+
+        else
+        {
+            o_str<<"T";
+        }
+
+        o_str<<x<<" "<<y<<" ";
+    }
+
+    t_path(double _x, double _y, bool _rel = false):
+           x(_x), y(_y), path_point(_rel)
+    {
+        
+    }
+};
+
 class path_element: public svg_element
 {
 private:
@@ -532,6 +586,30 @@
         return *this;
     }
 
+    path_element& s(double x1, double y1, double x, double y)
+    {
+        path.push_back(new s_path(x1, y1, x, y, true));
+        return *this;
+    }
+    
+    path_element& S(double x1, double y1, double x, double y)
+    {
+        path.push_back(new s_path(x1, y1, x, y, false));
+        return *this;
+    }
+
+    path_element& t(double x, double y)
+    {
+        path.push_back(new t_path(x, y, true));
+        return *this;
+    }
+
+    path_element& T(double x, double y)
+    {
+        path.push_back(new t_path(x, y, false));
+        return *this;
+    }
+
     void write(std::ostream& o_str)
     {
         o_str<<"<path d=\"";
@@ -546,7 +624,7 @@
         
         style_info.write(o_str);
 
-        o_str<<"/>";
+        o_str<<"fill = \"none\" />";
     }
 };
 
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-07-29 17:31:46 EDT (Sun, 29 Jul 2007)
@@ -12,7 +12,7 @@
 #ifndef _BOOST_SVG_SVG_1D_PLOT_HPP
 #define _BOOST_SVG_SVG_1D_PLOT_HPP
 
-#define BOOST_PARAMETER_MAX_ARITY 11
+#define BOOST_PARAMETER_MAX_ARITY 12
 
 #include <boost/bind.hpp>
 
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-07-29 17:31:46 EDT (Sun, 29 Jul 2007)
@@ -10,7 +10,7 @@
 #ifndef _BOOST_SVG_SVG_2D_PLOT_HPP
 #define _BOOST_SVG_SVG_2D_PLOT_HPP
 
-#define BOOST_PARAMETER_MAX_ARITY 11
+#define BOOST_PARAMETER_MAX_ARITY 12
 
 #include <boost/bind.hpp>
 
@@ -60,6 +60,7 @@
 #endif
 
 BOOST_PARAMETER_NAME(line_on)
+BOOST_PARAMETER_NAME(bezier_on)
 BOOST_PARAMETER_NAME(line_color)
 BOOST_PARAMETER_NAME(area_fill_color)
 
@@ -430,73 +431,145 @@
         }
     }
 
-    void _draw_plot_lines()
+    void _transform_pair(std::pair<double, double>& pt)
     {
-        double prev_x, prev_y, temp_x(0.), temp_y(0.);
-     
-        for(unsigned int i = 0; i < series.size(); ++i)
+        _transform_point(pt.first, pt.second);
+    }
+
+    void _draw_bezier_lines(const svg_2d_plot_series& series)
+    {
+        g_element& g_ptr = image.get_g_element(detail::PLOT_PLOT_LINES)
+                                .add_g_element();
+
+        g_ptr.style().stroke_color(series.line_style.color);
+        path_element& path = g_ptr.path();
+
+        std::pair<double, double> n_minus_2, n_minus_1, n;
+        std::pair<double, double> fwd_vtr, back_vtr;
+
+        if(series.series.size() > 2)
         {
-            g_element& g_ptr = image.get_g_element(detail::PLOT_PLOT_LINES).add_g_element();
+            std::multimap<double,double>::const_iterator iter = series.series.begin();
 
-            g_ptr.style().stroke_color(series[i].line_style.color);
+            n_minus_1 = *(iter++);
+            n = *(iter++);
 
-            path_element& path = g_ptr.path();
+            _transform_pair(n_minus_1);
+            _transform_pair(n);
+    
+            path.M(n_minus_1.first, n_minus_1.second);
 
-            if(series[i].series.size() > 1)
+            for(; iter != series.series.end(); ++iter)
             {
-                std::multimap<double, double>::const_iterator j = series[i].series.begin();
-                prev_x = (*j).first;
-                prev_y = 0.;
+                n_minus_2 = n_minus_1;
+                n_minus_1 = n;
+                n = *iter;
 
-                // If we have to fill the area under the plot, we first have to
-                // move from the X-axis to the first point.
+                _transform_pair(n);
 
-                _transform_point(prev_x, prev_y);
+                back_vtr.first = ((n_minus_1.first - n.first) + 
+                                 (n_minus_2.first - n_minus_1.first)) * .2;
 
-                if(series[i].line_style.area_fill != blank)
-                {
-                    path.style().fill_color(series[i].line_style.area_fill);
-                    path.M(prev_x, prev_y);
-                }
+                back_vtr.second = ((n_minus_1.second - n.second) +
+                                  (n_minus_2.second - n_minus_1.second)) * .2;
 
-                
-                _transform_y(prev_y = (*j).second);
+                path.S(n_minus_1.first + back_vtr.first, n_minus_1.second + back_vtr.second,
+                       n_minus_1.first, n_minus_1.second);
+            }
 
-                if(series[i].line_style.area_fill != blank)
-                {
-                    path.style().fill_color(series[i].line_style.area_fill);
-                    path.L(prev_x, prev_y);
-                }
+            back_vtr.first = 0;
+            back_vtr.second = (n.second - n_minus_1.second)*.2;
 
-                else
-                {
-                    path.M(prev_x, prev_y);
-                }
-                ++j;
+            path.S(n.first + back_vtr.first, n.second + back_vtr.second,
+                   n.first, n.second);
+        }
 
-                for(; j != series[i].series.end(); ++j)
-                {
-                    temp_x = (*j).first;
-                    temp_y = (*j).second;
+        else
+        {
+            _draw_straight_lines(series);
+        }
+        
+    }
+
+    void _draw_straight_lines(const svg_2d_plot_series& series)
+    {
+        double prev_x, prev_y, temp_x(0.), temp_y;
 
-                    _transform_point(temp_x, temp_y);
+        g_element& g_ptr = image.get_g_element(detail::PLOT_PLOT_LINES).add_g_element();
 
-                    path.L(temp_x, temp_y);
-                    
-                    if(series[i].line_style.area_fill == blank)
-                    {
-                        path.M(temp_x, temp_y);
-                    }
+        g_ptr.style().stroke_color(series.line_style.color);
 
-                    prev_x = temp_x;
-                    prev_y = temp_y;
-                }
+        path_element& path = g_ptr.path();
+
+        if(series.series.size() > 1)
+        {
+            std::multimap<double, double>::const_iterator j = series.series.begin();
+            prev_x = (*j).first;
+            prev_y = 0.;
+
+            // If we have to fill the area under the plot, we first have to
+            // move from the X-axis to the first point.
+
+            _transform_point(prev_x, prev_y);
 
-                if(series[i].line_style.area_fill != blank)
+            if(series.line_style.area_fill != blank)
+            {
+                path.style().fill_color(series.line_style.area_fill);
+                path.M(prev_x, prev_y);
+            }
+
+            _transform_y(prev_y = (*j).second);
+
+            if(series.line_style.area_fill != blank)
+            {
+                path.style().fill_color(series.line_style.area_fill);
+                path.L(prev_x, prev_y);
+            }
+
+            else
+            {
+                path.M(prev_x, prev_y);
+            }
+            ++j;
+
+            for(; j != series.series.end(); ++j)
+            {
+                temp_x = (*j).first;
+                temp_y = (*j).second;
+
+                _transform_point(temp_x, temp_y);
+
+                path.L(temp_x, temp_y);
+                
+                if(series.line_style.area_fill == blank)
                 {
-                    _transform_y(temp_y = 0.);
-                    path.L(temp_x, temp_y).z();
+                    path.M(temp_x, temp_y);
                 }
+
+                prev_x = temp_x;
+                prev_y = temp_y;
+            }
+
+            if(series.line_style.area_fill != blank)
+            {
+                _transform_y(temp_y = 0.);
+                path.L(temp_x, temp_y).z();
+            }
+        }
+    }
+
+    void _draw_plot_lines()
+    {
+        for(unsigned int i = 0; i < series.size(); ++i)
+        {
+            if(series[i].line_style.bezier_on)
+            {
+                _draw_bezier_lines(series[i]);
+            }
+
+            else
+            {
+                _draw_straight_lines(series[i]);
             }
         }
     }
@@ -818,11 +891,12 @@
         (point_style, (point_shape), circle)
         (size, (int), 10)
         (line_on, (bool), true)
+        (bezier_on, (bool), false)
         (x_functor, *, boost_default_2d_convert())
     )
 )
 {
-    plot_line_style line_style(line_color, line_on);
+    plot_line_style line_style(line_color, line_on, bezier_on);
 
     if(area_fill_color != none)
     {
Modified: sandbox/SOC/2007/visualization/boost/svg_plot/svg_style.hpp
==============================================================================
--- sandbox/SOC/2007/visualization/boost/svg_plot/svg_style.hpp	(original)
+++ sandbox/SOC/2007/visualization/boost/svg_plot/svg_style.hpp	2007-07-29 17:31:46 EDT (Sun, 29 Jul 2007)
@@ -39,9 +39,10 @@
     svg_color_constant area_fill;
 
     bool line_on;
+    bool bezier_on;
 
-    plot_line_style(const svg_color& _col, bool _on):
-        color(_col), line_on(_on), area_fill(blank)
+    plot_line_style(const svg_color& _col, bool _on, bool _bezier_on = false):
+        color(_col), line_on(_on), area_fill(blank), bezier_on(_bezier_on)
     {
     }
 };
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-07-29 17:31:46 EDT (Sun, 29 Jul 2007)
@@ -10,17 +10,17 @@
 
 double f(double x)
 {
-    return sqrt(x);
+    return sin(x);
 }
 
 double g(double x)
 {
-    return -2 + x*x;
+    return cos(x);
 }
 
 double h(double x)
 {
-    return 2*x;
+    return tan(x);
 }
 
 
@@ -45,25 +45,30 @@
     svg_2d_plot my_2d_plot;
     svg_1d_plot my_1d_plot;
 
-    for(double i=0; i<10; i+=1)
+    double pi = 3.1415926535;
+  
+    for(double i=0; i<10; i+=pi/4.)
     {
-        data1[i - 5.] = f(i);
+        data1[i] = f(i);
         data2[i] = g(i);
-        data3.push_back(h(i) - 10.);
+        data3.push_back(h(i));
     }
 
     // size/scale settings
     my_2d_plot.image_size(500, 350);
 
     my_2d_plot.title("Hello, operator")
-           .plot_window_on(true)
-           .legend_on(true);
+           .plot_window_on(true);
 
     my_2d_plot.title_on(true)
            .x_label_on(true)
            .y_major_labels_on(true)
            .x_label("sqrt(x)")
-           .x_major_grid_on(false);
+           .x_major_grid_on(false)
+           .y_range(-1.1, 1.1)
+           .x_range(-.5, 10.5)
+           .y_major_interval(1)
+           .x_major_interval(pi/2.);
 //           .y_external_style_on(true)
 //           .x_external_style_on(true);
 
@@ -77,17 +82,17 @@
            .x_label_on(true)
            .x_label("sqrt(x)");
 
-    my_2d_plot.plot_2d(data1, "sqrt(x)");
+    my_2d_plot.plot(data1, "sqrt(x)", _bezier_on = true, _size = 5);
 
-    my_2d_plot.plot_2d(data2, "Not sqrt(x)", 
+    my_2d_plot.plot(data2, "Not sqrt(x)", 
         _size = 6,
         _point_style = square,
         _stroke_color = hotpink,
         _line_color = black,
         _fill_color = yellow,
-        _area_fill_color = red);
+        _bezier_on = true);
     
-    my_1d_plot.plot(data3, "1D Plot");
+//    my_2d_plot.plot(data3, "1D Plot", _bezier_on = true, _size = 5);
 
     my_1d_plot.write("./test1d.svg");
     my_2d_plot.write("./test2d.svg");