Moved RoadPriority Function to RegionManager
This commit is contained in:
parent
42e915ee05
commit
dd37430761
@ -82,41 +82,6 @@ public class Pathfinder
|
|||||||
return this;
|
return this;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void SaveResult(string path)
|
|
||||||
{
|
|
||||||
FileStream fs = new (path, FileMode.CreateNew);
|
|
||||||
JsonSerializer.Serialize(fs, pathResult, JsonSerializerOptions.Default);
|
|
||||||
fs.Dispose();
|
|
||||||
Console.WriteLine($"Saved result to {path}");
|
|
||||||
}
|
|
||||||
|
|
||||||
private PathResult GetPath(OsmNode goalNode, TimeSpan calcFinished)
|
|
||||||
{
|
|
||||||
List<PathNode> path = new();
|
|
||||||
OsmNode currentNode = goalNode;
|
|
||||||
double retDistance = 0;
|
|
||||||
double weight = 0;
|
|
||||||
while (_cameFromDict!.ContainsKey(_cameFromDict[currentNode]))
|
|
||||||
{
|
|
||||||
OsmEdge? currentEdge = _cameFromDict[currentNode].edges.First(edge => edge.neighborId == currentNode.nodeId);
|
|
||||||
HashSet<Tag>? tags =
|
|
||||||
regionManager.GetRegion(currentNode.coordinates)!.tagManager.GetTagsForWayId(currentEdge.wayId);
|
|
||||||
PathNode? newNode = PathNode.FromOsmNode(currentNode, tags);
|
|
||||||
if(newNode is not null)
|
|
||||||
path.Add(newNode);
|
|
||||||
|
|
||||||
double distance = Utils.DistanceBetween(currentNode, _cameFromDict[currentNode]);
|
|
||||||
retDistance += distance;
|
|
||||||
weight += regionManager.GetSpeedForEdge(_cameFromDict[currentNode], currentEdge.wayId, _speedType);
|
|
||||||
|
|
||||||
currentNode = _cameFromDict[currentNode];
|
|
||||||
}
|
|
||||||
|
|
||||||
path.Reverse();
|
|
||||||
|
|
||||||
return new PathResult(calcFinished, path, retDistance, retDistance / (weight / path.Count));
|
|
||||||
}
|
|
||||||
|
|
||||||
private double Weight(OsmNode currentNode, OsmNode neighborNode, OsmEdge edge, double angleWeightFactor)
|
private double Weight(OsmNode currentNode, OsmNode neighborNode, OsmEdge edge, double angleWeightFactor)
|
||||||
{
|
{
|
||||||
double distance = Utils.DistanceBetween(currentNode, neighborNode);
|
double distance = Utils.DistanceBetween(currentNode, neighborNode);
|
||||||
@ -131,13 +96,13 @@ public class Pathfinder
|
|||||||
double nodeAngle = v1.Angle(v2);
|
double nodeAngle = v1.Angle(v2);
|
||||||
angle = ((180 - nodeAngle) / 180) * angleWeightFactor;
|
angle = ((180 - nodeAngle) / 180) * angleWeightFactor;
|
||||||
}
|
}
|
||||||
double prio = GetPriorityVehicleRoad(edge, regionManager.GetRegion(currentNode.coordinates)!);
|
double prio = regionManager.GetPriorityForVehicle(_speedType,edge, regionManager.GetRegion(currentNode.coordinates)!);
|
||||||
return distance / (1 + speed + angle + prio);
|
return distance / (1 + speed + angle + prio);
|
||||||
}
|
}
|
||||||
|
|
||||||
private double Heuristic(OsmNode currentNode, OsmNode neighborNode, OsmNode goalNode, OsmEdge edge, double roadPriorityFactor, double junctionFactor, double sameRoadFactor, double nodeAngleFactor)
|
private double Heuristic(OsmNode currentNode, OsmNode neighborNode, OsmNode goalNode, OsmEdge edge, double roadPriorityFactor, double junctionFactor, double sameRoadFactor, double nodeAngleFactor)
|
||||||
{
|
{
|
||||||
double roadPriority = GetPriorityVehicleRoad(edge, regionManager.GetRegion(currentNode.coordinates)!) * roadPriorityFactor;
|
double roadPriority = regionManager.GetPriorityForVehicle(_speedType, edge, regionManager.GetRegion(currentNode.coordinates)!) * roadPriorityFactor;
|
||||||
if (roadPriority == 0)
|
if (roadPriority == 0)
|
||||||
return double.MaxValue;
|
return double.MaxValue;
|
||||||
|
|
||||||
@ -174,6 +139,41 @@ public class Pathfinder
|
|||||||
return Utils.DistanceBetween(neighborNode, goalNode) / (roadPriority + sameRoadName + junctionCount + angle);
|
return Utils.DistanceBetween(neighborNode, goalNode) / (roadPriority + sameRoadName + junctionCount + angle);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void SaveResult(string path)
|
||||||
|
{
|
||||||
|
FileStream fs = new (path, FileMode.CreateNew);
|
||||||
|
JsonSerializer.Serialize(fs, pathResult, JsonSerializerOptions.Default);
|
||||||
|
fs.Dispose();
|
||||||
|
Console.WriteLine($"Saved result to {path}");
|
||||||
|
}
|
||||||
|
|
||||||
|
private PathResult GetPath(OsmNode goalNode, TimeSpan calcFinished)
|
||||||
|
{
|
||||||
|
List<PathNode> path = new();
|
||||||
|
OsmNode currentNode = goalNode;
|
||||||
|
double retDistance = 0;
|
||||||
|
double weight = 0;
|
||||||
|
while (_cameFromDict!.ContainsKey(_cameFromDict[currentNode]))
|
||||||
|
{
|
||||||
|
OsmEdge? currentEdge = _cameFromDict[currentNode].edges.First(edge => edge.neighborId == currentNode.nodeId);
|
||||||
|
HashSet<Tag>? tags =
|
||||||
|
regionManager.GetRegion(currentNode.coordinates)!.tagManager.GetTagsForWayId(currentEdge.wayId);
|
||||||
|
PathNode? newNode = PathNode.FromOsmNode(currentNode, tags);
|
||||||
|
if(newNode is not null)
|
||||||
|
path.Add(newNode);
|
||||||
|
|
||||||
|
double distance = Utils.DistanceBetween(currentNode, _cameFromDict[currentNode]);
|
||||||
|
retDistance += distance;
|
||||||
|
weight += regionManager.GetSpeedForEdge(_cameFromDict[currentNode], currentEdge.wayId, _speedType);
|
||||||
|
|
||||||
|
currentNode = _cameFromDict[currentNode];
|
||||||
|
}
|
||||||
|
|
||||||
|
path.Reverse();
|
||||||
|
|
||||||
|
return new PathResult(calcFinished, path, retDistance, retDistance / (weight / path.Count));
|
||||||
|
}
|
||||||
|
|
||||||
private class Vector
|
private class Vector
|
||||||
{
|
{
|
||||||
public float x, y;
|
public float x, y;
|
||||||
@ -205,66 +205,4 @@ public class Pathfinder
|
|||||||
return angle;
|
return angle;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private double GetPriorityVehicleRoad(OsmEdge edge, Region region)
|
|
||||||
{
|
|
||||||
if (_speedType == SpeedType.any)
|
|
||||||
return 1;
|
|
||||||
WayType? wayType = (WayType?)region.tagManager.GetTag(edge.wayId, TagType.highway);
|
|
||||||
if(wayType is null)
|
|
||||||
return 0;
|
|
||||||
if (_speedType == SpeedType.car)
|
|
||||||
{
|
|
||||||
switch (wayType)
|
|
||||||
{
|
|
||||||
case WayType.motorway:
|
|
||||||
case WayType.motorway_link:
|
|
||||||
case WayType.motorroad:
|
|
||||||
return 17;
|
|
||||||
case WayType.trunk:
|
|
||||||
case WayType.trunk_link:
|
|
||||||
case WayType.primary:
|
|
||||||
case WayType.primary_link:
|
|
||||||
return 10;
|
|
||||||
case WayType.secondary:
|
|
||||||
case WayType.secondary_link:
|
|
||||||
return 7;
|
|
||||||
case WayType.tertiary:
|
|
||||||
case WayType.tertiary_link:
|
|
||||||
return 5;
|
|
||||||
case WayType.unclassified:
|
|
||||||
case WayType.residential:
|
|
||||||
case WayType.road:
|
|
||||||
case WayType.living_street:
|
|
||||||
return 2;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (_speedType == SpeedType.pedestrian)
|
|
||||||
{
|
|
||||||
switch (wayType)
|
|
||||||
{
|
|
||||||
case WayType.pedestrian:
|
|
||||||
case WayType.corridor:
|
|
||||||
case WayType.footway:
|
|
||||||
case WayType.path:
|
|
||||||
case WayType.steps:
|
|
||||||
case WayType.residential:
|
|
||||||
case WayType.living_street:
|
|
||||||
return 10;
|
|
||||||
case WayType.service:
|
|
||||||
case WayType.cycleway:
|
|
||||||
case WayType.bridleway:
|
|
||||||
case WayType.road:
|
|
||||||
case WayType.track:
|
|
||||||
case WayType.unclassified:
|
|
||||||
return 5;
|
|
||||||
case WayType.tertiary:
|
|
||||||
case WayType.tertiary_link:
|
|
||||||
case WayType.escape:
|
|
||||||
return 2;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
}
|
}
|
@ -1,6 +1,8 @@
|
|||||||
using System.Text.Json;
|
using System.Text.Json;
|
||||||
using OSMDatastructure;
|
using OSMDatastructure;
|
||||||
using OSMDatastructure.Graph;
|
using OSMDatastructure.Graph;
|
||||||
|
using SpeedType = OSMDatastructure.Tag.SpeedType;
|
||||||
|
using WayType = OSMDatastructure.Tag.WayType;
|
||||||
|
|
||||||
namespace Pathfinding
|
namespace Pathfinding
|
||||||
{
|
{
|
||||||
@ -128,5 +130,68 @@ namespace Pathfinding
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public double GetPriorityForVehicle(SpeedType speedType, OsmEdge edge, Region region)
|
||||||
|
{
|
||||||
|
if (speedType == SpeedType.any)
|
||||||
|
return 1;
|
||||||
|
WayType? wayType = (WayType?)region.tagManager.GetTag(edge.wayId, Tag.TagType.highway);
|
||||||
|
if(wayType is null)
|
||||||
|
return 0;
|
||||||
|
if (speedType == SpeedType.car)
|
||||||
|
{
|
||||||
|
switch (wayType)
|
||||||
|
{
|
||||||
|
case WayType.motorway:
|
||||||
|
case WayType.motorway_link:
|
||||||
|
case WayType.motorroad:
|
||||||
|
return 17;
|
||||||
|
case WayType.trunk:
|
||||||
|
case WayType.trunk_link:
|
||||||
|
case WayType.primary:
|
||||||
|
case WayType.primary_link:
|
||||||
|
return 10;
|
||||||
|
case WayType.secondary:
|
||||||
|
case WayType.secondary_link:
|
||||||
|
return 7;
|
||||||
|
case WayType.tertiary:
|
||||||
|
case WayType.tertiary_link:
|
||||||
|
return 5;
|
||||||
|
case WayType.unclassified:
|
||||||
|
case WayType.residential:
|
||||||
|
case WayType.road:
|
||||||
|
case WayType.living_street:
|
||||||
|
return 2;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (speedType == SpeedType.pedestrian)
|
||||||
|
{
|
||||||
|
switch (wayType)
|
||||||
|
{
|
||||||
|
case WayType.pedestrian:
|
||||||
|
case WayType.corridor:
|
||||||
|
case WayType.footway:
|
||||||
|
case WayType.path:
|
||||||
|
case WayType.steps:
|
||||||
|
case WayType.residential:
|
||||||
|
case WayType.living_street:
|
||||||
|
return 10;
|
||||||
|
case WayType.service:
|
||||||
|
case WayType.cycleway:
|
||||||
|
case WayType.bridleway:
|
||||||
|
case WayType.road:
|
||||||
|
case WayType.track:
|
||||||
|
case WayType.unclassified:
|
||||||
|
return 5;
|
||||||
|
case WayType.tertiary:
|
||||||
|
case WayType.tertiary_link:
|
||||||
|
case WayType.escape:
|
||||||
|
return 2;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
Reference in New Issue
Block a user