From 881777520134eed3a8942d6a596a0390e0b281b5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Manuel=20V=C3=B6gele?= Date: Mon, 31 Jan 2022 23:09:16 +0100 Subject: [PATCH] Several pathfinding bugfixes --- js/pathfinding.js | 4 +--- rust/src/lib.rs | 1 + rust/src/pathfinder.rs | 13 ++++++++----- 3 files changed, 10 insertions(+), 8 deletions(-) diff --git a/js/pathfinding.js b/js/pathfinding.js index 271a905..703a55a 100644 --- a/js/pathfinding.js +++ b/js/pathfinding.js @@ -21,9 +21,7 @@ export function findPath(from, to, token, previousWaypoints) { if (!gridlessPathfinder) gridlessPathfinder = GridlessPathfinding.initialize(canvas.walls.placeables); paintGridlessPathfindingDebug(gridlessPathfinder); - const path = GridlessPathfinding.findPath(gridlessPathfinder, from, to); - console.warn(path); - return path; + return GridlessPathfinding.findPath(gridlessPathfinder, from, to); } else { const lastNode = calculatePath(from, to, token, previousWaypoints); diff --git a/rust/src/lib.rs b/rust/src/lib.rs index 9ee8ba0..0d6ae2b 100644 --- a/rust/src/lib.rs +++ b/rust/src/lib.rs @@ -1,4 +1,5 @@ mod geometry; +#[macro_use] mod js_api; mod pathfinder; mod ptr_indexed_hash_set; diff --git a/rust/src/pathfinder.rs b/rust/src/pathfinder.rs index e1f0948..25cc815 100644 --- a/rust/src/pathfinder.rs +++ b/rust/src/pathfinder.rs @@ -1,4 +1,4 @@ -use std::{cell::RefCell, rc::Rc}; +use std::{cell::RefCell, f64::consts::PI, rc::Rc}; use wasm_bindgen::prelude::*; @@ -105,7 +105,7 @@ impl Pathfinder { let x_diff = wall.p2.x - wall.p1.x; let y_diff = wall.p2.y - wall.p1.y; 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)] { let angles = endpoints.entry(point).or_insert_with(|| Vec::new()); angles.push(angle); @@ -119,14 +119,17 @@ impl Pathfinder { assert!(angles.len() > 0); for i in 1..angles.len() { 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; nodes.push(calc_pathfinding_node(point, angle_between)); } 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 = angle_between.rem_euclid(360.0); + let angle_between = angle_between.rem_euclid(2.0 * PI); nodes.push(calc_pathfinding_node(point, angle_between)); } // TODO Eliminating nodes close to each other may improve performance