Several pathfinding bugfixes
This commit is contained in:
+1
-3
@@ -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,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;
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
Reference in New Issue
Block a user