chiron 0.1.0

Graphical and command-line interface tools for Biomechanics Foundation
Documentation
use bevy::prelude::*;
use egui_plot::{Line, Plot, PlotPoints};

#[derive(Debug, Clone, PartialEq)]
pub struct PlotData {
    pub title: String,
    pub data: Vec<[f64; 2]>,
}

impl Default for PlotData {
    fn default() -> Self {
        PlotData {
            title: "Plot".to_string(),
            data: vec![],
        }
    }
}

pub fn draw_plot(ui: &mut egui::Ui, world: &mut World, plot_ui: &mut PlotData) {
    if plot_ui.data.len() == 0 {
        ui.label("No data");
        return;
    }
    let step = (plot_ui.data.len() / 1000).max(1);
    let data: Vec<[f64; 2]> = plot_ui
        .data
        .iter()
        .enumerate()
        .filter(|(i, _)| i % step == 0)
        .map(|(_, v)| *v)
        .collect();
    let line = Line::new(data);
    let plot = Plot::new(&plot_ui.title).show(ui, |plot_ui| plot_ui.line(line));
    if plot.response.hovered() {
        if let Some(pos) = plot.response.hover_pos() {
            let c3d_frame = world.get_resource_mut::<crate::ui::bottom_menu::C3dFrame>();
            if let Some(mut c3d_frame) = c3d_frame {
                c3d_frame.update_frame(plot.transform.value_from_position(pos).x as f32);
            }
        }
    }
}

pub fn select_plot(ui: &mut egui::Ui) {
    let sin: PlotPoints = (0..1000)
        .map(|i| {
            let x = i as f64 * 0.01;
            [x, x.sin()]
        })
        .collect();
    let line = Line::new(sin);
    Plot::new("my_plot").show(ui, |plot_ui| plot_ui.line(line));
}