omni_randomwalk/
walk_app.rs1use 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}