|
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