dungeon/src/Pathfinder.h

72 lines
1.5 KiB
C
Raw Permalink Normal View History

2017-09-17 13:43:13 +02:00
#pragma once
#include "vec2i.h"
#include <vector>
class Tilemap;
namespace Pathfinder
{
struct AStarNode
{
vec2i pos;
float f, g, h = 0;
AStarNode* from = nullptr;
};
struct DijkstraMap {
float* tilemap = nullptr;
int width, height;
2018-01-09 21:59:05 +01:00
float get_value(int x, int y) {
2017-09-17 13:43:13 +02:00
if (x >= 0 && x < width && y >= 0 && y < height) {
return tilemap[y*width + x];
}
else {
return 99999999;
}
}
void setValue(int x, int y, float val) {
if (x >= 0 && x < width && y >= 0 && y < height) {
tilemap[y*width + x] = val;
}
}
void mult(float val) {
for (int i = 0; i < width * height; i++) {
tilemap[i] *= val;
}
}
void add(float val) {
for (int i = 0; i < width * height; i++) {
tilemap[i] += val;
}
}
void abs() {
for (int i = 0; i < width * height; i++) {
if (tilemap[i] < 0) {
tilemap[i] *= -1;
}
}
}
void clamp(float min, float max) {
for (int i = 0; i < width * height; i++) {
if (tilemap[i] < min) {
tilemap[i] = min;
}
else if (tilemap[i] > max) {
tilemap[i] = max;
}
}
}
};
float distance(vec2i a, vec2i b);
2018-01-09 21:59:05 +01:00
std::vector<vec2i> a_star(Tilemap* map, vec2i start, vec2i goal);
void calc_dijkstra_map(Tilemap& map, std::vector<vec2i>& goals, DijkstraMap& out, float maxValue = 32);
}