|
1 | 1 | use std::fs::{self};
|
2 | 2 |
|
| 3 | +use ordered_f32::OrderedF32; |
3 | 4 | use p3_api::data::{navigation_matrix::NavigationMatrix, navigation_vector::NavigationVector, navpoint_matrix::NavpointMatrix};
|
4 | 5 | use pathfinding::prelude::{build_path, dijkstra_all};
|
5 | 6 |
|
| 7 | +pub mod ordered_f32; |
| 8 | + |
6 | 9 | pub struct DirectlyConnectedNodes {
|
7 | 10 | pub connected_nodes: Vec<(u16, u16)>,
|
8 | 11 | }
|
@@ -38,35 +41,38 @@ fn main() {
|
38 | 41 | for target_index in 0..navigation_vector.points.len() as u16 {
|
39 | 42 | if source_index != target_index {
|
40 | 43 | let path = build_path(&(target_index), &parents);
|
41 |
| - let distance = 0; |
42 |
| - //println!("{source_index} -> {target_index} {path:?}"); |
| 44 | + let distance = navigation_vector.get_path_length(&path); |
43 | 45 | new_navpoint_matrix.set_next(source_index, target_index, path[1], distance, navigation_vector.length)
|
44 | 46 | } else {
|
45 | 47 | new_navpoint_matrix.set_next(source_index, source_index, source_index, 0, navigation_vector.length)
|
46 | 48 | }
|
47 | 49 | }
|
48 | 50 | }
|
49 | 51 |
|
50 |
| - { |
51 |
| - println!( |
52 |
| - "{} {} {}", |
53 |
| - navigation_vector.get_distance(0, 14), |
54 |
| - navigation_vector.get_distance(0, 9), |
55 |
| - navigation_vector.get_distance(9, 14) |
56 |
| - ); |
57 |
| - } |
58 |
| - |
59 |
| - //assert_eq!(original_navpoint_matrix, new_navpoint_matrix) |
60 | 52 | assert_eq!(original_navpoint_matrix.matrix.len(), new_navpoint_matrix.matrix.len());
|
| 53 | + |
61 | 54 | println!("Asserting {} cells", original_navpoint_matrix.matrix.len());
|
62 |
| - //println!("{:?}", &original_navpoint_matrix.matrix[0..10]); |
63 |
| - //println!("{:?}", &new_navpoint_matrix.matrix[0..10]); |
| 55 | + let mut bad_next_cells = 0; |
64 | 56 | for i in 0..original_navpoint_matrix.matrix.len() {
|
65 | 57 | let orig_next = original_navpoint_matrix.matrix[i].next;
|
66 | 58 | let calculated_next = new_navpoint_matrix.matrix[i].next;
|
67 |
| - println!("cell {i}: {orig_next} == {calculated_next}"); |
68 |
| - assert_eq!(orig_next, calculated_next); |
| 59 | + if orig_next != calculated_next { |
| 60 | + println!("cell {i}: next {orig_next} != {calculated_next}"); |
| 61 | + bad_next_cells += 1; |
| 62 | + } |
69 | 63 | }
|
| 64 | + println!("{bad_next_cells} bad next entries"); |
| 65 | + |
| 66 | + let mut bad_distance_cells = 0; |
| 67 | + for i in 0..original_navpoint_matrix.matrix.len() { |
| 68 | + let orig_distance = original_navpoint_matrix.matrix[i].distance; |
| 69 | + let calculated_distance = new_navpoint_matrix.matrix[i].distance; |
| 70 | + if orig_distance != calculated_distance { |
| 71 | + println!("cell {i}: distance {orig_distance} != {calculated_distance}"); |
| 72 | + bad_distance_cells += 1; |
| 73 | + } |
| 74 | + } |
| 75 | + println!("{bad_distance_cells} bad distances"); |
70 | 76 | }
|
71 | 77 |
|
72 | 78 | fn is_connected(p0: (i16, i16), p1: (i16, i16), navigation_matrix: &NavigationMatrix) -> bool {
|
@@ -116,11 +122,11 @@ impl DirectlyConnectedNodes {
|
116 | 122 | buf
|
117 | 123 | }
|
118 | 124 |
|
119 |
| - pub fn get_neighbours(&self, node_index: u16, nav_vec: &NavigationVector) -> Vec<(u16, i128)> { |
| 125 | + pub fn get_neighbours(&self, node_index: u16, nav_vec: &NavigationVector) -> Vec<(u16, OrderedF32)> { |
120 | 126 | let mut neighbours = vec![];
|
121 | 127 | for n in &self.connected_nodes {
|
122 | 128 | if n.0 == node_index {
|
123 |
| - neighbours.push((n.1, nav_vec.get_distance(n.0 as _, n.1 as _))); |
| 129 | + neighbours.push((n.1, nav_vec.get_distance(n.0 as _, n.1 as _).into())); |
124 | 130 | }
|
125 | 131 | }
|
126 | 132 |
|
@@ -167,3 +173,29 @@ impl DirectlyConnectedNodes {
|
167 | 173 | DirectlyConnectedNodes { connected_nodes: nodes }
|
168 | 174 | }
|
169 | 175 | }
|
| 176 | + |
| 177 | +#[test] |
| 178 | +fn test1() { |
| 179 | + let _navigation_matrix = NavigationMatrix::deserialize(&fs::read(r"C:\Users\Benni\Patrician 3_workbench\navdata\nav_matrix.dat").unwrap()); |
| 180 | + let navigation_vector = NavigationVector::deserialize(&fs::read(r"C:\Users\Benni\Patrician 3_workbench\navdata\nav_vec.dat").unwrap()); |
| 181 | + let original_navpoint_matrix = NavpointMatrix::deserialize(&fs::read(r"C:\Users\Benni\Patrician 3_workbench\navdata\matrix_int.dat").unwrap()); |
| 182 | + let cell4 = &original_navpoint_matrix.matrix[6]; |
| 183 | + let cell4_distance = cell4.distance; |
| 184 | + |
| 185 | + let (x1, y1) = navigation_vector.points[0]; |
| 186 | + let (x2, y2) = navigation_vector.points[6]; |
| 187 | + let dx = (x2 - x1) as f32; |
| 188 | + let dy = (y2 - y1) as f32; |
| 189 | + |
| 190 | + let calculated_distance = ((dx * dx + dy * dy).sqrt() * 65536.0) as i32; |
| 191 | + |
| 192 | + println!("{cell4_distance} {calculated_distance}"); |
| 193 | + assert_eq!(cell4.distance, calculated_distance) |
| 194 | +} |
| 195 | + |
| 196 | +#[test] |
| 197 | +fn test2() { |
| 198 | + let navigation_vector = NavigationVector::deserialize(&fs::read(r"C:\Users\Benni\Patrician 3_workbench\navdata\nav_vec.dat").unwrap()); |
| 199 | + let path_0_2 = [0, 9, 20, 34, 33, 25, 24, 29, 31, 59, 65, 64, 44, 2]; |
| 200 | + assert_eq!(19936074, navigation_vector.get_path_length(&path_0_2)) |
| 201 | +} |
0 commit comments