diff options
| author | Kirill Petrashin <kirill8201@yandex.ru> | 2026-04-21 13:36:01 +0300 |
|---|---|---|
| committer | Kirill Petrashin <kirill8201@yandex.ru> | 2026-04-21 13:36:01 +0300 |
| commit | e50ce34ae6fc52b919ed3a43af1b6b41f0240bd0 (patch) | |
| tree | b4d893ebcf152510daecd9b57cc47ab3d1c54a8d | |
| parent | df2c9b2b40bffd207f47445e8465f51a2e77e325 (diff) | |
| download | astar-e50ce34ae6fc52b919ed3a43af1b6b41f0240bd0.tar.xz | |
Improve diagonal_distance(), dramatically enhancing performance
| -rw-r--r-- | path.c | 26 |
1 files changed, 12 insertions, 14 deletions
@@ -295,21 +295,19 @@ size_t manhattan_distance(Position a, Position b) { return d; } -/* FIXME: something faster, maybe? or at least better written. */ size_t diagonal_distance(Position a, Position b) { - size_t one = 0; - size_t two = 0; - if (a.x > b.x) { - one = (a.x - b.x) * COST_ORTHOGONAL; - } else { - one = (b.x - a.x) * COST_ORTHOGONAL; - } - if (a.y > b.y) { - two = (a.y - b.y) * COST_ORTHOGONAL; - } else { - two = (b.y - a.y) * COST_ORTHOGONAL; - } - return (size_t) hypot(one, two); + size_t dx = 0, dy = 0, min = 0; + + if (a.x > b.x) dx = a.x - b.x; + else dx = b.x - a.x; + + if (a.y > b.y) dy = a.y - b.y; + else dy = b.y - a.y; + + if (dx < dy) min = dx; + else min = dy; + + return COST_ORTHOGONAL * (dx + dy) + (COST_DIAGONAL - 2 * COST_ORTHOGONAL) * min; } size_t path_length(Path path, Position start, Position goal) { |
