omni_randomwalk/
walk_app.rs

1use egui::{
2    plot::{Line, Plot, PlotPoints},
3    vec2, Ui,
4};
5
6use crate::{random_cordinates_one_dim, random_cordinates_two_dim};
7
8#[derive(serde::Deserialize, serde::Serialize)]
9#[serde(default)]
10pub struct WalkApp {
11    selected_random_walks: RandomWalkApps,
12
13    #[serde(skip)]
14    walk_plot_state: Vec<[f64; 2]>,
15
16    steps: u64,
17}
18
19impl Default for WalkApp {
20    fn default() -> Self {
21        Self {
22            selected_random_walks: RandomWalkApps::OneDimension,
23            walk_plot_state: vec![[0.0, 0.0]],
24            steps: 0,
25        }
26    }
27}
28
29#[derive(Debug, PartialEq, serde::Deserialize, serde::Serialize)]
30pub enum RandomWalkApps {
31    OneDimension,
32    TwoDimensons,
33}
34
35pub fn render_random_walk(walk_app: &mut WalkApp, ui: &mut Ui) {
36    egui::Grid::new("random_walk grid").show(ui, |ui| {
37        ui.horizontal(|ui| {
38            ui.heading("Random Walks");
39
40            egui::ComboBox::from_label("")
41                .selected_text(format!("{:?}", walk_app.selected_random_walks))
42                .show_ui(ui, |ui| {
43                    ui.selectable_value(
44                        &mut walk_app.selected_random_walks,
45                        RandomWalkApps::OneDimension,
46                        "One dimensions",
47                    );
48                    ui.selectable_value(
49                        &mut walk_app.selected_random_walks,
50                        RandomWalkApps::TwoDimensons,
51                        "Two dimensions",
52                    );
53                });
54        });
55
56        ui.end_row();
57
58        ui.vertical(|ui| match walk_app.selected_random_walks {
59            RandomWalkApps::OneDimension => render_random_walk_one_dimension(
60                ui,
61                &mut walk_app.walk_plot_state,
62                &mut walk_app.steps,
63            ),
64            RandomWalkApps::TwoDimensons => render_random_walk_two_dimension(
65                ui,
66                &mut walk_app.walk_plot_state,
67                &mut walk_app.steps,
68            ),
69        });
70
71        ui.end_row();
72    });
73}
74
75fn render_random_walk_one_dimension(
76    ui: &mut Ui,
77    walk_plot_state: &mut Vec<[f64; 2]>,
78    steps: &mut u64,
79) {
80    ui.vertical(|ui| {
81        ui.add_space(20.0);
82        plot_actions(ui, walk_plot_state, steps, 1);
83        ui.end_row();
84        plot_settings(ui, steps);
85        ui.end_row();
86
87        ui.horizontal(|ui| {
88            let sin: PlotPoints = PlotPoints::from(walk_plot_state.clone());
89
90            let line = Line::new(sin);
91            Plot::new("my_plot")
92                .view_aspect(2.0)
93                .min_size(vec2(1000.0, 250.0))
94                .show(ui, |plot_ui| plot_ui.line(line));
95        });
96        ui.end_row();
97    });
98}
99
100fn render_random_walk_two_dimension(
101    ui: &mut Ui,
102    walk_plot_state: &mut Vec<[f64; 2]>,
103    steps: &mut u64,
104) {
105    ui.vertical(|ui| {
106        ui.add_space(20.0);
107        plot_actions(ui, walk_plot_state, steps, 2);
108        ui.end_row();
109        plot_settings(ui, steps);
110        ui.end_row();
111        ui.horizontal(|ui| {
112            let sin: PlotPoints = PlotPoints::from(walk_plot_state.clone());
113
114            let line = Line::new(sin);
115            Plot::new("my_plot")
116                .view_aspect(2.0)
117                .min_size(vec2(1000.0, 250.0))
118                .show(ui, |plot_ui| plot_ui.line(line));
119        });
120        ui.end_row();
121    });
122}
123
124fn plot_actions(
125    ui: &mut Ui,
126    walk_plot_state: &mut Vec<[f64; 2]>,
127    steps: &mut u64,
128    dimensions: u128,
129) {
130    ui.horizontal(|ui| {
131        ui.collapsing("Actions", |ui| {
132            ui.horizontal_wrapped(|ui| {
133                ui.horizontal(|ui| {
134                    if ui.button("walk").clicked() {
135                        let cords = match dimensions {
136                            1 => random_cordinates_one_dim(*steps),
137                            2 => random_cordinates_two_dim(*steps),
138                            _ => vec![],
139                        };
140
141                        *walk_plot_state = cords;
142                    };
143                });
144            });
145        });
146    });
147}
148
149fn plot_settings(ui: &mut Ui, steps: &mut u64) {
150    ui.horizontal(|ui| {
151        ui.collapsing("Settings", |ui| {
152            ui.horizontal_wrapped(|ui| {
153                ui.horizontal(|ui| {
154                    ui.add(egui::DragValue::new(steps));
155                    ui.label("steps")
156                });
157            });
158        });
159    });
160}