From f5715a1b63c8e3d39de0d9c2c95300b90d76488f Mon Sep 17 00:00:00 2001 From: Steffen Pohle Date: Sun, 5 Feb 2023 17:58:32 +0100 Subject: [PATCH] adding debug angles screen. --- debug-angles.cc | 87 +++++++++++++++++++++++++++++++++++++++++++++++++ gui.cc | 11 +++++++ gui.h | 1 + video.cc | 2 ++ 4 files changed, 101 insertions(+) diff --git a/debug-angles.cc b/debug-angles.cc index dec351b..e3d7cd4 100644 --- a/debug-angles.cc +++ b/debug-angles.cc @@ -7,20 +7,107 @@ #include #include #include +#include #include "debug.h" +#include "gui.h" + +position_f_2d dbga_axis; +position_f_2d dbga_pos; +double dbga_angle = NAN; +double dbga_len = NAN; + +#define DBGA_W 400 +#define DBGA_H 400 + +void debug_angles_calculate() { + position_f_2d center; + + center.x = DBGA_W >> 1; + center.y = DBGA_H >> 1; + + dbga_len = dbga_axis.perpendicular(dbga_pos, center); +} + void debug_angles_draw(cairo_t *cr) { + int centerX = DBGA_W >> 1; + int centerY = DBGA_H >> 1; + position_f_2d v; + double d; + + debug_angles_calculate(); + + cairo_set_source_rgb(cr, 1.0, 1.0, 1.0); + cairo_set_line_width(cr, 1.0); + cairo_move_to(cr, 0, 0); + cairo_line_to(cr, DBGA_W, 0); + cairo_line_to(cr, DBGA_W, DBGA_H); + cairo_line_to(cr, 0, DBGA_H); + cairo_stroke(cr); + cairo_set_source_rgb(cr, 0.5, 0.5, 0.5); + cairo_select_font_face (cr, "sans-serif", CAIRO_FONT_SLANT_NORMAL, CAIRO_FONT_WEIGHT_BOLD); + cairo_set_font_size (cr, 12); + draw_text(cr, 10, 10, 0.5, "Debug Angles"); + if (isnan(dbga_axis.x)) return; + + // len + cairo_set_source_rgb(cr, 0.0, 0.0, 1.0); + draw_printf(cr, 250, 10, 0.0, (char*)"Len: %5.2f", dbga_len); + + // draw pos + cairo_set_source_rgb(cr, 0.3, 0.3, 1.0); + draw_printf(cr, 50, 10, 0.0, (char*)"Pos: %5.1f,%5.1f", dbga_pos.x, dbga_pos.y); + cairo_set_line_width(cr, 3.0); + cairo_move_to(cr, centerX, centerY); + cairo_line_to(cr, dbga_pos.x, dbga_pos.y); + cairo_stroke(cr); + + cairo_set_line_width(cr, 1.0); + if (dbga_len >= 0.0) cairo_set_source_rgb(cr, 1.0, 0.5, 0.5); + else cairo_set_source_rgb(cr, 0.5, 1.0, 0.5); + d = hypot(dbga_axis.x, dbga_axis.y); + v.x = dbga_len * dbga_axis.y / d; + v.y = dbga_len * (-dbga_axis.x) / d; + cairo_move_to(cr, dbga_pos.x, dbga_pos.y); + cairo_line_to(cr, dbga_pos.x + v.x, dbga_pos.y + v.y); + cairo_stroke(cr); + + // draw axis + cairo_set_source_rgb(cr, 0.5, 0.5, 0.5); + draw_printf(cr, 50, 25, 0.0, (char*)"Axis: %5.1f,%5.1f", dbga_axis.x, dbga_axis.y); + cairo_set_line_width(cr, 3.0); + cairo_move_to(cr, centerX, centerY); + cairo_line_to(cr, centerX + dbga_axis.x, centerY + dbga_axis.y); + cairo_stroke(cr); + + cairo_set_line_width(cr, 1.0); + d = hypot(dbga_axis.x, dbga_axis.y); + v.x = centerX * dbga_axis.x / d; + v.y = centerY * dbga_axis.y / d; + cairo_move_to(cr, centerX - v.x, centerY - v.y); + cairo_line_to(cr, centerX + v.x, centerY + v.y); + cairo_stroke(cr); }; void debug_angles_motionevent(GdkEvent *event) { + if (event->motion.x < 0 || event->motion.x >= DBGA_W + || event->motion.y < 0 || event->motion.y >= DBGA_H) return; + dbga_pos.x = event->motion.x; + dbga_pos.y = event->motion.y; }; void debug_angles_btnpress(GdkEvent *event) { + if (event->motion.x < 0 || event->motion.x >= DBGA_W + || event->motion.y < 0 || event->motion.y >= DBGA_H) return; + + dbga_axis.x = event->motion.x - (DBGA_W >> 1); + dbga_axis.y = event->motion.y - (DBGA_H >> 1); + }; diff --git a/gui.cc b/gui.cc index 434e5cb..eadd1c9 100644 --- a/gui.cc +++ b/gui.cc @@ -410,4 +410,15 @@ void draw_text (cairo_t *cr, int x, int y, float border, std::string text) { } }; +#define DRAW_PRINTF_LEN 512 +void draw_printf(cairo_t *cr, int x, int y, float border, char *fmt,...) { + va_list args; + char buffer[DRAW_PRINTF_LEN]; + + va_start (args, fmt); + vsnprintf (buffer, (DRAW_PRINTF_LEN-1), fmt, args); + va_end (args); + buffer[DRAW_PRINTF_LEN-1] = 0; + draw_text (cr, x, y, border, buffer); +}; diff --git a/gui.h b/gui.h index 93a6937..ed9445c 100644 --- a/gui.h +++ b/gui.h @@ -90,6 +90,7 @@ struct { } typedef detect_movement; void draw_text (cairo_t *cr, int x, int y, float border, std::string text); +void draw_printf(cairo_t *cr, int x, int y, float border, char *fmt,...); #ifdef __cplusplus extern "C" { diff --git a/video.cc b/video.cc index f6b5f71..03ec911 100644 --- a/video.cc +++ b/video.cc @@ -9,6 +9,8 @@ #include #include #include + +#include "config.h" #include "gui.h" #include "filter.h" #include "detect.h"