Added abstract Renderer class that SVGRenderer and PNGRenderer inherit from.

This way standardized rendering methods can be implemented.
This commit is contained in:
2023-05-16 20:00:18 +02:00
parent 7c5d87ca76
commit 3077b4d8b8
4 changed files with 284 additions and 95 deletions

View File

@ -1,5 +1,7 @@
using System.Diagnostics.CodeAnalysis;
using System.Drawing;
using System.Drawing.Imaging;
using System.Text.Json;
using OSMDatastructure;
using OSMDatastructure.Graph;
using Pathfinding;
@ -11,6 +13,7 @@ namespace Server;
public class Server
{
[SuppressMessage("Interoperability", "CA1416:Validate platform compatibility")]
public static void Main(string[] args)
{
ConsoleWriter newConsole = new();
@ -25,27 +28,34 @@ public class Server
Coordinates start = new (48.7933798f, 9.8275859f);
Coordinates finish = new (48.795918f, 9.021618f);
TestVariables(workingDir, start, finish, 16);
GetShortestRoute("D:");
Pathfinder result = new Pathfinder(workingDir, 2, 30).AStar(start, finish, Tag.SpeedType.car, 1);
Renderer image = Renderer.DrawPathfinder(result, Renderer.RenderType.png);
image.Save("D:/stuttgart-regbez-latest");
/*
ValueTuple<Image, Renderer.Bounds> area = Renderer.DrawArea(LoadRegions(workingDir, start, finish));
area.Item1.Save(@"D:\Base.png", ImageFormat.Png);
if(File.Exists(@"D:\bounds"))
File.Delete(@"D:\bounds");
RegionManager rm = LoadRegions(workingDir, start, finish);
Renderer areaRender = Renderer.DrawArea(rm, Renderer.RenderType.PNG);
FileStream s = new(@"D:\bounds", FileMode.OpenOrCreate);
JsonSerializer.Serialize(s, areaRender.bounds, JsonSerializerOptions.Default);
areaRender.Save(@"D:\Base");
s.Dispose();
*/
ValueTuple<Image, Renderer.Bounds> areaDistance = Renderer.DrawPath(
PathResult.PathresultFromFile(@"D:\angle0,140_level0,020_same0,160.result"), Image.FromFile(@"D:\Base.png"), area.Item2);
areaDistance.Item1.Save(@"D:\Distance.png", ImageFormat.Png);
ValueTuple<Image, Renderer.Bounds> areaWeight = Renderer.DrawPath(
PathResult.PathresultFromFile(@"D:\angle0,160_level0,020_same0,020.result"), Image.FromFile(@"D:\Base.png"), area.Item2);
areaWeight.Item1.Save(@"D:\Weight.png", ImageFormat.Png);
*/
//TestVariables(workingDir, start, finish, 12);
//GetShortestRoute("D:");
/*
string parentFolder = new DirectoryInfo(workingDir).Parent!.FullName;
Renderer.Bounds bounds = JsonSerializer.Deserialize<Renderer.Bounds>(new FileStream(@"D:\bounds", FileMode.Open));
Image baseImage = Image.FromFile(@"D:\Base.png");
Pathfinder result = new Pathfinder(workingDir, 0.0215, 30).AStar(start,
finish, Tag.SpeedType.car, 3);
Pathfinder result = new Pathfinder(workingDir, 2, 30).AStar(start,
finish, Tag.SpeedType.car, 4);
Console.WriteLine($"Calc-time {result.pathResult!.calcTime} Path-length: {result.pathResult.pathNodes.Count} Visited-nodes: {result.gScore!.Count}");
@ -55,11 +65,15 @@ public class Server
result.SaveResult(Path.Join(parentFolder, resultFileName));
string renderFileName = $"{new DirectoryInfo(workingDir).Name}-{fileName}.render.png";
Image render = Renderer.DrawPathfinder(result);
#pragma warning disable CA1416
Image renderWeights = Renderer.DrawGScores(result.gScore, baseImage, bounds).Item1;
Image render = Renderer.DrawPath(result.pathResult, renderWeights, bounds).Item1;
render.Save(Path.Join(parentFolder, renderFileName), ImageFormat.Png);
#pragma warning restore CA1416*/
Console.Beep(400, 100);
*/
Console.Beep(400, 50);
Console.Beep(600, 50);
Console.Beep(400, 50);
Console.Beep(600, 50);
}
private static void GetShortestRoute(string directory)
@ -93,7 +107,7 @@ public class Server
float maxLon = c1.longitude > c2.longitude ? c1.longitude : c2.longitude;
RegionManager allRegions = new(workingDir);
for (float lat = minLat - Region.RegionSize; lat < maxLat + Region.RegionSize; lat += Region.RegionSize / 2)
for (float lat = minLat - Region.RegionSize * 3; lat < maxLat + Region.RegionSize * 3; lat += Region.RegionSize / 2)
{
for (float lon = minLon - Region.RegionSize; lon < maxLon + Region.RegionSize; lon += Region.RegionSize / 2)
{
@ -104,6 +118,7 @@ public class Server
return allRegions;
}
[SuppressMessage("Interoperability", "CA1416:Validate platform compatibility")]
private static void TestVariables(string workingDir, Coordinates start, Coordinates finish, int threads)
{
string parentFolder = new DirectoryInfo(workingDir).Parent!.FullName;
@ -111,17 +126,34 @@ public class Server
RegionManager rm = LoadRegions(workingDir, start, finish);
Queue<Thread> calcThreads = new();
Bounds bounds = JsonSerializer.Deserialize<Bounds>(new FileStream(@"D:\bounds", FileMode.Open))!;
for (double extraTime = 30; extraTime > 1; extraTime -= 1)
for (double extraTime = 1.5; extraTime >= 1; extraTime -= 0.25)
{
double time = extraTime;
calcThreads.Enqueue(new Thread(() =>
for (double roadFactor = 0.05; roadFactor < 5; roadFactor += 0.05)
{
Pathfinder testresult = new Pathfinder(workingDir, 0.0215, 30).AStar(start,
finish, Tag.SpeedType.car, time);
string fileName = $"time{time:0}.result";
testresult.SaveResult(Path.Join(parentFolder, fileName));
}));
double road = roadFactor;
double time = extraTime;
calcThreads.Enqueue(new Thread(() =>
{
Pathfinder testresult = new Pathfinder(workingDir, road, 30).AStar(start,
finish, Tag.SpeedType.car, time);
Image baseImage = Image.FromStream(new FileStream(@"D:\Base.png", FileMode.Open, FileAccess.Read, FileShare.Read,
(int)new FileInfo(@"D:\Base.png").Length, FileOptions.Asynchronous));
Renderer renderer = new PNGRenderer(baseImage);
renderer.bounds = bounds;
Renderer renderWeights = Renderer.DrawGScores(testresult.gScore!, Renderer.RenderType.png, renderer);
Renderer render = Renderer.DrawPath(testresult.pathResult!, Renderer.RenderType.png, renderWeights);
string fileName = $"road{road:0.00}_time{time:0.00}";
string resultFileName = Path.Combine("D:", $"{fileName}.result");
testresult.SaveResult(resultFileName);
string imageFileName = Path.Combine("D:", fileName);
render.Save(imageFileName);
Console.WriteLine($"Saved {fileName}");
}));
}
}
int totalTasks = calcThreads.Count;
@ -129,6 +161,7 @@ public class Server
DateTime startTime = DateTime.Now;
HashSet<Thread> runningThreads = new();
Console.WriteLine($"Running {threads} Threads on {totalTasks} Tasks.");
while (calcThreads.Count > 0 || runningThreads.Count > 0)
{
while (runningThreads.Count < threads && calcThreads.Count > 0)