Several pathfinding bugfixes

This commit is contained in:
Manuel Vögele
2022-01-31 23:09:16 +01:00
parent 673fa42a20
commit 8817775201
3 changed files with 10 additions and 8 deletions
+1 -3
View File
@@ -21,9 +21,7 @@ export function findPath(from, to, token, previousWaypoints) {
if (!gridlessPathfinder) if (!gridlessPathfinder)
gridlessPathfinder = GridlessPathfinding.initialize(canvas.walls.placeables); gridlessPathfinder = GridlessPathfinding.initialize(canvas.walls.placeables);
paintGridlessPathfindingDebug(gridlessPathfinder); paintGridlessPathfindingDebug(gridlessPathfinder);
const path = GridlessPathfinding.findPath(gridlessPathfinder, from, to); return GridlessPathfinding.findPath(gridlessPathfinder, from, to);
console.warn(path);
return path;
} }
else { else {
const lastNode = calculatePath(from, to, token, previousWaypoints); const lastNode = calculatePath(from, to, token, previousWaypoints);
+1
View File
@@ -1,4 +1,5 @@
mod geometry; mod geometry;
#[macro_use]
mod js_api; mod js_api;
mod pathfinder; mod pathfinder;
mod ptr_indexed_hash_set; mod ptr_indexed_hash_set;
+8 -5
View File
@@ -1,4 +1,4 @@
use std::{cell::RefCell, rc::Rc}; use std::{cell::RefCell, f64::consts::PI, rc::Rc};
use wasm_bindgen::prelude::*; use wasm_bindgen::prelude::*;
@@ -105,7 +105,7 @@ impl Pathfinder {
let x_diff = wall.p2.x - wall.p1.x; let x_diff = wall.p2.x - wall.p1.x;
let y_diff = wall.p2.y - wall.p1.y; let y_diff = wall.p2.y - wall.p1.y;
let p1_angle = y_diff.atan2(x_diff); let p1_angle = y_diff.atan2(x_diff);
let p2_angle = (y_diff + 180.0).rem_euclid(360.0); let p2_angle = (p1_angle + PI).rem_euclid(2.0 * PI);
for (point, angle) in [(wall.p1, p1_angle), (wall.p2, p2_angle)] { for (point, angle) in [(wall.p1, p1_angle), (wall.p2, p2_angle)] {
let angles = endpoints.entry(point).or_insert_with(|| Vec::new()); let angles = endpoints.entry(point).or_insert_with(|| Vec::new());
angles.push(angle); angles.push(angle);
@@ -119,14 +119,17 @@ impl Pathfinder {
assert!(angles.len() > 0); assert!(angles.len() > 0);
for i in 1..angles.len() { for i in 1..angles.len() {
let angle1 = angles[i - 1]; let angle1 = angles[i - 1];
let angle2 = angles[i - 1]; let angle2 = angles[i];
if angle1 == angle2 {
continue;
}
let angle_between = (angle2 - angle1) / 2.0 + angle1; let angle_between = (angle2 - angle1) / 2.0 + angle1;
nodes.push(calc_pathfinding_node(point, angle_between)); nodes.push(calc_pathfinding_node(point, angle_between));
} }
let angle1 = angles.last().unwrap(); let angle1 = angles.last().unwrap();
let angle2 = angles.first().unwrap() + 360.0; let angle2 = angles.first().unwrap() + 2.0 * PI;
let angle_between = (angle2 - angle1) / 2.0 + angle1; let angle_between = (angle2 - angle1) / 2.0 + angle1;
let angle_between = angle_between.rem_euclid(360.0); let angle_between = angle_between.rem_euclid(2.0 * PI);
nodes.push(calc_pathfinding_node(point, angle_between)); nodes.push(calc_pathfinding_node(point, angle_between));
} }
// TODO Eliminating nodes close to each other may improve performance // TODO Eliminating nodes close to each other may improve performance