2019-06-09 13:37:45 -05:00
|
|
|
#include <stdlib.h>
|
|
|
|
#include <math.h>
|
|
|
|
|
|
|
|
#include <hexagram/gauge.h>
|
|
|
|
|
2019-06-09 15:46:41 -05:00
|
|
|
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;
|
|
|
|
}
|
2019-06-09 13:37:45 -05:00
|
|
|
|
2019-06-09 15:46:41 -05:00
|
|
|
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;
|
2019-06-09 13:37:45 -05:00
|
|
|
|
2019-06-09 15:46:41 -05:00
|
|
|
/*
|
|
|
|
* Draw the gauge pivot
|
|
|
|
*/
|
|
|
|
cairo_set_source_rgb(cr, 1, 1, 1);
|
2019-06-09 13:37:45 -05:00
|
|
|
|
2019-06-09 15:46:41 -05:00
|
|
|
cairo_arc(cr,
|
|
|
|
gauge->x,
|
|
|
|
gauge->y,
|
|
|
|
gauge->radius * 0.08,
|
|
|
|
0,
|
|
|
|
2.0 * M_PI);
|
2019-06-09 13:37:45 -05:00
|
|
|
|
|
|
|
cairo_stroke(cr);
|
|
|
|
|
2019-06-09 15:46:41 -05:00
|
|
|
/*
|
|
|
|
* Draw the needle atop the gauge pivot
|
|
|
|
*/
|
2019-06-09 13:37:45 -05:00
|
|
|
cairo_set_source_rgb(cr, 1, 1, 1);
|
|
|
|
|
|
|
|
cairo_move_to(cr,
|
2019-06-09 15:46:41 -05:00
|
|
|
gauge->x + (radius * gauge->radius) * cos(angle),
|
|
|
|
gauge->y + (radius * gauge->radius) * sin(angle));
|
2019-06-09 13:37:45 -05:00
|
|
|
|
|
|
|
cairo_save(cr);
|
|
|
|
cairo_rotate(cr, angle + 1.658);
|
|
|
|
cairo_show_text(cr, text);
|
|
|
|
cairo_stroke(cr);
|
|
|
|
cairo_restore(cr);
|
|
|
|
}
|
|
|
|
|
2019-06-09 15:46:41 -05:00
|
|
|
void hexagram_gauge_draw_mark(hexagram_gauge *gauge,
|
|
|
|
cairo_t *cr,
|
|
|
|
double min_radius,
|
|
|
|
double max_radius,
|
2019-06-09 13:37:45 -05:00
|
|
|
double value) {
|
2019-06-09 15:46:41 -05:00
|
|
|
double angle = gauge->min_angle
|
|
|
|
+ ((gauge->max_angle - gauge->min_angle) * value) - (M_PI / 2.0);
|
2019-06-09 13:37:45 -05:00
|
|
|
|
|
|
|
cairo_move_to(cr,
|
2019-06-09 15:46:41 -05:00
|
|
|
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);
|
2019-06-09 13:37:45 -05:00
|
|
|
|
|
|
|
cairo_line_to(cr,
|
2019-06-09 15:46:41 -05:00
|
|
|
gauge->x + (radius * gauge->radius) * cos(angle),
|
|
|
|
gauge->y + (radius * gauge->radius) * sin(angle));
|
2019-06-09 13:37:45 -05:00
|
|
|
|
|
|
|
cairo_stroke(cr);
|
|
|
|
}
|