implement direction cost
This commit is contained in:
parent
1015886a71
commit
8433934bcd
@ -35,12 +35,13 @@ class Astar
|
|||||||
var adjacentNodes = new List<Nodes>()
|
var adjacentNodes = new List<Nodes>()
|
||||||
|
|
||||||
{
|
{
|
||||||
new Nodes(new Vector2(currentPos.X, currentPos.Y+1)),
|
new Nodes(new Vector2(currentPos.X, currentPos.Y+1), 0),
|
||||||
new Nodes(new Vector2(currentPos.X + 1, currentPos.Y)),
|
new Nodes(new Vector2(currentPos.X + 1, currentPos.Y), 1),
|
||||||
new Nodes(new Vector2(currentPos.X, currentPos.Y - 1)),
|
new Nodes(new Vector2(currentPos.X, currentPos.Y - 1), 2),
|
||||||
new Nodes(new Vector2(currentPos.X - 1, currentPos.Y)),
|
new Nodes(new Vector2(currentPos.X - 1, currentPos.Y), -1),
|
||||||
};
|
};
|
||||||
|
|
||||||
|
//check if out of range
|
||||||
for (int i = 3; i >=0; i--)
|
for (int i = 3; i >=0; i--)
|
||||||
{
|
{
|
||||||
if (adjacentNodes[i].getCords().X < 0 || adjacentNodes[i].getCords().Y < 0)
|
if (adjacentNodes[i].getCords().X < 0 || adjacentNodes[i].getCords().Y < 0)
|
||||||
@ -56,12 +57,23 @@ class Astar
|
|||||||
item => crops[(int)item.getCords().X, (int)item.getCords().Y].Status != 0).ToList();
|
item => crops[(int)item.getCords().X, (int)item.getCords().Y].Status != 0).ToList();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Heuristic function, Manhattan method.
|
||||||
public int ComputeHScore(Vector2 currentNode, Vector2 endNote)
|
public int ComputeHScore(Vector2 currentNode, Vector2 endNote)
|
||||||
{
|
{
|
||||||
return (int)(Math.Abs(endNote.X - currentNode.X) + Math.Abs(endNote.Y - currentNode.Y));
|
return (int)(Math.Abs(endNote.X - currentNode.X) + Math.Abs(endNote.Y - currentNode.Y));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public int CalculateRotationCost(int currDir, int newDir)
|
||||||
|
{
|
||||||
|
if (currDir == newDir)
|
||||||
|
return 0;
|
||||||
|
else if (Math.Abs(currDir - newDir) == 1 || Math.Abs(currDir - newDir) == 3)
|
||||||
|
return 1;
|
||||||
|
else if (Math.Abs(currDir - newDir) == 0 || Math.Abs(currDir - newDir) == 2) //its for turning back, so it never should happen anyway, remove this check then?
|
||||||
|
return 10;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
public Path FindPath()
|
public Path FindPath()
|
||||||
{
|
{
|
||||||
Path path = new Path();
|
Path path = new Path();
|
||||||
@ -72,6 +84,7 @@ class Astar
|
|||||||
Nodes target = new Nodes(targetPos);
|
Nodes target = new Nodes(targetPos);
|
||||||
Nodes startPos = new Nodes (tractorPos);
|
Nodes startPos = new Nodes (tractorPos);
|
||||||
Nodes current = null;
|
Nodes current = null;
|
||||||
|
int direction = 6;
|
||||||
int g = 0;
|
int g = 0;
|
||||||
|
|
||||||
//openList.Enqueue(startPos);
|
//openList.Enqueue(startPos);
|
||||||
@ -87,6 +100,7 @@ class Astar
|
|||||||
//closedList.Enqueue(current);
|
//closedList.Enqueue(current);
|
||||||
openList.removeMin();
|
openList.removeMin();
|
||||||
//openList.Dequeue();
|
//openList.Dequeue();
|
||||||
|
direction = current.getDirection();
|
||||||
|
|
||||||
if (current.getCords() == target.getCords())
|
if (current.getCords() == target.getCords())
|
||||||
break;
|
break;
|
||||||
@ -99,9 +113,9 @@ class Astar
|
|||||||
//g++;
|
//g++;
|
||||||
foreach(var adjacentNode in adjacentNodes)
|
foreach(var adjacentNode in adjacentNodes)
|
||||||
{
|
{
|
||||||
g = current.getG() + crops[(int)adjacentNode.getCords().X, (int)adjacentNode.getCords().Y].getCostOnMovement();
|
|
||||||
if (closedList.Exists(adjacentNode.getCords()))
|
if (closedList.Exists(adjacentNode.getCords()))
|
||||||
continue;
|
continue;
|
||||||
|
g = current.getG() + crops[(int)adjacentNode.getCords().X, (int)adjacentNode.getCords().Y].getCostOnMovement() + CalculateRotationCost(direction, adjacentNode.getDirection());
|
||||||
if (!(openList.Exists(adjacentNode.getCords())))
|
if (!(openList.Exists(adjacentNode.getCords())))
|
||||||
{
|
{
|
||||||
|
|
||||||
@ -121,7 +135,9 @@ class Astar
|
|||||||
adjacentNode.setParent(current);
|
adjacentNode.setParent(current);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
//openList.BuildMinHeap(openList.GetList());
|
//openList.BuildMinHeap(openList.GetList());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -14,12 +14,19 @@ class Nodes
|
|||||||
private int H = 0;
|
private int H = 0;
|
||||||
private Vector2 Coordinates;
|
private Vector2 Coordinates;
|
||||||
private Nodes Parent = null;
|
private Nodes Parent = null;
|
||||||
|
private int Direction = 0;
|
||||||
|
|
||||||
public Nodes(Vector2 coordinates)
|
public Nodes(Vector2 coordinates)
|
||||||
{
|
{
|
||||||
Coordinates = coordinates;
|
Coordinates = coordinates;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public Nodes(Vector2 coordinates, int direction)
|
||||||
|
{
|
||||||
|
Coordinates = coordinates;
|
||||||
|
Direction = direction;
|
||||||
|
}
|
||||||
|
|
||||||
public Nodes (Nodes node)
|
public Nodes (Nodes node)
|
||||||
{
|
{
|
||||||
F = node.F;
|
F = node.F;
|
||||||
@ -82,4 +89,9 @@ class Nodes
|
|||||||
{
|
{
|
||||||
Parent = parent;
|
Parent = parent;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public int getDirection()
|
||||||
|
{
|
||||||
|
return Direction;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user