can you listen? pls

This commit is contained in:
BuildTools
2020-07-25 20:27:59 +02:00
parent 6a53d002e2
commit ed3aaab97e
18 changed files with 259 additions and 67 deletions

Binary file not shown.

View File

@@ -0,0 +1,31 @@
using System;
using System.Collections.Generic;
using GeoJSON.Net.Geometry;
namespace Datalaag
{
public class MultiPolygonPunten
{
public List<PolygonPunten> PolygonPunten;
public string Naam;
public MultiPolygonPunten(MultiPolygon multiPolygon, string naam = "")
{
PolygonPunten = new List<PolygonPunten>();
Naam = naam;
foreach (Polygon polygon in multiPolygon.Coordinates)
{
PolygonPunten.Add(new PolygonPunten(polygon, naam));
}
}
public override string ToString()
{
if (string.Equals(Naam, "", StringComparison.Ordinal)) return "UNKNOWN";
else return Naam;
}
}
}

66
Datalaag/PolygonPunten.cs Normal file
View File

@@ -0,0 +1,66 @@
using System;
using System.Collections.Generic;
using System.Linq;
using GeoJSON.Net.Geometry;
namespace Datalaag
{
public class PolygonPunten
{
public double MinimumXWaarde, MinimumYWaarde, MaximumXWaarde, MaximumYWaarde;
public List<Punt> Punten;
public string Naam;
public PolygonPunten(Polygon polygon, string naam = "")
{
Naam = naam;
MinimumXWaarde = double.MaxValue;
MinimumYWaarde = double.MaxValue;
MaximumXWaarde = double.MinValue;
MaximumYWaarde = double.MinValue;
LeesPuntenVanPolygon(polygon);
}
public PolygonPunten(List<Punt> polygon, string naam = "")
{
Naam = naam;
Punten = polygon;
MaximumXWaarde = Punten.Max(p => p.X);
MinimumXWaarde = Punten.Min(p => p.X);
MaximumYWaarde = Punten.Max(p => p.Y);
MinimumYWaarde = Punten.Min(p => p.Y);
}
private void LeesPuntenVanPolygon(Polygon polygon)
{
foreach (LineString lijn in polygon.Coordinates)
{
foreach (Position positie in lijn.Coordinates)
{
CheckMinMaxWaarden(positie);
Punten.Add(new Punt(positie.Longitude, positie.Latitude, Naam));
}
}
}
private void CheckMinMaxWaarden(Position positie)
{
if (positie.Longitude > MaximumXWaarde) MaximumXWaarde = positie.Longitude;
if (positie.Longitude < MinimumXWaarde) MinimumXWaarde = positie.Longitude;
if (positie.Latitude > MaximumYWaarde) MaximumYWaarde = positie.Latitude;
if (positie.Latitude < MinimumYWaarde) MinimumYWaarde = positie.Latitude;
}
public override string ToString()
{
if (string.Equals(Naam, "", StringComparison.Ordinal)) return "UNKNOWN";
else return Naam;
}
}
}

22
Datalaag/Punt.cs Normal file
View File

@@ -0,0 +1,22 @@
using System;
namespace Datalaag
{
public class Punt
{
public double X, Y;
public string Naam;
public Punt(double x, double y, string naam = "")
{
Naam = naam;
X = x;
Y = y;
}
public override string ToString()
{
if (string.Equals(Naam, "", StringComparison.Ordinal)) return "UNKNOWN";
else return Naam;
}
}
}

View File

@@ -3,7 +3,11 @@ Microsoft Visual Studio Solution File, Format Version 12.00
# Visual Studio Version 16
VisualStudioVersion = 16.0.30309.148
MinimumVisualStudioVersion = 10.0.40219.1
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "opdracht2", "opdracht2\opdracht2.csproj", "{81E4F6D2-D6A1-410F-9255-B76BFCD03B87}"
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "opdracht2", "opdracht2\opdracht2.csproj", "{81E4F6D2-D6A1-410F-9255-B76BFCD03B87}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Logica", "Logica\Logica.csproj", "{531468D0-2AFF-4550-9DD2-25F174AF1EEE}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Datalaag", "Datalaag\Datalaag.csproj", "{7C4F8BFE-8154-4F81-8C4B-10E345F60EF4}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
@@ -15,6 +19,14 @@ Global
{81E4F6D2-D6A1-410F-9255-B76BFCD03B87}.Debug|Any CPU.Build.0 = Debug|Any CPU
{81E4F6D2-D6A1-410F-9255-B76BFCD03B87}.Release|Any CPU.ActiveCfg = Release|Any CPU
{81E4F6D2-D6A1-410F-9255-B76BFCD03B87}.Release|Any CPU.Build.0 = Release|Any CPU
{531468D0-2AFF-4550-9DD2-25F174AF1EEE}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{531468D0-2AFF-4550-9DD2-25F174AF1EEE}.Debug|Any CPU.Build.0 = Debug|Any CPU
{531468D0-2AFF-4550-9DD2-25F174AF1EEE}.Release|Any CPU.ActiveCfg = Release|Any CPU
{531468D0-2AFF-4550-9DD2-25F174AF1EEE}.Release|Any CPU.Build.0 = Release|Any CPU
{7C4F8BFE-8154-4F81-8C4B-10E345F60EF4}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{7C4F8BFE-8154-4F81-8C4B-10E345F60EF4}.Debug|Any CPU.Build.0 = Debug|Any CPU
{7C4F8BFE-8154-4F81-8C4B-10E345F60EF4}.Release|Any CPU.ActiveCfg = Release|Any CPU
{7C4F8BFE-8154-4F81-8C4B-10E345F60EF4}.Release|Any CPU.Build.0 = Release|Any CPU
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE

View File

@@ -35,7 +35,6 @@ namespace opdracht2
public static List<System.Windows.Shapes.Polygon> TriangulateJsonData(string json,
double x, double y)
{
epsilon = .003;
schaalXWaarde = x;
schaalYWaarde = y;
maximumXWaarde = double.MinValue;
@@ -47,17 +46,70 @@ namespace opdracht2
{
try
{
List<Point> EnkelePolygonLijst = MaakPolygonLijn(MaakPolygonLijst(JsonConvert.DeserializeObject<MultiPolygon>(v["geometry"].ToString())));
List<Point> EnkelePolygonLijst = new List<Point>();
if (v["geometry"]["type"].ToString() == "MultiPolygon")
{
//TODO nieuwe manier vinden om multipolygons te parsen (dit zijn de geavanceerde polygons die momenteel voor problemen zorgen.
MultiPolygon temp = JsonConvert.DeserializeObject<MultiPolygon>(v["geometry"].ToString());
foreach (GeoJSON.Net.Geometry.Polygon geojsonPolygon in temp.Coordinates)
{
EnkelePolygonLijst = MaakPolygonLijn(MaakPolygonLijst(geojsonPolygon));
returnWaarde.AddRange(maakDriehoeken(EnkelePolygonLijst));
}
}
else
{
EnkelePolygonLijst = MaakPolygonLijn(MaakPolygonLijst(JsonConvert.DeserializeObject<GeoJSON
.Net.Geometry.Polygon>(v["geometry"].ToString())));
returnWaarde.AddRange(maakDriehoeken(EnkelePolygonLijst));
}
Debug.WriteLine("parsed " + v["properties"]["name"]);
}
catch (Exception e)
{
Debug.WriteLine("couldn't parse " + v["properties"]["name"]);
Debug.WriteLine("couldn't parse " + v["properties"]["name"] + "reason : " + e.Message);
}
}
return NormalizePolygon(returnWaarde);
}
private static List<List<Point>> MaakPolygonLijst(GeoJSON.Net.Geometry.Polygon deserializeObject)
{
double tMaxX = double.MinValue, tMaxY = double.MinValue, tMinX = double.MaxValue, tMinY = double.MaxValue;
List<List<Point>> polygonAlsPuntenLijst = new List<List<Point>>();
List<Point> puntenLijst = new List<Point>();
foreach (LineString lineString in deserializeObject.Coordinates)
{
foreach (Position positie in lineString.Coordinates)
{
if (positie.Longitude < tMinX) tMinX = positie.Longitude;
if (positie.Longitude > tMaxX) tMaxX = positie.Longitude;
if (positie.Latitude < tMinY) tMinY = positie.Latitude;
if (positie.Latitude > tMaxY) tMaxY = positie.Latitude;
Point punt = new Point(positie.Longitude, positie.Latitude);
if (!puntenLijst.Contains(punt)) puntenLijst.Add(new Point( positie.Longitude, positie.Latitude));
}
}
double nX = tMaxX - tMinX;
double nY = tMaxY - tMinY;
// versie 1, 1% max verschil lengte punten x OF y
double percent = .01;
//epsilon = ((nX * percent) < (nY * percent)) ? nX * percent : nY * percent;
// versie 2, 1% max verschil gemiddelde lengte x y
epsilon = ((nX + nY) / 2) * percent;
maximumXWaarde = (maximumXWaarde > tMaxX) ? maximumXWaarde : tMaxX;
maximumYWaarde = (maximumYWaarde > tMaxY) ? maximumYWaarde : tMaxY;
minimumXWaarde = (minimumXWaarde < tMinX) ? minimumXWaarde : tMinX;
minimumYWaarde = (minimumYWaarde < tMinY) ? minimumYWaarde : tMinY;
puntenLijst = douglasPeuker(puntenLijst);
polygonAlsPuntenLijst.Add(puntenLijst);
return polygonAlsPuntenLijst;
}
private static List<Ellipse> maakPunten(List<Point> enkelePolygonLijst)
{
List<Ellipse> returnWaarde = new List<Ellipse>();
@@ -102,20 +154,21 @@ namespace opdracht2
int punt3Index = i + 2;
if (punt3Index >= polygonLijst.Count) punt3Index -= polygonLijst.Count;
if (polygonLijst.Count == 3)
if (polygonLijst.Count < 3)
{
returnWaarde.Add(CreateNewPolygon(polygonLijst[punt1Index], polygonLijst[punt2Index],
polygonLijst[punt3Index]));
break;
}
// TODO HIER MOET DE FOUT ZITTEN, KAN NIE ANDERS!!!!
double hoek = GetAngle(polygonLijst[punt1Index], polygonLijst[punt2Index], polygonLijst[punt3Index]);
double hoek = GetAngle(polygonLijst[punt2Index], polygonLijst[punt1Index], polygonLijst[punt3Index]);
if (hoek < 180)
{
returnWaarde.Add(CreateNewPolygon(polygonLijst[punt1Index], polygonLijst[punt2Index],
polygonLijst[punt3Index]));
returnWaarde.Add(CreateNewPolygon(polygonLijst[punt2Index], polygonLijst[punt3Index],
polygonLijst[punt1Index]));
polygonLijst.RemoveAt(punt2Index);
Debug.WriteLine("added a triangle, polygonLijst count " + polygonLijst.Count);
i = punt1Index;
BACKUP = 0;
continue;
}
//Debug.WriteLine(hoek);
@@ -124,7 +177,11 @@ namespace opdracht2
i++;
if (BACKUP == 5) break;
if (BACKUP >= polygonLijst.Count)
{
Debug.WriteLine("FUCK, couldnt parse " + polygonLijst.Count + " points");
break;
}
}
return returnWaarde;
@@ -134,9 +191,9 @@ namespace opdracht2
private static double GetAngle(Point p1, Point p2, Point p3)
{
double waarde = (Math.Atan2(p3.Y - p1.Y, p3.X - p1.X) - Math.Atan2(p2.Y - p1.Y, p2.X - p1.X)) * (180 / Math.PI);
if (waarde < -180)
if (waarde < 0)
{
waarde += 180;
waarde += 360;
}
return waarde;
@@ -164,11 +221,13 @@ namespace opdracht2
returnWaarde.Fill = willekeurigeBrush;
returnWaarde.Stroke = willekeurigeBrush;
return returnWaarde;
}
private static List<List<Point>> MaakPolygonLijst(MultiPolygon multiPolygon)
{
double tMaxX = double.MinValue, tMaxY = double.MinValue, tMinX = double.MaxValue, tMinY = double.MaxValue;
List<List<Point>> polygonAlsPuntenLijst = new List<List<Point>>();
foreach (GeoJSON.Net.Geometry.Polygon geojsonPolygon in multiPolygon.Coordinates)
{
@@ -177,38 +236,51 @@ namespace opdracht2
{
foreach (Position positie in lineString.Coordinates)
{
if (positie.Longitude < minimumXWaarde)
if (positie.Longitude < tMinX)
{
minimumXWaarde = positie.Longitude;
tMinX = positie.Longitude;
}
if (positie.Longitude > maximumXWaarde)
if (positie.Longitude > tMaxX)
{
maximumXWaarde = positie.Longitude;
tMaxX = positie.Longitude;
}
if (positie.Latitude < minimumYWaarde)
if (positie.Latitude < tMinY)
{
minimumYWaarde = positie.Latitude;
tMinY = positie.Latitude;
}
if (positie.Latitude > maximumYWaarde)
if (positie.Latitude > tMaxY)
{
maximumYWaarde = positie.Latitude;
tMaxY = positie.Latitude;
}
Point punt = new Point(positie.Longitude, positie.Latitude);
if (!puntenLijst.Contains(punt)) puntenLijst.Add(new Point( positie.Longitude, positie.Latitude));
if (!puntenLijst.Contains(punt)) puntenLijst.Add(punt);
}
}
// TODO gebruik tmax waardes om epsilong te berekenen voor douglasPeuker
// door per polygon te berekenen werkt dit ook voor kleinere landen (baseren op grootste afstanden geeft
// grote landen meer polygons en kleine minder, nu is de vermindering bij elk gelijk)
double nX = tMaxX - tMinX;
double nY = tMaxY - tMinY;
// versie 1, 1% max verschil lengte punten x OF y
double percent = .01;
//epsilon = ((nX * percent) < (nY * percent)) ? nX * percent : nY * percent;
// versie 2, 1% max verschil gemiddelde lengte x y
epsilon = ((nX + nY) / 2) * percent;
maximumXWaarde = (maximumXWaarde > tMaxX) ? maximumXWaarde : tMaxX;
maximumYWaarde = (maximumYWaarde > tMaxY) ? maximumYWaarde : tMaxY;
minimumXWaarde = (minimumXWaarde < tMinX) ? minimumXWaarde : tMinX;
minimumYWaarde = (minimumYWaarde < tMinY) ? minimumYWaarde : tMinY;
puntenLijst = douglasPeuker(puntenLijst);
polygonAlsPuntenLijst.Add(puntenLijst);
}
puntenLijst = douglasPeuker(puntenLijst);
polygonAlsPuntenLijst.Add(puntenLijst);
/* TODO waarom is dit hier???
if (polygonAlsPuntenLijst.Count > 1)
{
break;
}*/
}
polygonAlsPuntenLijst.OrderBy(o => o.Count).Reverse();
return polygonAlsPuntenLijst;
}
@@ -276,32 +348,30 @@ namespace opdracht2
return returnWaarde;
}
//TODO refactor dit zodat het alle polygons normalized aan het einde van de formule.
private static List<System.Windows.Shapes.Polygon> NormalizePolygon(List<System.Windows.Shapes.Polygon> polygons)
{
maximumXWaarde -= minimumXWaarde;
maximumYWaarde -= minimumYWaarde;
//mss deze fn hermaken zodat deze ook ramer douglas peucker
List<System.Windows.Shapes.Polygon> returnWaarde = new List<System.Windows.Shapes.Polygon>();
foreach (System.Windows.Shapes.Polygon p in polygons)
{
PointCollection puntCollectie = new PointCollection();
double schaalWaarde = (schaalXWaarde < schaalYWaarde) ? schaalXWaarde : schaalYWaarde;
foreach (Point punt in p.Points)
{
double x = (punt.X - minimumXWaarde);
x = (x / maximumXWaarde);
x = (x * schaalXWaarde);
x /= maximumXWaarde;
x *= schaalWaarde;
double y = (punt.Y - minimumYWaarde);
y = (y / maximumYWaarde);
y = (y * schaalYWaarde);
y /= maximumYWaarde;
y *= schaalWaarde;
puntCollectie.Add(new Point(x, y));
}
returnWaarde.Add(CreateNewPolygon(puntCollectie[0], puntCollectie[1], puntCollectie[2]));
}
//List<Point> iets = DP(returnWaarde);
return returnWaarde;
}
// straight van dp wiki
private static List<Point> douglasPeuker(List<Point> punten)
{
double dmax = -1;

View File

@@ -7,9 +7,16 @@
mc:Ignorable="d"
Title="MainWindow" Height="450" Width="800">
<Grid>
<Button HorizontalAlignment="Left" Margin="52,34,0,0" VerticalAlignment="Top" RenderTransformOrigin="1.215,0.64" Click="Button_Click" Height="25" Width="55">
</Button>
<Canvas x:Name="someCanvas" Height="1080" Width="1920"/>
<Canvas x:Name="someCanvas" RenderTransformOrigin="0.5,0.5" Margin="315,128,249,128">
<Canvas.RenderTransform>
<TransformGroup>
<ScaleTransform ScaleY="2" ScaleX="2"/>
<SkewTransform/>
<RotateTransform/>
<TranslateTransform/>
</TransformGroup>
</Canvas.RenderTransform>
</Canvas>
</Grid>
</Window>

View File

@@ -80,7 +80,7 @@ namespace opdracht2
Debug.WriteLine(("ADDED POLYGON"));
f.RemoveAt(0);
Debug.WriteLine(("REMOVED POLYGON"));
Thread.Sleep(80);
//Thread.Sleep(80);
}
}

View File

@@ -1,4 +1,4 @@
#pragma checksum "..\..\..\MainWindow.xaml" "{ff1816ec-aa5e-4d10-87f7-6f4963833460}" "6DEC4786911BE0BC61F1D6B9699E8EC0FFFE5DFE"
#pragma checksum "..\..\..\MainWindow.xaml" "{ff1816ec-aa5e-4d10-87f7-6f4963833460}" "70D66715C0FFCAB3A710CE2C4D05885847B9E526"
//------------------------------------------------------------------------------
// <auto-generated>
// This code was generated by a tool.
@@ -41,7 +41,7 @@ namespace opdracht2 {
public partial class MainWindow : System.Windows.Window, System.Windows.Markup.IComponentConnector {
#line 12 "..\..\..\MainWindow.xaml"
#line 10 "..\..\..\MainWindow.xaml"
[System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")]
internal System.Windows.Controls.Canvas someCanvas;
@@ -79,14 +79,6 @@ namespace opdracht2 {
switch (connectionId)
{
case 1:
#line 10 "..\..\..\MainWindow.xaml"
((System.Windows.Controls.Button)(target)).Click += new System.Windows.RoutedEventHandler(this.Button_Click);
#line default
#line hidden
return;
case 2:
this.someCanvas = ((System.Windows.Controls.Canvas)(target));
return;
}

View File

@@ -1,4 +1,4 @@
#pragma checksum "..\..\..\MainWindow.xaml" "{ff1816ec-aa5e-4d10-87f7-6f4963833460}" "3A443E7ED9F57FEF7727DBB7F494EFF32BD95ECA"
#pragma checksum "..\..\..\MainWindow.xaml" "{ff1816ec-aa5e-4d10-87f7-6f4963833460}" "70D66715C0FFCAB3A710CE2C4D05885847B9E526"
//------------------------------------------------------------------------------
// <auto-generated>
// This code was generated by a tool.
@@ -42,7 +42,7 @@ namespace opdracht2 {
public partial class MainWindow : System.Windows.Window, System.Windows.Markup.IComponentConnector {
#line 12 "..\..\..\MainWindow.xaml"
#line 10 "..\..\..\MainWindow.xaml"
[System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")]
internal System.Windows.Controls.Canvas someCanvas;
@@ -61,7 +61,7 @@ namespace opdracht2 {
return;
}
_contentLoaded = true;
System.Uri resourceLocater = new System.Uri("/opdracht2;component/mainwindow.xaml", System.UriKind.Relative);
System.Uri resourceLocater = new System.Uri("/opdracht2;V1.0.0.0;component/mainwindow.xaml", System.UriKind.Relative);
#line 1 "..\..\..\MainWindow.xaml"
System.Windows.Application.LoadComponent(this, resourceLocater);
@@ -80,14 +80,6 @@ namespace opdracht2 {
switch (connectionId)
{
case 1:
#line 10 "..\..\..\MainWindow.xaml"
((System.Windows.Controls.Button)(target)).Click += new System.Windows.RoutedEventHandler(this.Button_Click);
#line default
#line hidden
return;
case 2:
this.someCanvas = ((System.Windows.Controls.Canvas)(target));
return;
}

View File

@@ -10,10 +10,10 @@ none
false
TRACE;DEBUG;NETCOREAPP;NETCOREAPP3_1
C:\Users\Beppe\source\repos\opdracht2\opdracht2\App.xaml
1-1960587782
1-281698643
4-1321365794
195-2056577357
4-1544482097
195-561000208
MainWindow.xaml;
False