From eac140b26f3eefe6f88fa7f95bbda9e03134af6a Mon Sep 17 00:00:00 2001 From: Andrew Golovashevich Date: Wed, 11 Mar 2026 01:19:38 +0300 Subject: [PATCH] Bezier curves in graph --- gui/egui/src/plot.rs | 20 +++++++++++++++++--- 1 file changed, 17 insertions(+), 3 deletions(-) diff --git a/gui/egui/src/plot.rs b/gui/egui/src/plot.rs index af17b73..b799c2f 100644 --- a/gui/egui/src/plot.rs +++ b/gui/egui/src/plot.rs @@ -6,7 +6,7 @@ use std::cmp::{max, min}; pub(crate) fn draw_plot( ui: &mut Ui, sections_count: usize, - times: impl Iterator>, + times: impl Iterator>, ) { Frame::canvas(ui.style()).show(ui, |ui| { let canvas_rect = ui.allocate_space(ui.available_size()).1; @@ -41,6 +41,20 @@ pub(crate) fn draw_plot( ), time2color(current.1), ); + let x_mid = gradient_f32(start.0.x, end.0.x, 0.5); + let start_bezier = Pos2::new(x_mid, start.0.y); + let end_bezier = Pos2::new(x_mid, end.0.y); + + let bezier_calc = |ratio: f32| { + let p_0_0 = gradient_pos(start.0, start_bezier, ratio); + let p_0_1 = gradient_pos(start_bezier, end_bezier, ratio); + let p_0_2 = gradient_pos(end_bezier, end.0, ratio); + + let p_1_0 = gradient_pos(p_0_0, p_0_1, ratio); + let p_1_1 = gradient_pos(p_0_1, p_0_2, ratio); + + return gradient_pos(p_1_0, p_1_1, ratio); + }; for j in 0..(gradient_precision) { let gradient_precision = gradient_precision as f32; @@ -48,8 +62,8 @@ pub(crate) fn draw_plot( let ratio2 = (j as f32 + 1.0) / gradient_precision; canvas.line_segment( [ - gradient_pos(start.0, end.0, ratio1), - gradient_pos(start.0, end.0, ratio2), + bezier_calc(ratio1), + bezier_calc(ratio2), ], Stroke::new(1.0, gradient_color(start.1, end.1, ratio1)), );