-
Notifications
You must be signed in to change notification settings - Fork 2
/
heuristic.cpp
49 lines (47 loc) · 1.81 KB
/
heuristic.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
#include "heuristic.h"
void Heuristic::init(unsigned int width, unsigned int height)
{
h_values.clear();
h_values.resize(height);
for(unsigned int i = 0; i < height; i++)
h_values[i].resize(width, CN_INFINITY);
}
void Heuristic::count(const Map &map, Agent agent)
{
LineOfSight los;
los.setSize(0.5);
hNode curNode(agent.goal_i, agent.goal_j, 0);
open.clear();
open.insert(curNode);
int k=0;
while(!open.empty())
{
curNode = *open.get<0>().begin();
open.get<0>().erase(open.get<0>().begin());
k++;
h_values[curNode.i][curNode.j] = curNode.g;
int h = map.height, w = map.width;
for(int i1=-h; i1<h; i1++)
for(int j1=-w; j1<w; j1++)
{
hNode newNode(curNode.i + i1, curNode.j + j1, (curNode.i + i1)*map.width + curNode.j + j1);
newNode.g = curNode.g + dist(curNode, newNode);
if(map.CellOnGrid(newNode.i, newNode.j))
if(!map.CellIsObstacle(newNode.i, newNode.j))
if(h_values[newNode.i][newNode.j] > newNode.g)
if(los.checkLine(curNode.i, curNode.j, newNode.i, newNode.j, map))
{
h_values[newNode.i][newNode.j] = newNode.g;
auto it = open.get<1>().find(newNode.id);
if(it != open.get<1>().end())
{
if(it->g > newNode.g)
open.get<1>().erase(it);
else
continue;
}
open.insert(newNode);
}
}
}
}