mirror of
https://github.com/bensuperpc/astar.git
synced 2026-05-05 10:55:18 +02:00
new1
This commit is contained in:
@@ -49,7 +49,6 @@ static void astar_bench(benchmark::State& state) {
|
||||
|
||||
AStar::AStar<CoordinateType, false> pathFinder;
|
||||
benchmark::DoNotOptimize(pathFinder);
|
||||
pathFinder.setWorldSize({mapWidth, mapHeight});
|
||||
pathFinder.setHeuristic(AStar::Heuristic::euclidean);
|
||||
pathFinder.setDiagonalMovement(true);
|
||||
|
||||
@@ -62,15 +61,12 @@ static void astar_bench(benchmark::State& state) {
|
||||
blocks[index] = 0;
|
||||
} else {
|
||||
blocks[index] = 1;
|
||||
pathFinder.addObstacle({static_cast<int32_t>(x), static_cast<int32_t>(y)});
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
blocks[0] = 0;
|
||||
pathFinder.removeObstacle({0, 0});
|
||||
blocks[mapWidth * mapHeight - 1] = 0;
|
||||
pathFinder.removeObstacle({mapWidth - 1, mapHeight - 1});
|
||||
|
||||
AStar::Vec2i source(0, 0);
|
||||
AStar::Vec2i target(mapWidth - 1, mapHeight - 1);
|
||||
@@ -78,8 +74,15 @@ static void astar_bench(benchmark::State& state) {
|
||||
std::vector<AStar::Vec2i> path;
|
||||
benchmark::DoNotOptimize(path);
|
||||
|
||||
std::function<bool(AStar::Vec2i)> isWalkable = [&blocks, mapWidth, mapHeight](AStar::Vec2i pos) {
|
||||
if (pos.x < 0 || pos.x >= mapWidth || pos.y < 0 || pos.y >= mapHeight) {
|
||||
return false;
|
||||
}
|
||||
return blocks[pos.x + pos.y * mapWidth] == 0;
|
||||
};
|
||||
|
||||
for (auto _ : state) {
|
||||
path = pathFinder.findPath(source, target);
|
||||
path = pathFinder.findPath(source, target, {mapWidth, mapHeight}, isWalkable);
|
||||
state.PauseTiming();
|
||||
if (path.size() == 0) {
|
||||
state.SkipWithError("No path found");
|
||||
|
||||
@@ -53,7 +53,6 @@ auto main() -> int {
|
||||
generator_2.setMultiplier((uint32_t)multiplier);
|
||||
|
||||
AStar::AStar<uint32_t, false> pathFinder;
|
||||
pathFinder.setWorldSize({mapWidth, mapHeight});
|
||||
pathFinder.setHeuristic(AStar::Heuristic::manhattan);
|
||||
pathFinder.setDiagonalMovement(true);
|
||||
|
||||
@@ -95,8 +94,6 @@ auto main() -> int {
|
||||
generator_2.setWeightedStrength(weighted_strength);
|
||||
generator_2.setMultiplier((uint32_t)multiplier);
|
||||
|
||||
pathFinder.clear();
|
||||
|
||||
heightmap = generator_2.generate2dMeightmap(0, 0, 0, screenWidth, 0, screenHeight);
|
||||
|
||||
for (uint64_t x = 0; x < mapWidth; x++) {
|
||||
@@ -108,18 +105,22 @@ auto main() -> int {
|
||||
blocks[index] = 0;
|
||||
} else {
|
||||
blocks[index] = 1;
|
||||
pathFinder.addObstacle({static_cast<int32_t>(x), static_cast<int32_t>(y)});
|
||||
}
|
||||
}
|
||||
}
|
||||
blocks[0] = 0;
|
||||
pathFinder.removeObstacle({0, 0});
|
||||
blocks[mapWidth * mapHeight - 1] = 0;
|
||||
pathFinder.removeObstacle({mapWidth - 1, mapHeight - 1});
|
||||
|
||||
std::function<bool(AStar::Vec2i)> isWalkable = [&blocks, mapWidth, mapHeight](AStar::Vec2i pos) {
|
||||
if (pos.x < 0 || pos.x >= mapWidth || pos.y < 0 || pos.y >= mapHeight) {
|
||||
return false;
|
||||
}
|
||||
return blocks[pos.x + pos.y * mapWidth] == 0;
|
||||
};
|
||||
|
||||
pathFinder.setHeuristic(AStar::Heuristic::manhattan);
|
||||
auto start1 = std::chrono::high_resolution_clock::now();
|
||||
auto path = pathFinder.findPath({0, 0}, {mapWidth - 1, mapHeight - 1});
|
||||
auto path = pathFinder.findPath({0, 0}, {mapWidth - 1, mapHeight - 1}, {mapWidth, mapHeight}, isWalkable);
|
||||
auto stop1 = std::chrono::high_resolution_clock::now();
|
||||
if (path.empty()) {
|
||||
std::cout << "Path not found" << std::endl;
|
||||
@@ -134,7 +135,7 @@ auto main() -> int {
|
||||
}
|
||||
|
||||
pathFinder.setHeuristic(AStar::Heuristic::euclidean);
|
||||
path = pathFinder.findPath({0, 0}, {mapWidth - 1, mapHeight - 1});
|
||||
path = pathFinder.findPath({0, 0}, {mapWidth - 1, mapHeight - 1}, {mapWidth, mapHeight}, isWalkable);
|
||||
euclideanPathSize = path.size();
|
||||
|
||||
for (auto& i : path) {
|
||||
@@ -143,7 +144,7 @@ auto main() -> int {
|
||||
}
|
||||
|
||||
pathFinder.setHeuristic(AStar::Heuristic::octagonal);
|
||||
path = pathFinder.findPath({0, 0}, {mapWidth - 1, mapHeight - 1});
|
||||
path = pathFinder.findPath({0, 0}, {mapWidth - 1, mapHeight - 1}, {mapWidth, mapHeight}, isWalkable);
|
||||
octagonalPathSize = path.size();
|
||||
|
||||
for (auto& i : path) {
|
||||
@@ -152,7 +153,7 @@ auto main() -> int {
|
||||
}
|
||||
|
||||
pathFinder.setHeuristic(AStar::Heuristic::chebyshev);
|
||||
path = pathFinder.findPath({0, 0}, {mapWidth - 1, mapHeight - 1});
|
||||
path = pathFinder.findPath({0, 0}, {mapWidth - 1, mapHeight - 1}, {mapWidth, mapHeight}, isWalkable);
|
||||
chebyshevPathSize = path.size();
|
||||
|
||||
for (auto& i : path) {
|
||||
@@ -161,7 +162,7 @@ auto main() -> int {
|
||||
}
|
||||
|
||||
pathFinder.setHeuristic(AStar::Heuristic::euclideanNoSQR);
|
||||
path = pathFinder.findPath({0, 0}, {mapWidth - 1, mapHeight - 1});
|
||||
path = pathFinder.findPath({0, 0}, {mapWidth - 1, mapHeight - 1}, {mapWidth, mapHeight}, isWalkable);
|
||||
euclideanNoSQRPathSize = path.size();
|
||||
|
||||
for (auto& i : path) {
|
||||
@@ -170,7 +171,7 @@ auto main() -> int {
|
||||
}
|
||||
|
||||
pathFinder.setHeuristic(AStar::Heuristic::dijkstra);
|
||||
path = pathFinder.findPath({0, 0}, {mapWidth - 1, mapHeight - 1});
|
||||
path = pathFinder.findPath({0, 0}, {mapWidth - 1, mapHeight - 1}, {mapWidth, mapHeight}, isWalkable);
|
||||
dijkstraPathSize = path.size();
|
||||
|
||||
for (auto& i : path) {
|
||||
|
||||
@@ -53,7 +53,6 @@ auto main() -> int {
|
||||
generator_2.setMultiplier((uint32_t)multiplier);
|
||||
|
||||
AStar::AStar<uint32_t, true> pathFinder;
|
||||
pathFinder.setWorldSize({mapWidth, mapHeight});
|
||||
pathFinder.setHeuristic(AStar::Heuristic::manhattan);
|
||||
pathFinder.setDiagonalMovement(true);
|
||||
|
||||
@@ -90,8 +89,6 @@ auto main() -> int {
|
||||
generator_2.setWeightedStrength(weighted_strength);
|
||||
generator_2.setMultiplier((uint32_t)multiplier);
|
||||
|
||||
pathFinder.clear();
|
||||
|
||||
heightmap = generator_2.generate2dMeightmap(0, 0, 0, screenWidth, 0, screenHeight);
|
||||
|
||||
for (uint64_t x = 0; x < mapWidth; x++) {
|
||||
@@ -103,14 +100,11 @@ auto main() -> int {
|
||||
blocks[index] = 0;
|
||||
} else {
|
||||
blocks[index] = 1;
|
||||
pathFinder.addObstacle({static_cast<int32_t>(x), static_cast<int32_t>(y)});
|
||||
}
|
||||
}
|
||||
}
|
||||
blocks[0] = 0;
|
||||
pathFinder.removeObstacle({0, 0});
|
||||
blocks[mapWidth * mapHeight - 1] = 0;
|
||||
pathFinder.removeObstacle({mapWidth - 1, mapHeight - 1});
|
||||
|
||||
pathFinder.setHeuristic(AStar::Heuristic::euclidean);
|
||||
|
||||
@@ -128,8 +122,15 @@ auto main() -> int {
|
||||
|
||||
pathFinder.setDebugOpenNode(debugOpenNode);
|
||||
|
||||
std::function<bool(AStar::Vec2i)> isWalkable = [&blocks, mapWidth, mapHeight](AStar::Vec2i pos) {
|
||||
if (pos.x < 0 || pos.x >= mapWidth || pos.y < 0 || pos.y >= mapHeight) {
|
||||
return false;
|
||||
}
|
||||
return blocks[pos.x + pos.y * mapWidth] == 0;
|
||||
};
|
||||
|
||||
auto start1 = std::chrono::high_resolution_clock::now();
|
||||
auto path = pathFinder.findPath({0, 0}, {mapWidth - 1, mapHeight - 1});
|
||||
auto path = pathFinder.findPath({0, 0}, {mapWidth - 1, mapHeight - 1}, {mapWidth, mapHeight}, isWalkable);
|
||||
auto stop1 = std::chrono::high_resolution_clock::now();
|
||||
if (path.empty()) {
|
||||
std::cout << "Path not found" << std::endl;
|
||||
|
||||
@@ -6,15 +6,23 @@ TEST(AStar, basic_path_1) {
|
||||
int mapWidth = 4;
|
||||
int mapHeight = 4;
|
||||
AStar::AStar pathFinder;
|
||||
pathFinder.setWorldSize({mapWidth, mapWidth});
|
||||
pathFinder.setHeuristic(AStar::Heuristic::euclidean);
|
||||
pathFinder.setDiagonalMovement(true);
|
||||
|
||||
AStar::Vec2i source(0, 0);
|
||||
AStar::Vec2i target(mapWidth - 1, mapHeight - 1);
|
||||
|
||||
std::function<bool(AStar::Vec2i)> isWalkable = [&pathFinder](AStar::Vec2i pos) {
|
||||
if (pos.x < 0 || pos.x >= 4 || pos.y < 0 || pos.y >= 4) {
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
};
|
||||
|
||||
std::cout << "AStar::AStar pathFinder;" << std::endl;
|
||||
auto path = pathFinder.findPath(source, target);
|
||||
auto path = pathFinder.findPath(source, target, {mapWidth, mapHeight}, isWalkable);
|
||||
|
||||
|
||||
|
||||
EXPECT_EQ(path.size(), 4);
|
||||
|
||||
@@ -28,14 +36,20 @@ TEST(AStar, basic_path_2) {
|
||||
int mapWidth = 10;
|
||||
int mapHeight = 10;
|
||||
AStar::AStar pathFinder;
|
||||
pathFinder.setWorldSize({mapWidth, mapWidth});
|
||||
pathFinder.setHeuristic(AStar::Heuristic::euclidean);
|
||||
pathFinder.setDiagonalMovement(true);
|
||||
|
||||
AStar::Vec2i source(0, 0);
|
||||
AStar::Vec2i target(mapWidth - 1, mapHeight - 1);
|
||||
|
||||
auto path = pathFinder.findPath(source, target);
|
||||
std::function<bool(AStar::Vec2i)> isWalkable = [&pathFinder](AStar::Vec2i pos) {
|
||||
if (pos.x < 0 || pos.x >= 10 || pos.y < 0 || pos.y >= 10) {
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
};
|
||||
|
||||
auto path = pathFinder.findPath(source, target, {mapWidth, mapHeight}, isWalkable);
|
||||
|
||||
EXPECT_EQ(path.size(), 10);
|
||||
|
||||
@@ -49,14 +63,20 @@ TEST(AStar, basic_diagonal_path_wrong_1) {
|
||||
int mapWidth = 10;
|
||||
int mapHeight = 10;
|
||||
AStar::AStar pathFinder;
|
||||
pathFinder.setWorldSize({mapWidth, mapHeight});
|
||||
pathFinder.setHeuristic(AStar::Heuristic::euclidean);
|
||||
pathFinder.setDiagonalMovement(true);
|
||||
|
||||
AStar::Vec2i source(0, 0);
|
||||
AStar::Vec2i target(19, 19);
|
||||
|
||||
auto path = pathFinder.findPath(source, target);
|
||||
std::function<bool(AStar::Vec2i)> isWalkable = [&pathFinder](AStar::Vec2i pos) {
|
||||
if (pos.x < 0 || pos.x >= 10 || pos.y < 0 || pos.y >= 10) {
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
};
|
||||
|
||||
auto path = pathFinder.findPath(source, target, {10, 10}, isWalkable);
|
||||
|
||||
EXPECT_EQ(path.size(), 0);
|
||||
}
|
||||
@@ -65,18 +85,23 @@ TEST(AStar, basic_diagonal_path_wrong_2) {
|
||||
int mapWidth = 10;
|
||||
int mapHeight = 10;
|
||||
AStar::AStar pathFinder;
|
||||
pathFinder.setWorldSize({mapWidth, mapHeight});
|
||||
pathFinder.setHeuristic(AStar::Heuristic::euclidean);
|
||||
pathFinder.setDiagonalMovement(true);
|
||||
|
||||
pathFinder.addObstacle({0, 1});
|
||||
pathFinder.addObstacle({1, 1});
|
||||
pathFinder.addObstacle({1, 0});
|
||||
std::function<bool(AStar::Vec2i)> isWalkable = [&pathFinder](AStar::Vec2i pos) {
|
||||
if (pos.x < 0 || pos.x >= 10 || pos.y < 0 || pos.y >= 10) {
|
||||
return false;
|
||||
}
|
||||
if ((pos.x == 0 && pos.y == 1) || (pos.x == 1 && pos.y == 1) || (pos.x == 1 && pos.y == 0)) {
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
};
|
||||
|
||||
AStar::Vec2i source(0, 0);
|
||||
AStar::Vec2i target(9, 9);
|
||||
|
||||
auto path = pathFinder.findPath(source, target);
|
||||
auto path = pathFinder.findPath(source, target, {10, 10}, isWalkable);
|
||||
|
||||
EXPECT_EQ(path.size(), 0);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user