diff --git a/src/Chart.vala b/src/Chart.vala index 498ca3c..f1996e6 100644 --- a/src/Chart.vala +++ b/src/Chart.vala @@ -164,10 +164,10 @@ namespace CairoChart { for (var si = 0, max_i = series.length; si < max_i; ++si) { var s = series[si]; if (!s.zoom_show) continue; - var real_x0 = get_real_x (s, rect.x); - var real_x1 = get_real_x (s, x1); - var real_y0 = get_real_y (s, rect.y); - var real_y1 = get_real_y (s, y1); + var real_x0 = s.get_real_x (rect.x); + var real_x1 = s.get_real_x (x1); + var real_y0 = s.get_real_y (rect.y); + var real_y1 = s.get_real_y (y1); // if selected square does not intersect with the series's square if ( real_x1 <= s.axis_x.zoom_min || real_x0 >= s.axis_x.zoom_max || real_y0 <= s.axis_y.zoom_min || real_y1 >= s.axis_y.zoom_max) { @@ -375,34 +375,6 @@ namespace CairoChart { context.stroke (); } - 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)); - } - - 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)); - } - - public virtual Point128 get_scr_point (Series s, Point128 p) { - return Point128 (get_scr_x(s, p.x), get_scr_y(s, p.y)); - } - - public virtual Float128 get_real_x (Series s, double scr_x) { - return s.axis_x.zoom_min + ((scr_x - plot_x_min) / (plot_x_max - plot_x_min) - s.place.zoom_x_min) - * (s.axis_x.zoom_max - s.axis_x.zoom_min) / (s.place.zoom_x_max - s.place.zoom_x_min); - } - - public virtual Float128 get_real_y (Series s, double scr_y) { - return s.axis_y.zoom_min + ((plot_y_max - scr_y) / (plot_y_max - plot_y_min) - s.place.zoom_y_min) - * (s.axis_y.zoom_max - s.axis_y.zoom_min) / (s.place.zoom_y_max - s.place.zoom_y_min); - } - - public virtual Point128 get_real_point (Series s, Point128 p) { - return Point128 (get_real_x(s, p.x), get_real_y(s, p.y)); - } - protected virtual bool x_in_plot_area (double x) { if (math.x_in_range(x, plot_x_min, plot_x_max)) return true; @@ -415,7 +387,7 @@ namespace CairoChart { return false; } - public virtual bool point_in_plot_area (Point128 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; diff --git a/src/Cursor.vala b/src/Cursor.vala index 90309e6..4c76d9c 100644 --- a/src/Cursor.vala +++ b/src/Cursor.vala @@ -36,8 +36,8 @@ namespace CairoChart { bool show_date; bool show_time; bool show_y; - Point128 scr_point; - Point128 scr_value_point; + Point scr_point; + Point scr_value_point; } protected struct CursorCrossings { uint cursor_index; @@ -84,9 +84,9 @@ namespace CairoChart { switch (chart.cursor_style.orientation) { case Orientation.VERTICAL: Float128 y = 0.0; - if (chart.math.vcross(chart.get_scr_point(s, points[i]), chart.get_scr_point(s, points[i+1]), chart.rel2scr_x(c.x), + if (chart.math.vcross(s.get_scr_point(points[i]), s.get_scr_point(points[i+1]), chart.rel2scr_x(c.x), chart.plot_y_min, chart.plot_y_max, out y)) { - var point = Point128(chart.get_real_x(s, chart.rel2scr_x(c.x)), chart.get_real_y(s, y)); + var point = Point128(s.get_real_x(chart.rel2scr_x(c.x)), s.get_real_y(y)); Point128 size; bool show_x, show_date, show_time, show_y; cross_what_to_show(chart, s, out show_x, out show_time, out show_date, out show_y); calc_cross_sizes (chart, s, point, out size, show_x, show_time, show_date, show_y); @@ -96,9 +96,9 @@ namespace CairoChart { break; case Orientation.HORIZONTAL: Float128 x = 0.0; - if (chart.math.hcross(chart.get_scr_point(s, points[i]), chart.get_scr_point(s, points[i+1]), + if (chart.math.hcross(s.get_scr_point(points[i]), s.get_scr_point(points[i+1]), chart.plot_x_min, chart.plot_x_max, chart.rel2scr_y(c.y), out x)) { - var point = Point128(chart.get_real_x(s, x), chart.get_real_y(s, chart.rel2scr_y(c.y))); + var point = Point128(s.get_real_x(x), s.get_real_y(chart.rel2scr_y(c.y))); Point128 size; bool show_x, show_date, show_time, show_y; cross_what_to_show(chart, s, out show_x, out show_time, out show_date, out show_y); calc_cross_sizes (chart, s, point, out size, show_x, show_time, show_date, show_y); @@ -122,9 +122,9 @@ namespace CairoChart { for (var cci = 0, max_cci = chart.cursors_crossings[ccsi].crossings.length; cci < max_cci; ++cci) { // TODO: Ticket #142: find smart algorithm of cursors values placements unowned CursorCross[] cr = chart.cursors_crossings[ccsi].crossings; - cr[cci].scr_point = chart.get_scr_point (chart.series[cr[cci].series_index], cr[cci].point); + cr[cci].scr_point = chart.series[cr[cci].series_index].get_scr_point (cr[cci].point); var d_max = double.max (cr[cci].size.x / 1.5, cr[cci].size.y / 1.5); - cr[cci].scr_value_point = Point128 (cr[cci].scr_point.x + d_max, cr[cci].scr_point.y - d_max); + cr[cci].scr_value_point = Point (cr[cci].scr_point.x + d_max, cr[cci].scr_point.y - d_max); } } } @@ -194,8 +194,8 @@ namespace CairoChart { var si = ccs[ci].series_index; var s = chart.series[si]; var p = ccs[ci].point; - var scrx = chart.get_scr_x(s, p.x); - var scry = chart.get_scr_y(s, p.y); + var scrx = s.get_scr_x(p.x); + var scry = s.get_scr_y(p.y); if (scrx < low.x) low.x = scrx; if (scry < low.y) low.y = scry; if (scrx > high.x) high.x = scrx; @@ -237,7 +237,7 @@ namespace CairoChart { // show joint X value if (chart.joint_x) { var s = chart.series[chart.zoom_first_show]; - var x = chart.get_real_x(s, chart.rel2scr_x(c.x)); + var x = s.get_real_x(chart.rel2scr_x(c.x)); string text = "", time_text = ""; switch (s.axis_x.type) { case Axis.Type.NUMBERS: @@ -295,7 +295,7 @@ namespace CairoChart { // show joint Y value if (chart.joint_y) { var s = chart.series[chart.zoom_first_show]; - var y = chart.get_real_y(s, chart.rel2scr_y(c.y)); + var y = s.get_real_y(chart.rel2scr_y(c.y)); var text_t = new Text(s.axis_y.format.printf((LongDouble)y, s.axis_y.font_style)); var print_y = s.compact_rec_y_pos (y, text_t); var print_x = 0.0; @@ -383,12 +383,12 @@ namespace CairoChart { if (chart.series.length == 0) return false; if (chart.cursors.length() + (chart.is_cursor_active ? 1 : 0) != 2) return false; if (chart.joint_x && chart.cursor_style.orientation == Orientation.VERTICAL) { - Float128 val1 = chart.get_real_x (chart.series[chart.zoom_first_show], chart.rel2scr_x(chart.cursors.nth_data(0).x)); + Float128 val1 = chart.series[chart.zoom_first_show].get_real_x(chart.rel2scr_x(chart.cursors.nth_data(0).x)); Float128 val2 = 0; if (chart.is_cursor_active) - val2 = chart.get_real_x (chart.series[chart.zoom_first_show], chart.rel2scr_x(chart.active_cursor.x)); + val2 = chart.series[chart.zoom_first_show].get_real_x(chart.rel2scr_x(chart.active_cursor.x)); else - val2 = chart.get_real_x (chart.series[chart.zoom_first_show], chart.rel2scr_x(chart.cursors.nth_data(1).x)); + val2 = chart.series[chart.zoom_first_show].get_real_x(chart.rel2scr_x(chart.cursors.nth_data(1).x)); if (val2 > val1) delta = val2 - val1; else @@ -396,12 +396,12 @@ namespace CairoChart { return true; } if (chart.joint_y && chart.cursor_style.orientation == Orientation.HORIZONTAL) { - Float128 val1 = chart.get_real_y (chart.series[chart.zoom_first_show], chart.rel2scr_y(chart.cursors.nth_data(0).y)); + Float128 val1 = chart.series[chart.zoom_first_show].get_real_y(chart.rel2scr_y(chart.cursors.nth_data(0).y)); Float128 val2 = 0; if (chart.is_cursor_active) - val2 = chart.get_real_y (chart.series[chart.zoom_first_show], chart.rel2scr_y(chart.active_cursor.y)); + val2 = chart.series[chart.zoom_first_show].get_real_y(chart.rel2scr_y(chart.active_cursor.y)); else - val2 = chart.get_real_y (chart.series[chart.zoom_first_show], chart.rel2scr_y(chart.cursors.nth_data(1).y)); + val2 = chart.series[chart.zoom_first_show].get_real_y(chart.rel2scr_y(chart.cursors.nth_data(1).y)); if (val2 > val1) delta = val2 - val1; else diff --git a/src/Math.vala b/src/Math.vala index e77e0d2..b0c0d7a 100644 --- a/src/Math.vala +++ b/src/Math.vala @@ -46,13 +46,13 @@ namespace CairoChart { return false; } - public virtual bool point_in_rect (Point128 p, double x0, double x1, double y0, double y1) { + public virtual bool point_in_rect (Point p, double x0, double x1, double y0, double y1) { if (x_in_range(p.x, x0, x1) && y_in_range(p.y, y0, y1)) return true; return false; } - public virtual bool hcross (Point128 a1, Point128 a2, Float128 h_x1, Float128 h_x2, Float128 h_y, out Float128 x) { + public virtual bool hcross (Point a1, Point a2, double h_x1, double h_x2, double h_y, out double x) { x = 0; if (a1.y == a2.y) return false; if (a1.y >= h_y && a2.y >= h_y || a1.y <= h_y && a2.y <= h_y) return false; @@ -62,7 +62,7 @@ namespace CairoChart { return false; } - public virtual bool vcross (Point128 a1, Point128 a2, Float128 v_x, Float128 v_y1, Float128 v_y2, out Float128 y) { + public virtual bool vcross (Point a1, Point a2, double v_x, double v_y1, double v_y2, out double y) { y = 0; if (a1.x == a2.x) return false; if (a1.x >= v_x && a2.x >= v_x || a1.x <= v_x && a2.x <= v_x) return false; @@ -86,18 +86,18 @@ namespace CairoChart { } } - public virtual bool cut_line (Point128 p_min, Point128 p_max, Point128 a, Point128 b, out Point128 c, out Point128 d) { + public virtual bool cut_line (Point p_min, Point p_max, Point a, Point b, out Point c, out Point d) { int ncross = 0; Float128 x = 0, y = 0; - Point128 pc[4]; + Point pc[4]; if (hcross(a, b, p_min.x, p_max.x, p_min.y, out x)) - pc[ncross++] = Point128(x, p_min.y); + pc[ncross++] = Point(x, p_min.y); if (hcross(a, b, p_min.x, p_max.x, p_max.y, out x)) - pc[ncross++] = Point128(x, p_max.y); + pc[ncross++] = Point(x, p_max.y); if (vcross(a, b, p_min.x, p_min.y, p_max.y, out y)) - pc[ncross++] = Point128(p_min.x, y); + pc[ncross++] = Point(p_min.x, y); if (vcross(a, b, p_max.x, p_min.y, p_max.y, out y)) - pc[ncross++] = Point128(p_max.x, y); + pc[ncross++] = Point(p_max.x, y); c = a; d = b; if (ncross == 0) { diff --git a/src/Series.vala b/src/Series.vala index 82f9ae5..5bbba93 100644 --- a/src/Series.vala +++ b/src/Series.vala @@ -68,12 +68,12 @@ namespace CairoChart { line_style.set(chart); // draw series line for (int i = 1; i < points.length; ++i) { - Point128 c, d; + Point c, d; if (chart.math.cut_line ( - Point128(chart.plot_x_min, chart.plot_y_min), - Point128(chart.plot_x_max, chart.plot_y_max), - Point128(chart.get_scr_x(this, points[i - 1].x), chart.get_scr_y(this, points[i - 1].y)), - Point128(chart.get_scr_x(this, points[i].x), chart.get_scr_y(this, points[i].y)), + Point(chart.plot_x_min, chart.plot_y_min), + Point(chart.plot_x_max, chart.plot_y_max), + Point(get_scr_x(points[i - 1].x), get_scr_y(points[i - 1].y)), + Point(get_scr_x(points[i].x), get_scr_y(points[i].y)), out c, out d) ) { chart.context.move_to (c.x, c.y); @@ -82,9 +82,9 @@ namespace CairoChart { } 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 (Point128 (x, y))) + var x = get_scr_x(points[i].x); + var y = get_scr_y(points[i].y); + if (chart.point_in_plot_area (Point (x, y))) marker.draw_at_pos(chart, x, y); } } @@ -204,7 +204,7 @@ namespace CairoChart { axis_x.format_date_time(x, out text, out time_text); break; } - var scr_x = chart.get_scr_x (this, x); + var scr_x = get_scr_x (x); var text_t = new Text(text, axis_x.font_style, axis_x.color); var sz = axis_x.title.get_size(context); @@ -351,7 +351,7 @@ namespace CairoChart { if (joint_y) chart.set_source_rgba(chart.joint_axis_color); else chart.set_source_rgba(axis_y.color); var text = axis_y.format.printf((LongDouble)y); - var scr_y = chart.get_scr_y (this, y); + var scr_y = get_scr_y (y); var text_t = new Text(text, axis_y.font_style, axis_y.color); var text_sz = text_t.get_size(context); var sz = axis_y.title.get_size(context); @@ -470,14 +470,42 @@ namespace CairoChart { public virtual double compact_rec_x_pos (Float128 x, Text text) { var sz = text.get_size(chart.context); - return chart.get_scr_x(this, x) - sz.width / 2.0 + return get_scr_x(x) - sz.width / 2.0 - sz.width * (x - (axis_x.zoom_min + axis_x.zoom_max) / 2.0) / (axis_x.zoom_max - axis_x.zoom_min); } public virtual double compact_rec_y_pos (Float128 y, Text text) { var sz = text.get_size(chart.context); - return chart.get_scr_y(this, y) + sz.height / 2.0 + return get_scr_y(y) + sz.height / 2.0 + sz.height * (y - (axis_y.zoom_min + axis_y.zoom_max) / 2.0) / (axis_y.zoom_max - axis_y.zoom_min); } + + public virtual double get_scr_x (Float128 x) { + return chart.plot_x_min + (chart.plot_x_max - chart.plot_x_min) * (place.zoom_x_min + (x - axis_x.zoom_min) + / (axis_x.zoom_max - axis_x.zoom_min) * (place.zoom_x_max - place.zoom_x_min)); + } + + public virtual double get_scr_y (Float128 y) { + return chart.plot_y_max - (chart.plot_y_max - chart.plot_y_min) * (place.zoom_y_min + (y - axis_y.zoom_min) + / (axis_y.zoom_max - axis_y.zoom_min) * (place.zoom_y_max - place.zoom_y_min)); + } + + public virtual Point get_scr_point (Point128 p) { + return Point (get_scr_x(p.x), get_scr_y(p.y)); + } + + public virtual Float128 get_real_x (double scr_x) { + return axis_x.zoom_min + ((scr_x - chart.plot_x_min) / (chart.plot_x_max - chart.plot_x_min) - place.zoom_x_min) + * (axis_x.zoom_max - axis_x.zoom_min) / (place.zoom_x_max - place.zoom_x_min); + } + + public virtual Float128 get_real_y (double scr_y) { + return axis_y.zoom_min + ((chart.plot_y_max - scr_y) / (chart.plot_y_max - chart.plot_y_min) - place.zoom_y_min) + * (axis_y.zoom_max - axis_y.zoom_min) / (place.zoom_y_max - place.zoom_y_min); + } + + public virtual Point128 get_real_point (Point p) { + return Point128 (get_real_x(p.x), get_real_y(p.y)); + } } }