diff --git a/src/Chart.vala b/src/Chart.vala index ce86296..202468f 100644 --- a/src/Chart.vala +++ b/src/Chart.vala @@ -382,7 +382,7 @@ namespace CairoChart { + sz.height * (y - (s.axis_y.zoom_min + s.axis_y.zoom_max) / 2.0) / (s.axis_y.zoom_max - s.axis_y.zoom_min); } - protected CairoChart.Math math = new Math(); + public CairoChart.Math math = new Math(); protected virtual void draw_horizontal_axis () { for (var si = series.length - 1, nskip = 0; si >=0; --si) { @@ -697,17 +697,17 @@ namespace CairoChart { context.stroke (); } - protected virtual double get_scr_x (Series s, Float128 x) { + public virtual double get_scr_x (Series s, Float128 x) { return plot_x_min + (plot_x_max - plot_x_min) * (s.place.zoom_x_min + (x - s.axis_x.zoom_min) / (s.axis_x.zoom_max - s.axis_x.zoom_min) * (s.place.zoom_x_max - s.place.zoom_x_min)); } - protected virtual double get_scr_y (Series s, Float128 y) { + public virtual double get_scr_y (Series s, Float128 y) { return plot_y_max - (plot_y_max - plot_y_min) * (s.place.zoom_y_min + (y - s.axis_y.zoom_min) / (s.axis_y.zoom_max - s.axis_y.zoom_min) * (s.place.zoom_y_max - s.place.zoom_y_min)); } - protected virtual Point get_scr_point (Series s, Point p) { + public virtual Point get_scr_point (Series s, Point p) { return Point (get_scr_x(s, p.x), get_scr_y(s, p.y)); } @@ -737,7 +737,7 @@ namespace CairoChart { return false; } - protected virtual bool point_in_plot_area (Point p) { + public virtual bool point_in_plot_area (Point p) { if (math.point_in_rect (p, plot_x_min, plot_x_max, plot_y_min, plot_y_max)) return true; return false; @@ -746,28 +746,8 @@ namespace CairoChart { protected virtual void draw_series () { for (var si = 0; si < series.length; ++si) { var s = series[si]; - if (!s.zoom_show) continue; - if (s.points.length == 0) continue; - var points = math.sort_points(s, s.sort); - s.line_style.set(this); - // draw series line - for (int i = 1; i < points.length; ++i) { - Point c, d; - if (math.cut_line (Point(plot_x_min, plot_y_min), Point(plot_x_max, plot_y_max), - Point(get_scr_x(s, points[i - 1].x), get_scr_y(s, points[i - 1].y)), - Point(get_scr_x(s, points[i].x), get_scr_y(s, points[i].y)), - out c, out d)) { - context.move_to (c.x, c.y); - context.line_to (d.x, d.y); - } - } - context.stroke(); - for (int i = 0; i < points.length; ++i) { - var x = get_scr_x(s, points[i].x); - var y = get_scr_y(s, points[i].y); - if (point_in_plot_area (Point (x, y))) - s.marker.draw_at_pos(this, x, y); - } + if (s.zoom_show && s.points.length != 0) + s.draw(this); } } diff --git a/src/Series.vala b/src/Series.vala index 8400d48..8d9e60f 100644 --- a/src/Series.vala +++ b/src/Series.vala @@ -59,5 +59,31 @@ namespace CairoChart { public Series () { } + + public virtual void draw (Chart chart) { + var points = chart.math.sort_points(this, sort); + line_style.set(chart); + // draw series line + for (int i = 1; i < points.length; ++i) { + Point c, d; + if (chart.math.cut_line ( + Point(chart.plot_x_min, chart.plot_y_min), + Point(chart.plot_x_max, chart.plot_y_max), + Point(chart.get_scr_x(this, points[i - 1].x), chart.get_scr_y(this, points[i - 1].y)), + Point(chart.get_scr_x(this, points[i].x), chart.get_scr_y(this, points[i].y)), + out c, out d) + ) { + chart.context.move_to (c.x, c.y); + chart.context.line_to (d.x, d.y); + } + } + chart.context.stroke(); + for (int i = 0; i < points.length; ++i) { + var x = chart.get_scr_x(this, points[i].x); + var y = chart.get_scr_y(this, points[i].y); + if (chart.point_in_plot_area (Point (x, y))) + marker.draw_at_pos(chart, x, y); + } + } } }