OK In progress...

This commit is contained in:
Kolan Sh 2018-01-20 20:07:06 +03:00
parent 5c8904d502
commit 545221c11f
7 changed files with 164 additions and 210 deletions

View File

@ -53,7 +53,7 @@ namespace CairoChart {
/**
* Constructs a new ``Area``.
*/
Area () { }
public Area () { }
/**
* Constructs a new ``Area`` with absolute coordinates.
@ -62,7 +62,7 @@ namespace CairoChart {
* @param x1 right bound.
* @param y1 bottom bound.
*/
Area.with_abs (double x0, double y0, double x1, double y1) {
public Area.with_abs (double x0, double y0, double x1, double y1) {
this.x0 = x0;
this.y0 = y0;
this.x1 = x1;
@ -76,7 +76,7 @@ namespace CairoChart {
* @param width ``Area`` width.
* @param height ``Area`` height.
*/
Area.with_rel (double x0, double y0, double width, double height) {
public Area.with_rel (double x0, double y0, double width, double height) {
this.x0 = x0;
this.y0 = y0;
this.width = width;
@ -87,18 +87,18 @@ namespace CairoChart {
* Constructs a new ``Area`` by other ``Area``.
* @param area ``Area`` instance.
*/
Area.with_area (Area area) {
public Area.with_area (Area area) {
this.x0 = area.x0;
this.y0 = area.y0;
this.x1 = area.x1;
this.y1 = area.y0;
this.y1 = area.y1;
}
/**
* Constructs a new ``Area`` by ``Cairo.Rectangle``.
* @param rectangle ``Cairo.Rectangle`` instance.
*/
Area.with_rectangle (Cairo.Rectangle rectangle) {
public Area.with_rectangle (Cairo.Rectangle rectangle) {
this.x0 = rectangle.x;
this.y0 = rectangle.y;
this.width = rectangle.width;

View File

@ -8,25 +8,22 @@ namespace CairoChart {
/**
* ``Chart`` Position.
*/
public Cairo.Rectangle area = Cairo.Rectangle();
public Area area = new Area();
/**
* Current evaluated area.
*/
public Cairo.Rectangle evarea = Cairo.Rectangle()
{ x = 0, y = 0, width = 1, height = 1 };
public Area evarea = new Area.with_abs(0, 0, 1, 1);
/**
* Zoom area limits (relative coordinates: 0.0-1.0).
*/
public Cairo.Rectangle zoom = Cairo.Rectangle()
{ x = 0, y = 0, width = 1, height = 1 };
public Area zoom = new Area.with_abs(0, 0, 1, 1);
/**
* Plot area bounds.
*/
public Cairo.Rectangle plarea = Cairo.Rectangle()
{ x = 0, y = 0, width = 1, height = 1 };
public Area plarea = new Area.with_abs(0, 0, 1, 1);
/**
* Cairo ``Context`` of the Drawing Area.
@ -109,21 +106,21 @@ namespace CairoChart {
*/
public Chart copy () {
var chart = new Chart ();
chart.area = this.area;
chart.area = this.area.copy();
chart.bg_color = this.bg_color;
chart.border_color = this.border_color;
chart.ctx = this.ctx;
chart.cursors = this.cursors.copy();
chart.evarea = this.evarea;
chart.evarea = this.evarea.copy();
chart.joint_color = this.joint_color;
chart.joint_x = this.joint_x;
chart.joint_y = this.joint_y;
chart.legend = this.legend.copy();
chart.plarea = this.plarea;
chart.plarea = this.plarea.copy();
chart.selection_style = this.selection_style;
chart.series = this.series;
chart.title = this.title.copy();
chart.zoom = this.zoom;
chart.zoom = this.zoom.copy();
chart.zoom_1st_idx = this.zoom_1st_idx;
return chart;
}
@ -143,7 +140,7 @@ namespace CairoChart {
*/
public virtual bool draw () {
evarea = area;
evarea = area.copy();
draw_title ();
fix_evarea ();
@ -177,26 +174,26 @@ namespace CairoChart {
/**
* Draws selection with a {@link selection_style} line style.
* @param rect selection square.
* @param area selection area.
*/
public virtual void draw_selection (Cairo.Rectangle rect) {
public virtual void draw_selection (Area area) {
selection_style.apply(this);
ctx.rectangle (rect.x, rect.y, rect.width, rect.height);
ctx.rectangle (area.x0, area.y0, area.width, area.height);
ctx.stroke();
}
/**
* Zooms the ``Chart``.
* @param rect selected zoom area.
* @param area selected zoom area.
*/
public virtual void zoom_in (Cairo.Rectangle rect) {
public virtual void zoom_in (Area area) {
foreach (var s in series) {
if (!s.zoom_show) continue;
var real_x0 = s.get_real_x (rect.x);
var real_x1 = s.get_real_x (rect.x + rect.width);
var real_x0 = s.get_real_x (area.x0);
var real_x1 = s.get_real_x (area.x1);
var real_width = real_x1 - real_x0;
var real_y0 = s.get_real_y (rect.y);
var real_y1 = s.get_real_y (rect.y + rect.height);
var real_y0 = s.get_real_y (area.y0);
var real_y1 = s.get_real_y (area.y1);
var real_height = real_y0 - real_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
@ -236,18 +233,18 @@ namespace CairoChart {
zoom_1st_idx = si;
break;
}
var new_zoom = zoom;
var rmpx = rect.x - plarea.x;
var new_zoom = zoom.copy();
var rmpx = area.x0 - plarea.x0;
var zdpw = zoom.width / plarea.width;
new_zoom.x += rmpx * zdpw;
var x_max = zoom.x + (rmpx + rect.width) * zdpw;
new_zoom.width = x_max - new_zoom.x;
var rmpy = rect.y - plarea.y;
new_zoom.x0 += rmpx * zdpw;
var x_max = zoom.x0 + (rmpx + area.width) * zdpw;
new_zoom.width = x_max - new_zoom.x0;
var rmpy = area.y0 - plarea.y0;
var zdph = zoom.height / plarea.height;
new_zoom.y += rmpy * zdph;
var y_max = zoom.y + (rmpy + rect.height) * zdph;
new_zoom.height = y_max - new_zoom.y;
zoom = new_zoom;
new_zoom.y0 += rmpy * zdph;
var y_max = zoom.y0 + (rmpy + area.height) * zdph;
new_zoom.height = y_max - new_zoom.y0;
zoom = new_zoom.copy();
}
/**
@ -255,7 +252,7 @@ namespace CairoChart {
*/
public virtual void zoom_out () {
foreach (var s in series) s.unzoom();
zoom = Cairo.Rectangle() { x = 0, y = 0, width = 1, height = 1 };
zoom = new Area.with_abs (0, 0, 1, 1);
zoom_1st_idx = 0;
}
@ -268,33 +265,35 @@ namespace CairoChart {
d.x /= -plarea.width; d.y /= -plarea.height;
var z = zoom;
var z = zoom.copy();
zoom_out();
d.x *= plarea.width; d.y *= plarea.height;
var x0 = plarea.x + plarea.width * z.x;
var x1 = plarea.x + plarea.width * (z.x + z.width);
var y0 = plarea.y + plarea.height * z.y;
var y1 = plarea.y + plarea.height * (z.y + z.height);
var x0 = plarea.x0 + plarea.width * z.x0;
var x1 = plarea.x0 + plarea.width * z.x1;
var y0 = plarea.y0 + plarea.height * z.y0;
var y1 = plarea.y0 + plarea.height * z.y1;
d.x *= z.width; d.y *= z.height;
var px1 = plarea.x + plarea.width;
var py1 = plarea.y + plarea.height;
var px1 = plarea.x1;
var py1 = plarea.y1;
if (x0 + d.x < plarea.x) d.x = plarea.x - x0;
if (x0 + d.x < plarea.x0) d.x = plarea.x0 - x0;
if (x1 + d.x > px1) d.x = px1 - x1;
if (y0 + d.y < plarea.y) d.y = plarea.y - y0;
if (y0 + d.y < plarea.y0) d.y = plarea.y0 - y0;
if (y1 + d.y > py1) d.y = py1 - y1;
zoom_in(Cairo.Rectangle() {
x = x0 + d.x,
y = y0 + d.y,
width = plarea.width * z.width,
height = plarea.height * z.height
});
zoom_in(
new Area.with_rel(
x0 + d.x,
y0 + d.y,
plarea.width * z.width,
plarea.height * z.height
)
);
}
protected virtual void fix_evarea () {
@ -307,9 +306,9 @@ namespace CairoChart {
}
protected virtual void eval_plarea () {
plarea.x = evarea.x + legend.spacing;
plarea.x0 = evarea.x0 + legend.spacing;
plarea.width = evarea.width - 2 * legend.spacing;
plarea.y = evarea.y + legend.spacing;
plarea.y0 = evarea.y0 + legend.spacing;
plarea.height = evarea.height - 2 * legend.spacing;
// Check for joint axes
@ -333,13 +332,13 @@ namespace CairoChart {
protected virtual void draw_plarea_border () {
color = border_color;
ctx.set_dash(null, 0);
ctx.rectangle(plarea.x, plarea.y, plarea.width, plarea.height);
ctx.rectangle(plarea.x0, plarea.y0, plarea.width, plarea.height);
ctx.stroke ();
}
protected virtual void draw_title () {
var sz = title.get_size(ctx);
var title_height = sz.height + title.vspacing * 2;
evarea.y += title_height;
evarea.y0 += title_height;
evarea.height -= title_height;
color = title.color;
ctx.move_to (area.width/2 - sz.width/2, sz.height + title.vspacing);

View File

@ -58,8 +58,8 @@ namespace CairoChart {
}
public virtual void set_active_cursor (Point p, bool remove = false) {
active_cursor.x = chart.zoom.x + (p.x - chart.plarea.x) / chart.plarea.width * chart.zoom.width;
active_cursor.y = chart.zoom.y + chart.zoom.height - (chart.plarea.y + chart.plarea.height - p.y) / chart.plarea.height * chart.zoom.height;
active_cursor.x = chart.zoom.x0 + (p.x - chart.plarea.x0) / chart.plarea.width * chart.zoom.width;
active_cursor.y = chart.zoom.y1 - (chart.plarea.y1 - p.y) / chart.plarea.height * chart.zoom.height;
is_cursor_active = ! remove;
}
@ -69,11 +69,11 @@ namespace CairoChart {
}
public virtual Float128 rel2scr_x(Float128 x) {
return chart.plarea.x + chart.plarea.width * (x - chart.zoom.x) / chart.zoom.width;
return chart.plarea.x0 + chart.plarea.width * (x - chart.zoom.x0) / chart.zoom.width;
}
public virtual Float128 rel2scr_y(Float128 y) {
return chart.plarea.y + chart.plarea.height * (y - chart.zoom.y) / chart.zoom.height;
return chart.plarea.y0 + chart.plarea.height * (y - chart.zoom.y0) / chart.zoom.height;
}
public virtual void remove_active_cursor () {
@ -84,12 +84,8 @@ namespace CairoChart {
foreach (var c in list) {
double d = distance;
switch (cursor_style.orientation) {
case Cursors.Orientation.VERTICAL:
d = (rel2scr_x(c.x) - rel2scr_x(active_cursor.x)).abs();
break;
case Cursors.Orientation.HORIZONTAL:
d = (rel2scr_y(c.y) - rel2scr_y(active_cursor.y)).abs();
break;
case Cursors.Orientation.VERTICAL: d = (rel2scr_x(c.x) - rel2scr_x(active_cursor.x)).abs(); break;
case Cursors.Orientation.HORIZONTAL: d = (rel2scr_y(c.y) - rel2scr_y(active_cursor.y)).abs(); break;
}
if (d < distance) {
distance = d;
@ -117,10 +113,8 @@ namespace CairoChart {
for (var ci = 0, max_ci = all_cursors.length(); ci < max_ci; ++ci) {
var c = all_cursors.nth_data(ci);
switch (cursor_style.orientation) {
case Orientation.VERTICAL:
if (c.x <= chart.zoom.x || c.x >= chart.zoom.x + chart.zoom.width) continue; break;
case Orientation.HORIZONTAL:
if (c.y <= chart.zoom.y || c.y >= chart.zoom.y + chart.zoom.height) continue; break;
case Orientation.VERTICAL: if (c.x <= chart.zoom.x0 || c.x >= chart.zoom.x1) continue; break;
case Orientation.HORIZONTAL: if (c.y <= chart.zoom.y0 || c.y >= chart.zoom.y1) continue; break;
}
CursorCross[] crossings = {};
@ -128,22 +122,14 @@ namespace CairoChart {
var s = chart.series[si];
if (!s.zoom_show) continue;
Point128[] points = {};
switch (cursor_style.orientation) {
case Orientation.VERTICAL:
points = Math.sort_points (s, s.sort);
break;
case Orientation.HORIZONTAL:
points = Math.sort_points (s, s.sort);
break;
}
var points = Math.sort_points (s, s.sort);
for (var i = 0; i + 1 < points.length; ++i) {
switch (cursor_style.orientation) {
case Orientation.VERTICAL:
Float128 y = 0.0;
if (Math.vcross(s.get_scr_point(points[i]), s.get_scr_point(points[i+1]), rel2scr_x(c.x),
chart.plarea.y, chart.plarea.y + chart.plarea.height, out y)) {
chart.plarea.y0, chart.plarea.y1, out y)) {
var point = Point128(s.get_real_x(rel2scr_x(c.x)), s.get_real_y(y));
Point128 size; bool show_x, show_date, show_time, show_y;
cross_what_to_show(s, out show_x, out show_time, out show_date, out show_y);
@ -155,7 +141,7 @@ namespace CairoChart {
case Orientation.HORIZONTAL:
Float128 x = 0.0;
if (Math.hcross(s.get_scr_point(points[i]), s.get_scr_point(points[i+1]),
chart.plarea.x, chart.plarea.x + chart.plarea.width, rel2scr_y(c.y), out x)) {
chart.plarea.x0, chart.plarea.x1, rel2scr_y(c.y), out x)) {
var point = Point128(s.get_real_x(x), s.get_real_y(rel2scr_y(c.y)));
Point128 size; bool show_x, show_date, show_time, show_y;
cross_what_to_show(s, out show_x, out show_time, out show_date, out show_y);
@ -244,8 +230,8 @@ namespace CairoChart {
calc_cursors_value_positions();
for (var cci = 0, max_cci = cursors_crossings.length; cci < max_cci; ++cci) {
var low = Point128(chart.plarea.x + chart.plarea.width, chart.plarea.y + chart.plarea.height); // low and high
var high = Point128(chart.plarea.x, chart.plarea.y); // points of the cursor
var low = Point128(chart.plarea.x1, chart.plarea.y1); // low and high
var high = Point128(chart.plarea.x0, chart.plarea.y0); // points of the cursor
unowned CursorCross[] ccs = cursors_crossings[cci].crossings;
cursor_style.line_style.apply(chart);
for (var ci = 0, max_ci = ccs.length; ci < max_ci; ++ci) {
@ -261,21 +247,21 @@ namespace CairoChart {
if (chart.joint_x) {
switch (s.axis_x.position) {
case Axis.Position.LOW: high.y = chart.plarea.y + chart.plarea.height + s.axis_x.font_spacing; break;
case Axis.Position.HIGH: low.y = chart.plarea.y - s.axis_x.font_spacing; break;
case Axis.Position.LOW: high.y = chart.plarea.y1 + s.axis_x.font_spacing; break;
case Axis.Position.HIGH: low.y = chart.plarea.y0 - s.axis_x.font_spacing; break;
case Axis.Position.BOTH:
high.y = chart.plarea.y + chart.plarea.height + s.axis_x.font_spacing;
low.y = chart.plarea.y - s.axis_x.font_spacing;
high.y = chart.plarea.y1 + s.axis_x.font_spacing;
low.y = chart.plarea.y0 - s.axis_x.font_spacing;
break;
}
}
if (chart.joint_y) {
switch (s.axis_y.position) {
case Axis.Position.LOW: low.x = chart.plarea.x - s.axis_y.font_spacing; break;
case Axis.Position.HIGH: high.x = chart.plarea.x + chart.plarea.width + s.axis_y.font_spacing; break;
case Axis.Position.LOW: low.x = chart.plarea.x0 - s.axis_y.font_spacing; break;
case Axis.Position.HIGH: high.x = chart.plarea.x1 + s.axis_y.font_spacing; break;
case Axis.Position.BOTH:
low.x = chart.plarea.x - s.axis_y.font_spacing;
high.x = chart.plarea.x + chart.plarea.width + s.axis_y.font_spacing;
low.x = chart.plarea.x0 - s.axis_y.font_spacing;
high.x = chart.plarea.x1 + s.axis_y.font_spacing;
break;
}
}
@ -298,27 +284,21 @@ namespace CairoChart {
var x = s.get_real_x(rel2scr_x(c.x));
string text = "", time_text = "";
switch (s.axis_x.type) {
case Axis.Type.NUMBERS:
text = s.axis_x.format.printf((LongDouble)x);
break;
case Axis.Type.DATE_TIME:
s.axis_x.format_date_time(x, out text, out time_text);
break;
default:
break;
case Axis.Type.NUMBERS: text = s.axis_x.format.printf((LongDouble)x); break;
case Axis.Type.DATE_TIME: s.axis_x.format_date_time(x, out text, out time_text); break;
}
var text_t = new Text(text, s.axis_x.font_style, s.axis_x.color);
var sz = text_t.get_size(chart.ctx);
var time_text_t = new Text(time_text, s.axis_x.font_style, s.axis_x.color);
var print_y = 0.0;
switch (s.axis_x.position) {
case Axis.Position.LOW: print_y = chart.area.y + chart.area.height - s.axis_x.font_spacing
case Axis.Position.LOW: print_y = chart.area.y1 - s.axis_x.font_spacing
- (chart.legend.position == Legend.Position.BOTTOM ? chart.legend.height : 0);
break;
case Axis.Position.HIGH:
var title_height = chart.title.get_height(chart.ctx) + (chart.legend.position == Legend.Position.TOP ?
chart.title.vspacing * 2 : chart.title.vspacing);
print_y = chart.area.y + title_height + s.axis_x.font_spacing
print_y = chart.area.y0 + title_height + s.axis_x.font_spacing
+ (chart.legend.position == Legend.Position.TOP ? chart.legend.height : 0);
switch (s.axis_x.type) {
case Axis.Type.NUMBERS:
@ -362,11 +342,11 @@ namespace CairoChart {
var print_x = 0.0;
switch (s.axis_y.position) {
case Axis.Position.LOW:
print_x = chart.area.x + s.axis_y.font_spacing
print_x = chart.area.x0 + s.axis_y.font_spacing
+ (chart.legend.position == Legend.Position.LEFT ? chart.legend.width : 0);
break;
case Axis.Position.HIGH:
print_x = chart.area.x + chart.area.width - text_t.get_width(chart.ctx) - s.axis_y.font_spacing
print_x = chart.area.x1 - text_t.get_width(chart.ctx) - s.axis_y.font_spacing
- (chart.legend.position == Legend.Position.RIGHT ? chart.legend.width : 0);
break;
}

View File

@ -202,20 +202,10 @@ namespace CairoChart {
case ProcessType.CALC:
height = leg_height_sum;
switch (position) {
case Position.TOP:
chart.evarea.y += height;
chart.evarea.height -= height;
break;
case Position.BOTTOM:
chart.evarea.height -= height;
break;
case Position.LEFT:
chart.evarea.x += width;
chart.evarea.width -= width;
break;
case Position.RIGHT:
chart.evarea.width -= width;
break;
case Position.TOP: chart.evarea.y0 += height; break;
case Position.BOTTOM: chart.evarea.y1 -= height; break;
case Position.LEFT: chart.evarea.x0 += width; break;
case Position.RIGHT: chart.evarea.x1 -= width; break;
}
break;
}

View File

@ -31,12 +31,12 @@ namespace CairoChart {
/**
* Constructs a new ``Range``.
*/
Range () { }
public Range () { }
/**
* Constructs a new ``Range`` with a ``Range`` instance.
*/
Range.with_range (Range range) {
public Range.with_range (Range range) {
this.low = range.low;
this.high = range.high;
}
@ -44,7 +44,7 @@ namespace CairoChart {
/**
* Constructs a new ``Range`` with absolute coordinates.
*/
Range.with_abs (double low, double high) {
public Range.with_abs (double low, double high) {
this.low = low;
this.high = high;
}
@ -52,9 +52,9 @@ namespace CairoChart {
/**
* Constructs a new ``Range`` with relative coordinates.
*/
Range.with_rel (double low, double range) {
public Range.with_rel (double low, double range) {
this.low = low;
this.high = low + range;
this.range = range;
}
/**

View File

@ -70,8 +70,8 @@ namespace CairoChart {
for (int i = 1; i < points.length; ++i) {
Point c, d;
if (Math.cut_line (
Point(chart.plarea.x, chart.plarea.y),
Point(chart.plarea.x + chart.plarea.width, chart.plarea.y + chart.plarea.height),
Point(chart.plarea.x0, chart.plarea.y0),
Point(chart.plarea.x1, chart.plarea.y1),
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)
@ -84,8 +84,8 @@ namespace CairoChart {
for (int i = 0; i < points.length; ++i) {
var x = get_scr_x(points[i].x);
var y = get_scr_y(points[i].y);
if (Math.point_in_rect (Point(x, y), chart.plarea.x, chart.plarea.x + chart.plarea.width,
chart.plarea.y, chart.plarea.y + chart.plarea.height))
if (Math.point_in_rect (Point(x, y), chart.plarea.x0, chart.plarea.x1,
chart.plarea.y0, chart.plarea.y1))
marker.draw_at_pos(chart, x, y);
}
}
@ -135,43 +135,39 @@ namespace CairoChart {
if (si == chart.zoom_1st_idx && chart.cursors.cursors_crossings.length != 0) {
switch (chart.cursors.cursor_style.orientation) {
case Cursors.Orientation.VERTICAL:
if (is_x && chart.joint_x)
if (is_x && chart.joint_x) {
var tmp = max_rec_height + axis.font_spacing;
switch (axis.position) {
case Axis.Position.LOW: chart.plarea.height -= max_rec_height + axis.font_spacing; break;
case Axis.Position.HIGH:
var tmp = max_rec_height + axis.font_spacing;
chart.plarea.y += tmp; chart.plarea.height -= tmp;
break;
case Axis.Position.LOW: chart.plarea.y1 -= tmp; break;
case Axis.Position.HIGH: chart.plarea.y0 += tmp; break;
}
}
break;
case Cursors.Orientation.HORIZONTAL:
if (!is_x && chart.joint_y)
if (!is_x && chart.joint_y) {
var tmp = max_rec_width + s.axis_y.font_spacing;
switch (s.axis_y.position) {
case Axis.Position.LOW:
var tmp = max_rec_width + s.axis_y.font_spacing;
chart.plarea.x += tmp; chart.plarea.width -= tmp;
break;
case Axis.Position.HIGH: chart.plarea.width -= max_rec_width + s.axis_y.font_spacing; break;
case Axis.Position.LOW: chart.plarea.x0 += tmp; break;
case Axis.Position.HIGH: chart.plarea.x1 -= tmp; break;
}
}
break;
}
}
if (is_x && (!chart.joint_x || si == chart.zoom_1st_idx))
if (is_x && (!chart.joint_x || si == chart.zoom_1st_idx)) {
var tmp = max_rec_height + max_font_spacing + max_axis_font_height;
switch (axis.position) {
case Axis.Position.LOW: chart.plarea.height -= max_rec_height + max_font_spacing + max_axis_font_height; break;
case Axis.Position.HIGH:
var tmp = max_rec_height + max_font_spacing + max_axis_font_height;
chart.plarea.y += tmp; chart.plarea.height -= tmp;
break;
case Axis.Position.LOW: chart.plarea.y1 -= tmp; break;
case Axis.Position.HIGH: chart.plarea.y0 += tmp; break;
}
if (!is_x && (!chart.joint_y || si == chart.zoom_1st_idx))
}
if (!is_x && (!chart.joint_y || si == chart.zoom_1st_idx)) {
var tmp = max_rec_width + max_font_spacing + max_axis_font_width;
switch (s.axis_y.position) {
case Axis.Position.LOW:
var tmp = max_rec_width + max_font_spacing + max_axis_font_width;
chart.plarea.x += tmp; chart.plarea.width -= tmp;
break;
case Axis.Position.HIGH: chart.plarea.width -= max_rec_width + max_font_spacing + max_axis_font_width; break;
case Axis.Position.LOW: chart.plarea.x0 += tmp; break;
case Axis.Position.HIGH: chart.plarea.x1 -= tmp; break;
}
}
}
public virtual void join_relative_x_axes (int si,
@ -258,12 +254,8 @@ namespace CairoChart {
else chart.color = axis_x.color;
string text = "", time_text = "";
switch (axis_x.type) {
case Axis.Type.NUMBERS:
text = axis_x.format.printf((LongDouble)x);
break;
case Axis.Type.DATE_TIME:
axis_x.format_date_time(x, out text, out time_text);
break;
case Axis.Type.NUMBERS: text = axis_x.format.printf((LongDouble)x); break;
case Axis.Type.DATE_TIME: axis_x.format_date_time(x, out text, out time_text); break;
}
var scr_x = get_scr_x (x);
var text_t = new Text(text, axis_x.font_style, axis_x.color);
@ -271,7 +263,7 @@ namespace CairoChart {
switch (axis_x.position) {
case Axis.Position.LOW:
var print_y = chart.evarea.y + chart.evarea.height - axis_x.font_spacing - (axis_x.title.text == "" ? 0 : sz.height + axis_x.font_spacing);
var print_y = chart.evarea.y1 - axis_x.font_spacing - (axis_x.title.text == "" ? 0 : sz.height + axis_x.font_spacing);
var print_x = compact_rec_x_pos (x, text_t);
ctx.move_to (print_x, print_y);
switch (axis_x.type) {
@ -290,15 +282,15 @@ namespace CairoChart {
var line_style = grid.line_style;
if (joint_x) line_style.color = Color(0, 0, 0, 0.5);
line_style.apply(chart);
double y = chart.evarea.y + chart.evarea.height - max_rec_height - axis_x.font_spacing - (axis_x.title.text == "" ? 0 : sz.height + axis_x.font_spacing);
double y = chart.evarea.y1 - max_rec_height - axis_x.font_spacing - (axis_x.title.text == "" ? 0 : sz.height + axis_x.font_spacing);
ctx.move_to (scr_x, y);
if (joint_x)
ctx.line_to (scr_x, chart.plarea.y);
ctx.line_to (scr_x, chart.plarea.y0);
else
ctx.line_to (scr_x, double.min (y, chart.plarea.y + chart.plarea.height * (1.0 - place.zoom_y_max)));
ctx.line_to (scr_x, double.min (y, chart.plarea.y0 + chart.plarea.height * (1.0 - place.zoom_y_max)));
break;
case Axis.Position.HIGH:
var print_y = chart.evarea.y + max_rec_height + axis_x.font_spacing + (axis_x.title.text == "" ? 0 : sz.height + axis_x.font_spacing);
var print_y = chart.evarea.y0 + max_rec_height + axis_x.font_spacing + (axis_x.title.text == "" ? 0 : sz.height + axis_x.font_spacing);
var print_x = compact_rec_x_pos (x, text_t);
ctx.move_to (print_x, print_y);
@ -318,12 +310,12 @@ namespace CairoChart {
var line_style = grid.line_style;
if (joint_x) line_style.color = Color(0, 0, 0, 0.5);
line_style.apply(chart);
double y = chart.evarea.y + max_rec_height + axis_x.font_spacing + (axis_x.title.text == "" ? 0 : sz.height + axis_x.font_spacing);
double y = chart.evarea.y0 + max_rec_height + axis_x.font_spacing + (axis_x.title.text == "" ? 0 : sz.height + axis_x.font_spacing);
ctx.move_to (scr_x, y);
if (joint_x)
ctx.line_to (scr_x, chart.plarea.y + chart.plarea.height);
ctx.line_to (scr_x, chart.plarea.y1);
else
ctx.line_to (scr_x, double.max (y, chart.plarea.y + chart.plarea.height * (1.0 - place.zoom_y_min)));
ctx.line_to (scr_x, double.max (y, chart.plarea.y0 + chart.plarea.height * (1.0 - place.zoom_y_min)));
break;
}
}
@ -360,9 +352,10 @@ namespace CairoChart {
// 4.2. Cursor values for joint X axis
if (chart.joint_x && chart.cursors.cursor_style.orientation == Cursors.Orientation.VERTICAL && chart.cursors.cursors_crossings.length != 0) {
var tmp = max_rec_height + s.axis_x.font_spacing;
switch (s.axis_x.position) {
case Axis.Position.LOW: chart.evarea.height -= max_rec_height + s.axis_x.font_spacing; break;
case Axis.Position.HIGH: var tmp = max_rec_height + s.axis_x.font_spacing; chart.evarea.y += tmp; chart.evarea.height -= tmp; break;
case Axis.Position.LOW: chart.evarea.y1 -= tmp; break;
case Axis.Position.HIGH: chart.evarea.y0 += tmp; break;
}
}
@ -370,11 +363,11 @@ namespace CairoChart {
// 4.5. Draw Axis title
if (s.axis_x.title.text != "") {
var scr_x = chart.plarea.x + chart.plarea.width * (s.place.zoom_x_min + s.place.zoom_x_max) / 2.0;
var scr_x = chart.plarea.x0 + chart.plarea.width * (s.place.zoom_x_min + s.place.zoom_x_max) / 2.0;
double scr_y = 0.0;
switch (s.axis_x.position) {
case Axis.Position.LOW: scr_y = chart.evarea.y + chart.evarea.height - s.axis_x.font_spacing; break;
case Axis.Position.HIGH: scr_y = chart.evarea.y + s.axis_x.font_spacing + sz.height; break;
case Axis.Position.LOW: scr_y = chart.evarea.y1 - s.axis_x.font_spacing; break;
case Axis.Position.HIGH: scr_y = chart.evarea.y0 + s.axis_x.font_spacing + sz.height; break;
}
chart.ctx.move_to(scr_x - sz.width / 2.0, scr_y);
chart.color = s.axis_x.color;
@ -391,15 +384,10 @@ namespace CairoChart {
if (nskip != 0) {--nskip; return;}
var tmp = max_rec_height + s.axis_x.font_spacing + (s.axis_x.title.text == "" ? 0 : sz.height + s.axis_x.font_spacing);
switch (s.axis_x.position) {
case Axis.Position.LOW:
chart.evarea.height -= max_rec_height + s.axis_x.font_spacing
+ (s.axis_x.title.text == "" ? 0 : sz.height + s.axis_x.font_spacing);
break;
case Axis.Position.HIGH:
var tmp = max_rec_height + s.axis_x.font_spacing + (s.axis_x.title.text == "" ? 0 : sz.height + s.axis_x.font_spacing);
chart.evarea.y += tmp; chart.evarea.height -= tmp;
break;
case Axis.Position.LOW: chart.evarea.y1 -= tmp; break;
case Axis.Position.HIGH: chart.evarea.y0 += tmp; break;
}
}
@ -419,7 +407,7 @@ namespace CairoChart {
switch (axis_y.position) {
case Axis.Position.LOW:
ctx.move_to (chart.evarea.x + max_rec_width - text_sz.width + axis_y.font_spacing
ctx.move_to (chart.evarea.x0 + max_rec_width - text_sz.width + axis_y.font_spacing
+ (axis_y.title.text == "" ? 0 : sz.width + axis_y.font_spacing),
compact_rec_y_pos (y, text_t));
text_t.show(ctx);
@ -427,15 +415,15 @@ namespace CairoChart {
var line_style = grid.line_style;
if (joint_y) line_style.color = Color(0, 0, 0, 0.5);
line_style.apply(chart);
double x = chart.evarea.x + max_rec_width + axis_y.font_spacing + (axis_y.title.text == "" ? 0 : sz.width + axis_y.font_spacing);
double x = chart.evarea.x0 + max_rec_width + axis_y.font_spacing + (axis_y.title.text == "" ? 0 : sz.width + axis_y.font_spacing);
ctx.move_to (x, scr_y);
if (joint_y)
ctx.line_to (chart.plarea.x + chart.plarea.width, scr_y);
ctx.line_to (chart.plarea.x1, scr_y);
else
ctx.line_to (double.max (x, chart.plarea.x + chart.plarea.width * place.zoom_x_max), scr_y);
ctx.line_to (double.max (x, chart.plarea.x0 + chart.plarea.width * place.zoom_x_max), scr_y);
break;
case Axis.Position.HIGH:
ctx.move_to (chart.evarea.x + chart.evarea.width - text_sz.width - axis_y.font_spacing
ctx.move_to (chart.evarea.x1 - text_sz.width - axis_y.font_spacing
- (axis_y.title.text == "" ? 0 : sz.width + axis_y.font_spacing),
compact_rec_y_pos (y, text_t));
text_t.show(ctx);
@ -443,12 +431,12 @@ namespace CairoChart {
var line_style = grid.line_style;
if (joint_y) line_style.color = Color(0, 0, 0, 0.5);
line_style.apply(chart);
double x = chart.evarea.x + chart.evarea.width - max_rec_width - axis_y.font_spacing - (axis_y.title.text == "" ? 0 : sz.width + axis_y.font_spacing);
double x = chart.evarea.x1 - max_rec_width - axis_y.font_spacing - (axis_y.title.text == "" ? 0 : sz.width + axis_y.font_spacing);
ctx.move_to (x, scr_y);
if (joint_y)
ctx.line_to (chart.plarea.x, scr_y);
ctx.line_to (chart.plarea.x0, scr_y);
else
ctx.line_to (double.min (x, chart.plarea.x + chart.plarea.width * place.zoom_x_min), scr_y);
ctx.line_to (double.min (x, chart.plarea.x0 + chart.plarea.width * place.zoom_x_min), scr_y);
break;
}
}
@ -484,9 +472,10 @@ namespace CairoChart {
// 4.2. Cursor values for joint Y axis
if (chart.joint_y && chart.cursors.cursor_style.orientation == Cursors.Orientation.HORIZONTAL && chart.cursors.cursors_crossings.length != 0) {
var tmp = max_rec_width + s.axis_y.font_spacing;
switch (s.axis_y.position) {
case Axis.Position.LOW: var tmp = max_rec_width + s.axis_y.font_spacing; chart.evarea.x += tmp; chart.evarea.width -= tmp; break;
case Axis.Position.HIGH: chart.evarea.width -= max_rec_width + s.axis_y.font_spacing; break;
case Axis.Position.LOW: chart.evarea.x0 += tmp; break;
case Axis.Position.HIGH: chart.evarea.x1 -= tmp; break;
}
}
@ -494,14 +483,14 @@ namespace CairoChart {
// 4.5. Draw Axis title
if (s.axis_y.title.text != "") {
var scr_y = chart.plarea.y + chart.plarea.height * (1.0 - (s.place.zoom_y_min + s.place.zoom_y_max) / 2.0);
var scr_y = chart.plarea.y0 + chart.plarea.height * (1.0 - (s.place.zoom_y_min + s.place.zoom_y_max) / 2.0);
switch (s.axis_y.position) {
case Axis.Position.LOW:
var scr_x = chart.evarea.x + s.axis_y.font_spacing + sz.width;
var scr_x = chart.evarea.x0 + s.axis_y.font_spacing + sz.width;
chart.ctx.move_to(scr_x, scr_y + sz.height / 2.0);
break;
case Axis.Position.HIGH:
var scr_x = chart.evarea.x + chart.evarea.width - s.axis_y.font_spacing;
var scr_x = chart.evarea.x1 - s.axis_y.font_spacing;
chart.ctx.move_to(scr_x, scr_y + sz.height / 2.0);
break;
}
@ -519,14 +508,10 @@ namespace CairoChart {
if (nskip != 0) {--nskip; return;}
var tmp = max_rec_width + s.axis_y.font_spacing + (s.axis_y.title.text == "" ? 0 : sz.width + s.axis_y.font_spacing);
switch (s.axis_y.position) {
case Axis.Position.LOW:
var tmp = max_rec_width + s.axis_y.font_spacing + (s.axis_y.title.text == "" ? 0 : sz.width + s.axis_y.font_spacing);
chart.evarea.x += tmp; chart.evarea.width -= tmp;
break;
case Axis.Position.HIGH:
chart.evarea.width -= max_rec_width + s.axis_y.font_spacing
+ (s.axis_y.title.text == "" ? 0 : sz.width + s.axis_y.font_spacing); break;
case Axis.Position.LOW: chart.evarea.x0 += tmp; break;
case Axis.Position.HIGH: chart.evarea.x1 -= tmp; break;
}
}
@ -543,11 +528,11 @@ namespace CairoChart {
}
public virtual double get_scr_x (Float128 x) {
return chart.plarea.x + chart.plarea.width * (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));
return chart.plarea.x0 + chart.plarea.width * (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.plarea.y + chart.plarea.height * (1.0 - (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)));
return chart.plarea.y0 + chart.plarea.height * (1.0 - (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) {
@ -555,12 +540,12 @@ namespace CairoChart {
}
public virtual Float128 get_real_x (double scr_x) {
return axis_x.zoom_min + ((scr_x - chart.plarea.x) / chart.plarea.width - place.zoom_x_min)
return axis_x.zoom_min + ((scr_x - chart.plarea.x0) / chart.plarea.width - 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.plarea.y + chart.plarea.height - scr_y) / chart.plarea.height - place.zoom_y_min)
return axis_y.zoom_min + ((chart.plarea.y1 - scr_y) / chart.plarea.height - place.zoom_y_min)
* (axis_y.zoom_max - axis_y.zoom_min) / (place.zoom_y_max - place.zoom_y_min);
}

View File

@ -206,10 +206,10 @@ void plot_chart4 (Chart chart) {
}
bool point_in_chart (Chart chart, double x, double y) {
if (x < chart.plarea.x) return false;
if (x > chart.plarea.x + chart.plarea.width) return false;
if (y < chart.plarea.y) return false;
if (y > chart.plarea.y + chart.plarea.height) return false;
if (x < chart.plarea.x0) return false;
if (x > chart.plarea.x1) return false;
if (y < chart.plarea.y0) return false;
if (y > chart.plarea.y1) return false;
return true;
}
@ -426,7 +426,7 @@ int main (string[] args) {
// user's post draw operations here...
if (mouse_state == MouseState.DRAW_SELECTION)
chart.draw_selection (Cairo.Rectangle() {x = sel_x0, y = sel_y0, width = sel_x1 - sel_x0, height = sel_y1 - sel_y0});
chart.draw_selection (new Area.with_abs(sel_x0, sel_y0, sel_x1, sel_y1));
// show delta
var str = chart.cursors.get_cursors_delta_str();
@ -435,8 +435,8 @@ int main (string[] args) {
var text_t = new Text(text);
var w = text_t.get_width(ctx);
var h = text_t.get_height(ctx);
var x0 = chart.plarea.x + chart.plarea.width - w - 5;
var y0 = chart.plarea.y + h + 5;
var x0 = chart.plarea.x1 - w - 5;
var y0 = chart.plarea.y0 + h + 5;
chart.color = chart.legend.bg_color;
ctx.rectangle (x0, y0 - h, w, h);
ctx.fill();
@ -499,7 +499,7 @@ int main (string[] args) {
sel_x1 = event.x;
sel_y1 = event.y;
if (sel_x1 > sel_x0 && sel_y1 > sel_y0)
chart.zoom_in (Cairo.Rectangle(){x = sel_x0, y = sel_y0, width = sel_x1 - sel_x0, height = sel_y1 - sel_y0});
chart.zoom_in (new Area.with_abs(sel_x0, sel_y0, sel_x1, sel_y1));
else
chart.zoom_out ();
da.queue_draw_area(0, 0, da.get_allocated_width(), da.get_allocated_height());