From 3d5b5b49870adaec2a8c3ab9e85c4c64e1204190 Mon Sep 17 00:00:00 2001 From: gpascualg Date: Fri, 19 May 2017 13:44:20 +0200 Subject: [PATCH 1/2] Allow steps to be non-diagonal --- JPS.h | 58 ++++++++++++++++++++++++++++++++++++++++++++++--- test/main | Bin 0 -> 33000 bytes test/main.cpp | 2 +- test/main2 | Bin 0 -> 48840 bytes test/main2.cpp | 2 +- 5 files changed, 57 insertions(+), 5 deletions(-) create mode 100755 test/main create mode 100755 test/main2 diff --git a/JPS.h b/JPS.h index a643886..0366bef 100644 --- a/JPS.h +++ b/JPS.h @@ -252,7 +252,11 @@ template class Searcher { public: Searcher(const GRID& g) - : grid(g), endNode(NULL), skip(1), stepsRemain(0), stepsDone(0) + : grid(g), endNode(NULL), skip(1), stepsRemain(0), stepsDone(0), useDiagonals(true) + {} + + Searcher(const GRID& g, bool useDiagonals) + : grid(g), endNode(NULL), skip(1), stepsRemain(0), stepsDone(0), useDiagonals(useDiagonals) {} // single-call @@ -278,6 +282,7 @@ template class Searcher int skip; int stepsRemain; size_t stepsDone; + bool useDiagonals; OpenList open; NodeGrid nodegrid; @@ -661,7 +666,7 @@ template bool Searcher::generatePath(PathVector& path, uns if(!endNode) return false; size_t offset = path.size(); - if(step) + if(step && useDiagonals) { const Node *next = endNode; const Node *prev = endNode->parent; @@ -690,6 +695,52 @@ template bool Searcher::generatePath(PathVector& path, uns } while (prev); } + else if (step && !useDiagonals) + { + const Node *next = endNode; + const Node *prev = endNode->parent; + if(!prev) + return false; + do + { + const unsigned x = next->pos.x, y = next->pos.y; + int dx = int(prev->pos.x - x); + int dy = int(prev->pos.y - y); + JPS_ASSERT(!dx || !dy || abs(dx) == abs(dy)); // known to be straight, if diagonal + const int steps = abs(dx) + abs(dy); + dx /= std::max(abs(dx), 1); + dy /= std::max(abs(dy), 1); + dx *= int(step); + dy *= int(step); + int dxa = 0, dya = 0; + for(int i = 0; i < steps; i += step) + { + if (dx && dy) + { + if (grid(prev->pos.x + dxa + dx, prev->pos.y + dya)) + { + path.push_back(Pos(prev->pos.x + dxa + dx, prev->pos.y + dya)); + path.push_back(Pos(prev->pos.x + dxa + dx, prev->pos.y + dya + dy)); + } + else + { + path.push_back(Pos(prev->pos.x + dxa, prev->pos.y + dya + dy)); + path.push_back(Pos(prev->pos.x + dxa + dx, prev->pos.y + dya + dy)); + } + } + else + { + path.push_back(Pos(x+dxa, y+dya)); + } + + dxa += dx; + dya += dy; + } + next = prev; + prev = prev->parent; + } + while (prev); + } else { const Node *next = endNode; @@ -910,10 +961,11 @@ using Internal::Searcher; // This will also skip through walls if they are less than blocks thick at any reachable position. template bool findPath(PathVector& path, const GRID& grid, unsigned startx, unsigned starty, unsigned endx, unsigned endy, unsigned step = 0, int skip = 0, // optional params + bool useDiagonals = true, // whether to use diagonal steps size_t *stepsDone = NULL, size_t *nodesExpanded = NULL // for information ) { - Searcher search(grid); + Searcher search(grid, useDiagonals); search.setSkip(skip); bool found = search.findPath(path, Pos(startx, starty), Pos(endx, endy), step); if(stepsDone) diff --git a/test/main b/test/main new file mode 100755 index 0000000000000000000000000000000000000000..ab613921c7f3c264858bffdf362f10bf1f454331 GIT binary patch literal 33000 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 literal 0 HcmV?d00001 diff --git a/test/main.cpp b/test/main.cpp index a47a4f7..0c11404 100644 --- a/test/main.cpp +++ b/test/main.cpp @@ -93,7 +93,7 @@ int main(int argc, char **argv) size_t stepsDone, nodesExpanded; for(size_t i = 1; i < waypoints.size(); ++i) { - bool found = JPS::findPath(path, grid, waypoints[i-1].x, waypoints[i-1].y, waypoints[i].x, waypoints[i].y, step, 0, &stepsDone, &nodesExpanded); + bool found = JPS::findPath(path, grid, waypoints[i-1].x, waypoints[i-1].y, waypoints[i].x, waypoints[i].y, step, 0, true, &stepsDone, &nodesExpanded); if(found) { assert(path[0] != waypoints[i-1]); diff --git a/test/main2 b/test/main2 new file mode 100755 index 0000000000000000000000000000000000000000..31fcc45557f547db6e15a36758517c7244d97250 GIT binary patch literal 48840 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 Date: Wed, 19 Jul 2017 04:03:32 +0200 Subject: [PATCH 2/2] Fix non-diagonal movements --- JPS.h | 25 ++++++++++++++++--------- 1 file changed, 16 insertions(+), 9 deletions(-) diff --git a/JPS.h b/JPS.h index 0366bef..5a681fa 100644 --- a/JPS.h +++ b/JPS.h @@ -707,34 +707,41 @@ template bool Searcher::generatePath(PathVector& path, uns int dx = int(prev->pos.x - x); int dy = int(prev->pos.y - y); JPS_ASSERT(!dx || !dy || abs(dx) == abs(dy)); // known to be straight, if diagonal - const int steps = abs(dx) + abs(dy); + const int steps = std::max(abs(dx), abs(dy)); dx /= std::max(abs(dx), 1); dy /= std::max(abs(dy), 1); dx *= int(step); dy *= int(step); int dxa = 0, dya = 0; + for(int i = 0; i < steps; i += step) { if (dx && dy) { - if (grid(prev->pos.x + dxa + dx, prev->pos.y + dya)) + if (grid(x + dxa + dx, y + dya)) { - path.push_back(Pos(prev->pos.x + dxa + dx, prev->pos.y + dya)); - path.push_back(Pos(prev->pos.x + dxa + dx, prev->pos.y + dya + dy)); + path.push_back(Pos(x + dxa, y + dya)); + dxa += dx; + + path.push_back(Pos(x + dxa, y + dya)); + dya += dy; } else { - path.push_back(Pos(prev->pos.x + dxa, prev->pos.y + dya + dy)); - path.push_back(Pos(prev->pos.x + dxa + dx, prev->pos.y + dya + dy)); + path.push_back(Pos(x + dxa, y + dya)); + dya += dy; + + path.push_back(Pos(x + dxa, y + dya)); + dxa += dx; } } else { path.push_back(Pos(x+dxa, y+dya)); - } - dxa += dx; - dya += dy; + dxa += dx; + dya += dy; + } } next = prev; prev = prev->parent;