$include_dir="/home/hyper-archives/boost-commit/include"; include("$include_dir/msg-header.inc") ?>
From: pbristow_at_[hidden]
Date: 2008-03-05 11:44:33
Author: pbristow
Date: 2008-03-05 11:44:32 EST (Wed, 05 Mar 2008)
New Revision: 43516
URL: http://svn.boost.org/trac/boost/changeset/43516
Log:
Changes to plot line to make area_fill work better.  Examples in 2d_area_fill.cpp also enhanced. 
area_fill(false) produces a black fill which is counter intuitive but dangerous to change svg_color constructor?
Text files modified: 
   sandbox/SOC/2007/visualization/boost/svg_plot/detail/svg_tag.hpp      |     1                                         
   sandbox/SOC/2007/visualization/boost/svg_plot/svg_2d_plot.hpp         |    82 +++++++++++++++-----------              
   sandbox/SOC/2007/visualization/boost/svg_plot/svg_color.hpp           |     9 ++                                      
   sandbox/SOC/2007/visualization/boost/svg_plot/svg_style.hpp           |     5                                         
   sandbox/SOC/2007/visualization/libs/svg_plot/example/2d_area_fill.cpp |   124 ++++++++++++++++++++++++++------------- 
   5 files changed, 137 insertions(+), 84 deletions(-)
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	2008-03-05 11:44:32 EST (Wed, 05 Mar 2008)
@@ -1300,7 +1300,6 @@
         o_str << "\"";
 
         write_attributes(o_str); // id & clip_path
-
         style_info_.write(o_str); // fill, stroke, width...
 
         if(!fill)
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	2008-03-05 11:44:32 EST (Wed, 05 Mar 2008)
@@ -14,6 +14,7 @@
 #ifdef _MSC_VER
 #pragma warning(push)
 #  pragma warning (disable : 4800) // forcing value to bool 'true' or 'false' (performance warning)
+#  pragma warning (disable : 4512) // assignment operator could not be generated
 #endif
 
 #include <boost/iterator/transform_iterator.hpp>
@@ -50,6 +51,11 @@
     // -----------------------------------------------------------------
     class svg_2d_plot_series
     {
+    //protected: // TODO this causes trouble.
+
+    friend svg_2d_plot_series;
+    friend void draw_straight_lines(const svg_2d_plot_series&);
+
     public:
       // 2-D Data series points to plot.
       std::multimap<double, double> series; // Normal 'OK to plot' data values.
@@ -63,6 +69,7 @@
       plot_point_style point_style_;
       plot_point_style limit_point_style_;
       plot_line_style line_style_;
+    public:
 
       template <class T>
       svg_2d_plot_series(T begin, T end, // of data series.
@@ -79,18 +86,19 @@
 
       { // Constructor.
         for(T i = begin; i != end; ++i)
-        { // Sort into normal and limited series.
+        { // Sort data points into normal and limited series.
           if(detail::pair_is_limit(*i))
           { // Either x and/or y is at limit.
             series_limits.insert(*i);
           }
           else
-          { // normal data values for both x and y.
+          { // Normal data values for both x and y.
             series.insert(*i);
           }
         }
       } // svg_2d_plot_series
 
+
       // Set functions for the plot series.
       svg_2d_plot_series& fill_color(const svg_color& col_)
       { // Point fill color.
@@ -125,6 +133,8 @@
       svg_2d_plot_series& area_fill(const svg_color& col_)
       {
         line_style_.area_fill_ = col_;
+        // Note that area_fill(true) will produce a *blank* color, and so NO FILL.
+        // area_fill(false) will produce the default non-blank color (black?).
         return *this;
       }
 
@@ -146,7 +156,7 @@
         return *this;
       }
 
-       // Get functions for the plot series.
+      // Get functions for the plot series.
       plot_line_style line_style()
       {
         return line_style_;
@@ -192,6 +202,7 @@
     class svg_2d_plot : public detail::axis_plot_frame<svg_2d_plot>
     { // See also svg_1d_plot.hpp for 1-D version.
      friend void show_plot_settings(svg_2d_plot&);
+     friend svg_2d_plot_series;
 
     private:
       // Member data names conventionally end with _,
@@ -287,7 +298,7 @@
     public: // of class svg_2d_plot: public detail::axis_plot_frame<svg_2d_plot>
 
       svg_2d_plot() // Constructor, including all the very many default plot options,
-        // some which use some or all of the class defaults.
+        // some of which use some or all of the class defaults.
         :
       // TODO check that *all* options are initialized here.
       // See documentation for default settings rationale.
@@ -384,7 +395,7 @@
         // Grids.
         // Default color & width for grid, used or not.
         image.g(PLOT_X_MAJOR_GRID).style().stroke_width(x_ticks_.major_grid_width_).stroke_color(svg_color(200, 220, 255));
-        BOOST_ASSERT(image.g(PLOT_X_MAJOR_GRID).style().stroke_color() == svg_color(200, 220, 255));
+        // BOOST_ASSERT(image.g(PLOT_X_MAJOR_GRID).style().stroke_color() == svg_color(200, 220, 255));
         image.g(PLOT_X_MINOR_GRID).style().stroke_width(x_ticks_.minor_grid_width_).stroke_color(svg_color(200, 220, 255));
         image.g(PLOT_Y_MAJOR_GRID).style().stroke_width(y_ticks_.major_grid_width_).stroke_color(svg_color(200, 220, 255));
         image.g(PLOT_Y_MINOR_GRID).style().stroke_width(y_ticks_.minor_grid_width_).stroke_color(svg_color(200, 220, 255));
@@ -719,7 +730,7 @@
             image.g(detail::PLOT_Y_AXIS).line(plot_left_, plot_top_, plot_left_, plot_bottom_);
           }
           else if (y_axis_position_ == right)
-          {// Draw on the lright of plot window.
+          {// Draw on the right of plot window.
             image.g(detail::PLOT_Y_AXIS).line(plot_right_, plot_top_, plot_right_, plot_bottom_);
           }
           else
@@ -836,32 +847,31 @@
         if((y < plot_top_ - 0.01) || (y > plot_bottom_ + 0.01))
           // Allow a bit extra to allow for round-off errors.
         { // tick value is way outside plot window, so nothing to do.
-          // std::cout << y << std::endl;
           return;
         }
         double x_left(0.); // Left end of tick.
         double x_right(image.y_size()); // Right end of tick.
-        if(y_ticks_.major_grid_on_)
-        { // Draw horizontal major grid line.
-          if(!plot_window_on_ != 0)
+        if(y_ticks_.major_grid_on_ == true)
+        { // Draw horizontal major Y grid line.
+          if(!plot_window_on_ == true)
           { 
-            if(y_ticks_.major_value_labels_side_ < 0)
+            if(y_ticks_.major_value_labels_side_ < 0) // left
             { // Start further right to give space for y axis value label.
               y -= y_value_label_style_.font_size() * text_margin_;
             }
 
-            if(y_ticks_.left_ticks_on_)
-            { // And similarly for left ticks.
+            if(y_ticks_.left_ticks_on_ == true)
+            { // And similarly space for left ticks.
               y -= y_ticks_.major_tick_length_;
             }
           }
           else
           { // plot_window_on_ to use full width of plot window.
-            x_left = plot_left_ + plot_window_border_.width_; // Don't write over border.
+            x_left = plot_left_ + plot_window_border_.width_; // Don't write over either border.
             x_right = plot_right_ - plot_window_border_.width_;
-            grid_path.M(x_left, y).L(x_right, y); // Horizontal grid line.
           }
-        } // y_major_grid_on
+          grid_path.M(x_left, y).L(x_right, y); // Horizontal grid line.
+       } // y_major_grid_on
 
         // Draw major ticks & value label, if necessary.
         double y_tick_length = y_ticks_.major_tick_length_;
@@ -1067,11 +1077,14 @@
             x_right = plot_right_ - plot_window_border_.width_; // Ensure just *inside* window?
           }
           if((y >= plot_top_) && (y <= plot_bottom_) && (x_left >= plot_left_) && (x_right <= plot_right_) )
-          { // Make sure that we are drawing inside the allowed window.
+          { // Make sure that we are drawing inside the allowed plot window.
             // Note comparisons are 'upside-down' - y is increasing downwards!
             grid_path.M(x_left, y).L(x_right, y); // Draw grid line.
           }
-          // TODO else just ignore outside plot window?
+          else
+          {
+            // Just ignore outside plot window
+          }
         } // y_minor_grid
 
         // Draw y minor ticks.
@@ -1120,13 +1133,13 @@
         g_element& g_ptr = image.g(detail::PLOT_DATA_LINES).g();
         g_ptr.clip_id(plot_window_clip_);
         g_ptr.style().stroke_color(series.line_style_.color_);
-        g_ptr.style().fill_color(series.line_style_.area_fill_);
+        //g_ptr.style().fill_color(series.line_style_.area_fill_); // Now set in path below
         g_ptr.style().stroke_width(series.line_style_.width_);
         path_element& path = g_ptr.path();
         path.style().fill_color(series.line_style_.area_fill_);
 
         bool is_fill = !series.line_style_.area_fill_.blank;
-        path.fill = is_fill; // Ensure includes a fill="none".
+        path.fill = is_fill; // Ensure includes a fill="none" if no fill.
 
         if(series.series.size() > 1)
         { // Need at least two points for a line ;-)
@@ -1136,21 +1149,21 @@
           // we first have to move from the X-axis (y = 0) to the first point,
           // and again at the end after the last point.
           prev_x = (*j).first;
-          prev_y = 0.;
+          prev_y = 0.; // X-axis.
           transform_point(prev_x, prev_y);
           if(is_fill)
           { // Move to 1st point.
-            path.style().fill_color(series.line_style_.area_fill_);
+            //path.style().fill_color(series.line_style_.area_fill_); // Duplicates so no longer needed?
             path.M(prev_x, prev_y);
           }
           transform_y(prev_y = (*j).second);
           if(is_fill)
-          { // fill wanted.
-            path.style().fill_color(series.line_style_.area_fill_); // TODO why again?
+          { // Area fill wanted.
+            // path.style().fill_color(series.line_style_.area_fill_); // Duplicates so no longer needed?
             path.L(prev_x, prev_y); // Line from X-axis to 1st point.
           }
           else
-          { // fill == blank
+          { // Area fill == blank
             path.M(prev_x, prev_y);
           }
           ++j; // so now refers to 2nd point to plot.
@@ -1160,20 +1173,19 @@
             temp_x = (*j).first;
             temp_y = (*j).second;
             transform_point(temp_x, temp_y);
-            path.L(temp_x, temp_y); // line to next point.
-
-            if(is_fill)
-            {
-              path.M(temp_x, temp_y);
-            }
+            path.L(temp_x, temp_y); // Line to next point.
+            //if(is_fill) // This seems to stop area-fill and is not needed anyway.
+            //{
+            //  //path.M(temp_x, temp_y);
+            //}
             prev_x = temp_x;
             prev_y = temp_y;
-          } // for j
+          } // for j'th point
 
           if(is_fill)
-          { // fill wanted.
-            transform_y(temp_y = 0.); // X-axis line.
-            path.L(temp_x, temp_y).z(); // Close path with Z to terminate line.
+          { // Area fill wanted.
+            transform_y(temp_y = 0.); // X-axis line coordinate.
+            path.L(temp_x, temp_y).z(); // Draw line to X-axis & closepath with Z.
           }
         }
       } // draw_straight_lines
Modified: sandbox/SOC/2007/visualization/boost/svg_plot/svg_color.hpp
==============================================================================
--- sandbox/SOC/2007/visualization/boost/svg_plot/svg_color.hpp	(original)
+++ sandbox/SOC/2007/visualization/boost/svg_plot/svg_color.hpp	2008-03-05 11:44:32 EST (Wed, 05 Mar 2008)
@@ -95,11 +95,16 @@
         b = (unsigned char)(( blue > 255 ) ? 255 : blue);
     }
 
-    svg_color(bool is) : blank(is)
+    svg_color(bool is_blank) : blank(is_blank)
     { // Permits blank (=true) as a (non-)color.
+      // svg_color(true) returns blank (and color value as below).
+      // svg_color(false) returns color values below and NOT blank.
+      // So plot.area_fill(true) will be a blank == no fill!
+      // So plot.area_fill(false) will be a default(black) fill!
+      // This is somewhat counter-intuitive!
       r = 0; // Safer to assign *some* value to rgb? zero, or 255?
       g = 0; // rather than leaving them random?
-      b = 0;
+      b = 0; // Default 'blank' color 0,0,0 is black.
     }
 
     svg_color(svg_color_constant col) : blank(false)
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	2008-03-05 11:44:32 EST (Wed, 05 Mar 2008)
@@ -1,7 +1,7 @@
 // svg_style.hpp 
 
 // Copyright Jacob Voytko 2007
-// Copyright Paul A. Bristow 2007
+// Copyright Paul A. Bristow 2008
 // Use, modification and distribution are subject to the
 // Boost Software License, Version 1.0.
 // (See accompanying file LICENSE_1_0.txt
@@ -13,7 +13,6 @@
 // svg style information is fill, stroke, width, line & bezier curve.
 // This module provides struct plot_point_style & struct plot_line_style
 // and class svg_style holding the styles.
-
 // http://www.w3.org/TR/SVG11/styling.html 
 
 #include "svg_color.hpp"
@@ -819,7 +818,7 @@
       { // Range too small to display.
         throw std::runtime_error("Axis ticks & labels range too small!" );
       }
-  }
+  } // ticks_labels_style constructor.
 
   double label_length(double value)
   { // Find the length of label for a value.
Modified: sandbox/SOC/2007/visualization/libs/svg_plot/example/2d_area_fill.cpp
==============================================================================
--- sandbox/SOC/2007/visualization/libs/svg_plot/example/2d_area_fill.cpp	(original)
+++ sandbox/SOC/2007/visualization/libs/svg_plot/example/2d_area_fill.cpp	2008-03-05 11:44:32 EST (Wed, 05 Mar 2008)
@@ -4,36 +4,47 @@
 // For more information, see http://www.boost.org
 // -----------------------------------------------------------------
 
-#ifdef _MSC_VER
-#  pragma warning (disable : 4180) // qualifier applied to function type has no meaning; ignored
-#  pragma warning (disable : 4503) // decorated name length exceeded, name was truncated
-#  pragma warning (disable : 4512) // assignment operator could not be generated
-#  pragma warning (disable : 4224) // nonstandard extension used : formal parameter 'function_ptr' was previously defined as a type
-#  pragma warning (disable : 4127) // conditional expression is constant
-#endif
-
 #include <boost/svg_plot/svg_2d_plot.hpp>
-#include <map>
-#include <cmath>
+  using namespace boost::svg; // Needed to get svg colors and others.
+  using boost::svg::svg_2d_plot;
 
-using std::map;
-using namespace boost::svg;
+#include <map> 
+  using std::map;
+#include <cmath>
+  using ::sin;
+  using ::cos;
+  using ::tan;
 
-double f(double x)
+double my_sin(double x)
 {
         return 50. * sin(x);
 }
 
+double my_cos(double x)
+{
+	return 50. * cos(x);
+}
+
+
+double my_tan(double x)
+{
+  return 50. * tan(x);
+}
+
 int main()
 {
-	map<double, double> data1;
+	map<double, double> data_sin;
+	map<double, double> data_cos;
+	map<double, double> data_tan;
         
-    double inter = 3.14159265 / 8.;
+  double inter = 3.14159265 / 8.; // 16 points per cycle of 2 pi.
 
-	for(double i=0; i<=10.; i+=inter)
-	{
-		data1[i] = f(i);
-	}
+	for(double i = 0; i <= 10.; i+=inter)
+	{ // Just 10 data points for each function.
+		data_sin[i] = my_sin(i);
+		data_cos[i] = my_cos(i);
+		data_tan[i] = my_tan(i);
+	} // for
 
         svg_2d_plot my_plot;
 
@@ -41,29 +52,32 @@
         my_plot.image_size(700, 500)
                .x_range(-1, 10)
                .y_range(-75, 75);
-           
 
         // Text settings.
-	my_plot.title("Plot of 50 * sin(x)")
-	       .title_font_size(29)
-	       .x_label("X Axis Units")
-           .y_major_value_labels_side(true)
-           .y_major_grid_on(true);
-	
+	my_plot.title("Plot of 50 * sin(x), cos(x) and tan(x)")
+	       .title_font_size(20)
+	       .x_label("x")
+	       .y_label("50 * f(x)")
+         .x_major_value_labels_side(bottom)
+         .y_major_value_labels_side(left)
+         .x_major_grid_on(true)
+         .y_major_grid_on(true)
+         .x_major_grid_color(cyan)
+         .y_major_grid_color(cyan)
+         ;
         // Commands.
         my_plot.plot_window_on(true)
                .x_label_on(true)
-	       .x_major_value_labels_side(true);
+         ;
         
         // Color settings.
-	my_plot.background_color(svg_color(67, 111, 69))
-	       .legend_background_color(svg_color(207, 202,167))
-	       .legend_border_color(svg_color(102, 102, 84))
-	       .plot_background_color(svg_color(136, 188, 126))
-	       .title_color(white)
-           .y_major_grid_color(black);
-
-	//X axis settings.
+	my_plot.background_color(whitesmoke)
+	       .legend_background_color(lightyellow)
+	       .legend_border_color(yellow)
+	       .plot_background_color(ghostwhite)
+	       .title_color(red)
+         ;
+	// X axis settings.
         my_plot.x_major_interval(2)
                .x_major_tick_length(14)
                .x_major_tick_width(1)
@@ -71,16 +85,40 @@
                .x_minor_tick_width(1)
                .x_num_minor_ticks(3)
         
-	//Y axis settings.
+	// Y axis settings.
                .y_major_interval(25)
                .y_num_minor_ticks(5);		
-
-	//legend settings
-	my_plot.legend_title_font_size(15);
         
-	my_plot.plot(data1, "Sqrt(x)").area_fill(red);
-
-    my_plot.write("./2d_area_fill.svg");
+	//svg_2d_plot_series& s1 = my_plot.plot(data1, "Sqrt(x)").area_fill(red);
+ // my_plot.write("./2d_area_fill.svg");
+ // std::cout << s1.area_fill() << std::endl;
+
+	svg_2d_plot_series& s_sin = my_plot.plot(data_sin, "sin(x)").area_fill(red);
+  std::cout << s_sin.area_fill() << std::endl;
+	svg_2d_plot_series& s_cos = my_plot.plot(data_cos, "cos(x)").area_fill(blue).shape(square);
+	// svg_2d_plot_series& s_cos = my_plot.plot(data_cos, "cos(x)").area_fill(true).shape(square);
+  // Note that svg_color(bool = true) returns a non-color blank, so no fill.
+  std::cout << s_cos.area_fill() << std::endl;
+	svg_2d_plot_series& s_tan = my_plot.plot(data_tan, "tan(x)").shape(cone);
+  std::cout << s_tan.area_fill() << std::endl;
+  my_plot.write("./2d_no_area_fill.svg");
 
         return 0;
-}
+} // int main()
+
+/*
+
+Output:
+
+Compiling...
+2d_area_fill.cpp
+Linking...
+Embedding manifest...
+Autorun "j:\Cpp\SVG\debug\2d_area_fill.exe"
+RGB(255,0,0)
+blank
+blank
+Build Time 0:03
+
+
+*/