From a421936992acf0bf71e2e38b938e00030df06054 Mon Sep 17 00:00:00 2001 From: Joseph Pingenot Date: Sat, 26 Jul 2008 21:53:18 -0500 Subject: [PATCH] * Axes work for what I have implemented thus far. * About to add in labels. --- graph.c | 4 ++-- graphwidget.c | 44 +++++++++++++++++++++++++++++++++++++++++--- 2 files changed, 43 insertions(+), 5 deletions(-) diff --git a/graph.c b/graph.c index df419b9..f855cc9 100644 --- a/graph.c +++ b/graph.c @@ -209,8 +209,8 @@ struct graph_axis* autoset_axis(Graph* g, GString* title, double min, double max stop_mag = copysign(pow(10, ceil(log10(max))), max); if(stop_mag == start_mag) stop_mag *= 10; axis->major=10; - axis->minor=0; - axis->subminor=0; + axis->minor=9; + axis->subminor=9; axis->major_start=start_mag; axis->major_step=(stop_mag - start_mag)/(axis->major); } diff --git a/graphwidget.c b/graphwidget.c index 1c97eee..473aa49 100644 --- a/graphwidget.c +++ b/graphwidget.c @@ -35,6 +35,7 @@ G_DEFINE_TYPE(GraphWidget, graph_widget, GTK_TYPE_DRAWING_AREA); #define INSET_PERCENT 0.1 +#define DEBUG_DRAW_AXIS struct drawing_context { GtkWidget *widget; @@ -79,9 +80,37 @@ static void draw_lines(gpointer data, gpointer user_data) { cairo_curve_to(cxt->cr, p1_x, p1_y, p2_x, p2_y, p3_x, p3_y); } -static void draw_axis(gpointer data, gpointer user_data) { - struct graph_axis *xs = data; - struct drawing_context *cxt = user_data; +static void draw_axis(struct drawing_context* cxt, struct graph_axis *axis, double scaling, double offset) { + #ifdef DEBUG_DRAW_AXIS + fprintf(stderr, "draw_axis; major_start=%g, major_step=%g, >major=%d, minor=%d, subminor=%d, label=%s\n", axis->major_start, axis->major_step, axis->major, axis->minor, axis->subminor, axis->title->str); + #endif + cairo_move_to(cxt->cr, 0, 0); + cairo_line_to(cxt->cr, 1, 0); + register int i, j, k; + register double pos, mpos, smpos; + for(i=0; imajor; i++) { + pos=i*axis->major_step + axis->major_start; + cairo_move_to(cxt->cr, (pos + offset)*scaling, 0); + cairo_line_to(cxt->cr, (pos + offset)*scaling, 0.05); + for(k=0; ksubminor; k++) { + smpos=(k+1)*(axis->major_step/(axis->minor+1)/(axis->subminor+1)) + pos; + cairo_move_to(cxt->cr, (smpos + offset)*scaling, 0); + cairo_line_to(cxt->cr, (smpos + offset)*scaling, 0.0125); + } + for(j=0; jminor; j++) { + mpos=(j+1)*(axis->major_step/(axis->minor+1)) + pos; + cairo_move_to(cxt->cr, (mpos + offset)*scaling, 0); + cairo_line_to(cxt->cr, (mpos + offset)*scaling, 0.025); + for(k=0; ksubminor; k++) { + smpos=(k+1)*(axis->major_step/(axis->minor+1)/(axis->subminor+1)) + mpos; + cairo_move_to(cxt->cr, (smpos + offset)*scaling, 0); + cairo_line_to(cxt->cr, (smpos + offset)*scaling, 0.0125); + } + } + } + pos=i*axis->major_step + axis->major_start; + cairo_move_to(cxt->cr, (pos + offset)*scaling, 0); + cairo_line_to(cxt->cr, (pos + offset)*scaling, 0.05); } static void draw(GtkWidget *graph, cairo_t *cr) { @@ -139,6 +168,15 @@ static void draw(GtkWidget *graph, cairo_t *cr) { cairo_fill_preserve(cr); cairo_set_source_rgb(cr, 0, 0, 0); g_ptr_array_foreach(gw->graph->points, &draw_point, (gpointer)&cxt); + if(gw->graph->xaxis != NULL) + draw_axis(&cxt, gw->graph->xaxis, cxt.xscaling, cxt.xoffset); + if(gw->graph->yaxis != NULL) { + cairo_save(cr); + cairo_matrix_t matrix = { .xx=0, .xy = 1, .x0 = 0, .yx = 1, .yy = 0, .y0 = 0 }; + cairo_transform(cr, &matrix); + draw_axis(&cxt, gw->graph->yaxis, cxt.yscaling, cxt.yoffset); + cairo_restore(cr); + } cairo_stroke(cr); cairo_restore(cr); } -- 1.7.9.5