#include #include #include void hexagram_gauge_init(hexagram_gauge *gauge, double x, double y, double radius, double min_angle, double max_angle) { gauge->x = x; gauge->y = y; gauge->radius = radius; gauge->min_angle = min_angle; gauge->max_angle = max_angle; } void hexagram_gauge_draw_number(hexagram_gauge *gauge, cairo_t *cr, double radius, double value, const char *text) { double angle = gauge->min_angle + ((gauge->max_angle - gauge->min_angle) * value) - 1.658; cairo_set_source_rgb(cr, 1, 1, 1); cairo_move_to(cr, gauge->x + (radius * gauge->radius) * cos(angle), gauge->y + (radius * gauge->radius) * sin(angle)); cairo_save(cr); cairo_rotate(cr, angle + 1.658); cairo_show_text(cr, text); cairo_stroke(cr); cairo_restore(cr); } void hexagram_gauge_draw_mark(hexagram_gauge *gauge, cairo_t *cr, double min_radius, double max_radius, double value) { double angle = gauge->min_angle + ((gauge->max_angle - gauge->min_angle) * value) - (M_PI / 2.0); cairo_move_to(cr, gauge->x + (min_radius * gauge->radius) * cos(angle), gauge->y + (min_radius * gauge->radius) * sin(angle)); cairo_line_to(cr, gauge->x + (max_radius * gauge->radius) * cos(angle), gauge->y + (max_radius * gauge->radius) * sin(angle)); cairo_stroke(cr); } void hexagram_gauge_draw_needle(hexagram_gauge *gauge, cairo_t *cr, double radius, double value) { double angle = gauge->min_angle + ((gauge->max_angle - gauge->min_angle) * value) - (M_PI / 2.0); /* * Draw the gauge pivot */ cairo_set_source_rgb(cr, 0.4, 0.4, 0.4); cairo_arc(cr, gauge->x, gauge->y, gauge->radius * 0.08, 0, 2.0 * M_PI); cairo_stroke(cr); /* * Draw the needle above the pivot */ cairo_move_to(cr, gauge->x, gauge->y); cairo_set_source_rgb(cr, 0, 0.25, 1.0); cairo_line_to(cr, gauge->x + (radius * gauge->radius) * cos(angle), gauge->y + (radius * gauge->radius) * sin(angle)); cairo_stroke(cr); }