Render result to png after every routing
This commit is contained in:
parent
367e9cfde0
commit
08e3da6fe3
@ -1,5 +1,6 @@
|
|||||||
using OSMDatastructure;
|
using OSMDatastructure;
|
||||||
using OSMDatastructure.Graph;
|
using OSMDatastructure.Graph;
|
||||||
|
using RenderPath;
|
||||||
using static OSMDatastructure.Tag;
|
using static OSMDatastructure.Tag;
|
||||||
using WayType = OSMDatastructure.Tag.WayType;
|
using WayType = OSMDatastructure.Tag.WayType;
|
||||||
|
|
||||||
@ -28,7 +29,14 @@ public static class Pathfinder
|
|||||||
{
|
{
|
||||||
OsmNode currentNode = openSetfScore.Dequeue();
|
OsmNode currentNode = openSetfScore.Dequeue();
|
||||||
if (currentNode.Equals(goalNode))
|
if (currentNode.Equals(goalNode))
|
||||||
return GetPath(cameFromDict, goalNode, regionManager);
|
{
|
||||||
|
List<PathNode> path = GetPath(cameFromDict, goalNode, regionManager);
|
||||||
|
List<Coordinates> coords = new();
|
||||||
|
foreach(PathNode pn in path)
|
||||||
|
coords.Add(pn.coordinates);
|
||||||
|
Renderer.DrawLoadedNodes(gScore, coords, workingDir);
|
||||||
|
return path;
|
||||||
|
}
|
||||||
|
|
||||||
foreach (OsmEdge edge in currentNode.edges)
|
foreach (OsmEdge edge in currentNode.edges)
|
||||||
{
|
{
|
||||||
|
@ -8,6 +8,7 @@
|
|||||||
|
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<ProjectReference Include="..\OSMDatastructure\OSMDatastructure.csproj" />
|
<ProjectReference Include="..\OSMDatastructure\OSMDatastructure.csproj" />
|
||||||
|
<ProjectReference Include="..\RenderPath\RenderPath.csproj" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
|
|
||||||
</Project>
|
</Project>
|
||||||
|
@ -6,12 +6,12 @@
|
|||||||
<Nullable>enable</Nullable>
|
<Nullable>enable</Nullable>
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
|
|
||||||
<ItemGroup>
|
|
||||||
<ProjectReference Include="..\Pathfinding\Pathfinding.csproj" />
|
|
||||||
</ItemGroup>
|
|
||||||
|
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<PackageReference Include="System.Drawing.Common" Version="7.0.0" />
|
<PackageReference Include="System.Drawing.Common" Version="7.0.0" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
|
|
||||||
|
<ItemGroup>
|
||||||
|
<ProjectReference Include="..\OSMDatastructure\OSMDatastructure.csproj" />
|
||||||
|
</ItemGroup>
|
||||||
|
|
||||||
</Project>
|
</Project>
|
||||||
|
@ -1,5 +1,4 @@
|
|||||||
using System.Diagnostics.CodeAnalysis;
|
using System.Diagnostics.CodeAnalysis;
|
||||||
using Pathfinding;
|
|
||||||
using System.Drawing;
|
using System.Drawing;
|
||||||
using System.Drawing.Imaging;
|
using System.Drawing.Imaging;
|
||||||
using OSMDatastructure.Graph;
|
using OSMDatastructure.Graph;
|
||||||
@ -9,13 +8,17 @@ namespace RenderPath;
|
|||||||
public class Renderer
|
public class Renderer
|
||||||
{
|
{
|
||||||
[SuppressMessage("Interoperability", "CA1416:Plattformkompatibilität überprüfen")]
|
[SuppressMessage("Interoperability", "CA1416:Plattformkompatibilität überprüfen")]
|
||||||
public static Bitmap DrawFromPath(List<PathNode> nodes)
|
|
||||||
{
|
|
||||||
float minLat = nodes.Min(node => node.coordinates.latitude);
|
|
||||||
float minLon = nodes.Min(node => node.coordinates.longitude);
|
|
||||||
float maxLat = nodes.Max(node => node.coordinates.latitude);
|
|
||||||
float maxLon = nodes.Max(node => node.coordinates.longitude);
|
|
||||||
|
|
||||||
|
public static void DrawLoadedNodes(Dictionary<OsmNode, double> gScoreDict, List<Coordinates> pathCoordinates, string workingDir)
|
||||||
|
{
|
||||||
|
float minLat = gScoreDict.Min(kv => kv.Key.coordinates.latitude);
|
||||||
|
float minLon = gScoreDict.Min(kv => kv.Key.coordinates.longitude);
|
||||||
|
float maxLat = gScoreDict.Max(kv => kv.Key.coordinates.latitude);
|
||||||
|
float maxLon = gScoreDict.Max(kv => kv.Key.coordinates.longitude);
|
||||||
|
|
||||||
|
double minWeight = gScoreDict.Min(kv => kv.Value);
|
||||||
|
double maxWeight = gScoreDict.Max(kv => kv.Value);
|
||||||
|
|
||||||
float latDiff = maxLat - minLat;
|
float latDiff = maxLat - minLat;
|
||||||
float lonDiff = maxLon - minLon;
|
float lonDiff = maxLon - minLon;
|
||||||
|
|
||||||
@ -26,21 +29,51 @@ public class Renderer
|
|||||||
int pixelsY = (int)(latDiff * scaleFactor);
|
int pixelsY = (int)(latDiff * scaleFactor);
|
||||||
|
|
||||||
Bitmap ret = new Bitmap(pixelsX, pixelsY, PixelFormat.Format32bppRgb);
|
Bitmap ret = new Bitmap(pixelsX, pixelsY, PixelFormat.Format32bppRgb);
|
||||||
|
|
||||||
Graphics g = Graphics.FromImage(ret);
|
Graphics g = Graphics.FromImage(ret);
|
||||||
Pen p = new Pen(Color.Black, 2);
|
|
||||||
g.Clear(Color.White);
|
g.Clear(Color.White);
|
||||||
|
|
||||||
for (int i = 0; i < nodes.Count - 1; i++)
|
Color start = Color.FromArgb(0, 0, 255);
|
||||||
|
Color center = Color.FromArgb(255, 255, 0);
|
||||||
|
Color end = Color.FromArgb(255, 0, 0);
|
||||||
|
|
||||||
|
foreach (KeyValuePair<OsmNode, double> kv in gScoreDict)
|
||||||
{
|
{
|
||||||
Coordinates c1 = nodes[i].coordinates;
|
double percentage = kv.Value / maxWeight;
|
||||||
Coordinates c2 = nodes[i+1].coordinates;
|
Brush b = new SolidBrush(GradientPick(percentage, start, center, end));
|
||||||
|
float x = (kv.Key.coordinates.longitude - minLon) * scaleFactor;
|
||||||
|
float y = (maxLat - kv.Key.coordinates.latitude) * scaleFactor;
|
||||||
|
g.FillEllipse(b, x, y, 4, 4);
|
||||||
|
}
|
||||||
|
|
||||||
|
Pen p = new Pen(Color.Red, 2);
|
||||||
|
|
||||||
|
for (int i = 0; i < pathCoordinates.Count - 1; i++)
|
||||||
|
{
|
||||||
|
Coordinates c1 = pathCoordinates[i];
|
||||||
|
Coordinates c2 = pathCoordinates[i+1];
|
||||||
Point p1 = new(Convert.ToInt32((c1.longitude - minLon) * scaleFactor), Convert.ToInt32((maxLat - c1.latitude) * scaleFactor));
|
Point p1 = new(Convert.ToInt32((c1.longitude - minLon) * scaleFactor), Convert.ToInt32((maxLat - c1.latitude) * scaleFactor));
|
||||||
Point p2 = new(Convert.ToInt32((c2.longitude - minLon) * scaleFactor), Convert.ToInt32((maxLat - c2.latitude) * scaleFactor));
|
Point p2 = new(Convert.ToInt32((c2.longitude - minLon) * scaleFactor), Convert.ToInt32((maxLat - c2.latitude) * scaleFactor));
|
||||||
g.DrawLine(p, p1, p2);
|
g.DrawLine(p, p1, p2);
|
||||||
}
|
}
|
||||||
|
|
||||||
ret.Save(@"D:\render.png", ImageFormat.Bmp);
|
ret.Save(Path.Join(Directory.GetParent(workingDir)!.FullName, "routing.png"), ImageFormat.Bmp);
|
||||||
return ret;
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* https://stackoverflow.com/questions/55601338/get-a-color-value-within-a-gradient-based-on-a-value
|
||||||
|
*/
|
||||||
|
private static int LinearInterp(int start, int end, double percentage) => start + (int)Math.Round(percentage * (end - start));
|
||||||
|
private static Color ColorInterp(Color start, Color end, double percentage) =>
|
||||||
|
Color.FromArgb(LinearInterp(start.A, end.A, percentage),
|
||||||
|
LinearInterp(start.R, end.R, percentage),
|
||||||
|
LinearInterp(start.G, end.G, percentage),
|
||||||
|
LinearInterp(start.B, end.B, percentage));
|
||||||
|
private static Color GradientPick(double percentage, Color Start, Color Center, Color End) {
|
||||||
|
if (percentage < 0.5)
|
||||||
|
return ColorInterp(Start, Center, percentage / 0.5);
|
||||||
|
else if (percentage == 0.5)
|
||||||
|
return Center;
|
||||||
|
else
|
||||||
|
return ColorInterp(Center, End, (percentage - 0.5)/0.5);
|
||||||
}
|
}
|
||||||
}
|
}
|
@ -22,6 +22,5 @@ public class Server
|
|||||||
List<PathNode> result = Pathfinder.AStar("D:/stuttgart-regbez-latest", start,
|
List<PathNode> result = Pathfinder.AStar("D:/stuttgart-regbez-latest", start,
|
||||||
finish, Tag.SpeedType.car, 20, 2,
|
finish, Tag.SpeedType.car, 20, 2,
|
||||||
0);
|
0);
|
||||||
RenderPath.Renderer.DrawFromPath(result);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
Reference in New Issue
Block a user