hexagram/src/gauge.c
2019-06-09 15:46:41 -05:00

92 lines
2.7 KiB
C

#include <stdlib.h>
#include <math.h>
#include <hexagram/gauge.h>
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;
/*
* Draw the gauge pivot
*/
cairo_set_source_rgb(cr, 1, 1, 1);
cairo_arc(cr,
gauge->x,
gauge->y,
gauge->radius * 0.08,
0,
2.0 * M_PI);
cairo_stroke(cr);
/*
* Draw the needle atop the gauge pivot
*/
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);
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);
}