dit zou normaal gezien correcter moeten scalen, maar nu moet ik mijn scale methode nog fixen

This commit is contained in:
BuildTools
2020-08-06 14:04:15 +02:00
parent a3c35905e8
commit ee216f07db
41 changed files with 97 additions and 63 deletions

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

View File

@@ -1,6 +1,5 @@
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Linq;
using GeoJSON.Net.Geometry; using GeoJSON.Net.Geometry;
namespace Globals namespace Globals
@@ -15,35 +14,38 @@ namespace Globals
{ {
PolygonPunten = polygonPunten; PolygonPunten = polygonPunten;
Naam = naam; Naam = naam;
VindMaximumEnMinimum(polygonPunten); UpdateMaximumEnMinimum();
} }
public MultiPolygonPunten(MultiPolygon multiPolygon, string naam = "") public MultiPolygonPunten(MultiPolygon multiPolygon, string naam = "")
{ {
Naam = naam; Naam = naam;
PolygonPunten = new List<PolygonPunten>(); PolygonPunten = new List<PolygonPunten>();
bool reverse = true;
foreach (Polygon polygon in multiPolygon.Coordinates) foreach (Polygon polygon in multiPolygon.Coordinates)
{ {
PolygonPunten.Add(new PolygonPunten(polygon, naam)); PolygonPunten p = new PolygonPunten(polygon, naam, reverse);
PolygonPunten.Add(p);
reverse = !reverse; //reverse parameter voor polygonpunten is sneler dan
UpdateMaximumEnMinimum(p);
} }
VindMaximumEnMinimum(PolygonPunten); }
bool sw = false;
foreach (PolygonPunten p in PolygonPunten) private void UpdateMaximumEnMinimum(PolygonPunten polygon)
{ {
if (sw) p.Punten.Reverse(); if (polygon.MaximumX > MaximumX) MaximumX = polygon.MaximumX;
sw = !sw; else if (polygon.MinimumX < MinimumX) MinimumX = polygon.MinimumX;
} if (polygon.MaximumY > MaximumY) MaximumY = polygon.MaximumY;
else if (polygon.MinimumY < MinimumY) MinimumY = polygon.MinimumY;
} }
private void VindMaximumEnMinimum(List<PolygonPunten> polygonPunten) public void UpdateMaximumEnMinimum()
{ {
MaximumX = polygonPunten.Max(p => p.MaximumX); foreach (PolygonPunten polygon in PolygonPunten)
MaximumY = polygonPunten.Max(p => p.MaximumY); {
MinimumX = polygonPunten.Max(p => p.MinimumX); UpdateMaximumEnMinimum(polygon);
MinimumY = polygonPunten.Max(p => p.MinimumY); }
} }
public override string ToString() public override string ToString()
{ {

View File

@@ -1,9 +1,6 @@
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Linq; using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Shapes;
using GeoJSON.Net.Geometry; using GeoJSON.Net.Geometry;
namespace Globals namespace Globals
{ {
@@ -17,36 +14,67 @@ namespace Globals
{ {
Punten = punten; Punten = punten;
Naam = naam; Naam = naam;
MaximumX = punten.Max(punt => punt.X); UpdateMaxEnMinPunt();
MaximumY = punten.Max(punt => punt.Y);
MinimumX = punten.Min(punt => punt.X);
MinimumY = punten.Min(punt => punt.Y);
} }
public PolygonPunten(GeoJSON.Net.Geometry.Polygon p, string naam = "") public PolygonPunten(GeoJSON.Net.Geometry.Polygon polygon, string naam = "", bool reverse = true)
{ {
Naam = naam; Naam = naam;
Punten = new List<Punt>(); Punten = new List<Punt>();
foreach (LineString l in p.Coordinates)
foreach (LineString linestring in polygon.Coordinates)
{ {
foreach (Position pos in l.Coordinates) if (reverse)
{ {
Punt pu = new Punt(pos.Longitude, pos.Latitude, naam); foreach (Position positie in linestring.Coordinates.Reverse()) //sneller om eerst te reversen dan tegen einde deze bewerking te doen
if (!Punten.Contains(pu)) Punten.Add(pu); //dit vertraagd programma enorm, maar zorgt ervoor dat peuker beter werkt denk ik {
Punt punt = new Punt(positie.Longitude, positie.Latitude, naam);
if (!Punten.Contains(punt)) {
Punten.Add(punt); //dit vertraagd programma enorm, maar zorgt ervoor dat peuker beter werkt denk ik
UpdateMaxEnMinPunt(punt); //sneller dan eindigen met punten.max en punten.min
}
//de vertraging komt vooral door de .Contains methode, deze mag weggelaten worden voor snelheid maar peuker zal niet meer zo goed werken //de vertraging komt vooral door de .Contains methode, deze mag weggelaten worden voor snelheid maar peuker zal niet meer zo goed werken
} }
} }
Punten.Reverse(); else
MaximumX = Punten.Max(punt => punt.X); {
MaximumY = Punten.Max(punt => punt.Y); foreach (Position positie in linestring.Coordinates)
MinimumX = Punten.Min(punt => punt.X); {
MinimumY = Punten.Min(punt => punt.Y); Punt punt = new Punt(positie.Longitude, positie.Latitude, naam);
if (!Punten.Contains(punt)) {
Punten.Add(punt); //dit vertraagd programma enorm, maar zorgt ervoor dat peuker beter werkt denk ik
UpdateMaxEnMinPunt(punt); //sneller dan eindigen met punten.max en punten.min
} }
//de vertraging komt vooral door de .Contains methode, deze mag weggelaten worden voor snelheid maar peuker zal niet meer zo goed werken
}
}
}
}
private void UpdateMaxEnMinPunt(Punt punt)
{
if (punt.X > MaximumX) MaximumX = punt.X;
else if (punt.X < MinimumX) MinimumX = punt.X;
if (punt.Y > MaximumY) MaximumY = punt.Y;
else if (punt.Y < MinimumY) MinimumY = punt.Y;
}
public void UpdateMaxEnMinPunt()
{
foreach (Punt punt in Punten)
{
UpdateMaxEnMinPunt(punt);
}
}
public override string ToString() public override string ToString()
{ {
if (string.Equals(Naam, "", StringComparison.Ordinal)) return "UNKNOWN"; if (string.Equals(Naam, "", StringComparison.Ordinal)) return "UNKNOWN";
else return Naam; return Naam;
} }
public MultiPolygonPunten ToMultiPolygonPunten() public MultiPolygonPunten ToMultiPolygonPunten()

View File

@@ -1,8 +1,4 @@
using System; using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows; using System.Windows;
namespace Globals namespace Globals
@@ -16,8 +12,8 @@ namespace Globals
Naam = naam; Naam = naam;
if (Graden) if (Graden)
{ {
X = ConvertToRadians(x) * 100; X = ConvertToPercentage(x) * 100;
Y = ConvertToRadians(y) * 100; Y = ConvertToPercentage(y) * 100;
} }
else else
{ {
@@ -32,9 +28,10 @@ namespace Globals
else return Naam; else return Naam;
} }
public double ConvertToRadians(double angle) public double ConvertToPercentage(double angle)
{ {
return (Math.PI / 180) * angle; if (angle < 0) angle += 360;
return angle / 360;
} }
public Point ToPoint() public Point ToPoint()

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

View File

@@ -32,7 +32,7 @@ namespace Logica
} }
//oude schaalmethodes //oude schaalmethodes
public PolygonPunten ScalePolygon(PolygonPunten polygon, double scaleX, double scaleY, double offsetX = 180, double offsetY = 180) public PolygonPunten ScalePolygon(PolygonPunten polygon, double scaleX, double scaleY, double offsetX = 0, double offsetY = 0)
{ {
double maxX = polygon.MaximumX - polygon.MinimumX; double maxX = polygon.MaximumX - polygon.MinimumX;
double maxY = polygon.MaximumY - polygon.MinimumY; double maxY = polygon.MaximumY - polygon.MinimumY;
@@ -59,8 +59,8 @@ namespace Logica
} }
//lat en long = graden, graden => coords (/360 * scale? //lat en long = graden, graden => coords (/360 * scale?
private static Punt ScalePoint(double scaleX, double scaleY, Punt punt, double maxX = 360, double maxY = 360, double offsetX = 180, double private static Punt ScalePoint(double scaleX, double scaleY, Punt punt, double maxX = 1, double maxY = 1, double offsetX = 0, double
offsetY = 180, double minX = 0, double minY = 0) offsetY = 0, double minX = 0, double minY = 0)
{ {
double x = punt.X - minX; double x = punt.X - minX;
x /= maxX; x /= maxX;
@@ -115,6 +115,8 @@ namespace Logica
double maxY = multiPolygons.Max(m => m.MaximumY); double maxY = multiPolygons.Max(m => m.MaximumY);
double minX = multiPolygons.Min(m => m.MinimumX); double minX = multiPolygons.Min(m => m.MinimumX);
double minY = multiPolygons.Min(m => m.MinimumY); double minY = multiPolygons.Min(m => m.MinimumY);
maxX -= minX;
maxY -= minY;
List<MultiPolygonPunten> mpps = new List<MultiPolygonPunten>(); List<MultiPolygonPunten> mpps = new List<MultiPolygonPunten>();
foreach (MultiPolygonPunten mp in multiPolygons) foreach (MultiPolygonPunten mp in multiPolygons)
{ {

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

View File

@@ -2,22 +2,10 @@
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Diagnostics; using System.Diagnostics;
using System.Drawing;
using System.IO;
using System.Linq;
using System.Reflection; using System.Reflection;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using System.Windows; using System.Windows;
using System.Windows.Controls; using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Ink;
using System.Windows.Input;
using System.Windows.Media; using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes; using System.Windows.Shapes;
using Globals; using Globals;
using Brush = System.Windows.Media.Brush; using Brush = System.Windows.Media.Brush;
@@ -118,6 +106,19 @@ namespace opdracht2
//als een land geselecteerd wordt in lijst runned deze functie //als een land geselecteerd wordt in lijst runned deze functie
//voorbereiding van scale waarden.
double scaleX = (c.ActualHeight > c.ActualWidth) ? c.ActualWidth : c.ActualHeight;
double scaleY = (c.ActualHeight > c.ActualWidth) ? c.ActualWidth : c.ActualHeight;
scaleX /= 2;
scaleY /= 2;
double offsetX = scaleX; //vroeger c.ActualWidth/2
double offsetY = scaleY;
//dit zorgt voor evenredige scaling zonder stretching. als men wel stretching wilt gebruiken:
// scaleX = c.ActualWidth;
// scaleY = c.ActualHeight;
//is er meer dan 1 land geselecteerd //is er meer dan 1 land geselecteerd
if (lb.SelectedItems.Count >1) if (lb.SelectedItems.Count >1)
{ {
@@ -135,7 +136,7 @@ namespace opdracht2
} }
//scale de polygon als de checkbox aan staat //scale de polygon als de checkbox aan staat
if (scale.IsChecked == true) mpps = pm.ScaleMultiPolygons(mpps, c.ActualWidth/2, c.ActualHeight/2, 0, 0); if (scale.IsChecked == true) mpps = pm.ScaleMultiPolygons(mpps, scaleX, scaleY, offsetX, offsetY);
foreach(MultiPolygonPunten mp in mpps) foreach(MultiPolygonPunten mp in mpps)
{ {
@@ -170,7 +171,7 @@ namespace opdracht2
Debug.WriteLine(lb.SelectedItem.GetType().Name); // voor debug redenen schrijf naam naar console Debug.WriteLine(lb.SelectedItem.GetType().Name); // voor debug redenen schrijf naam naar console
c.Children.Clear(); // delete alle vorige afbeeldingen c.Children.Clear(); // delete alle vorige afbeeldingen
MultiPolygonPunten mp = (MultiPolygonPunten)lb.SelectedItem; //haal multipolygon uit lijst MultiPolygonPunten mp = (MultiPolygonPunten)lb.SelectedItem; //haal multipolygon uit lijst
if (scale.IsChecked == true) mp = pm.ScaleMultiPolygon(mp, c.ActualWidth / 2, c.ActualHeight / 2, 0, 0); //schaal multipolygon if (scale.IsChecked == true) mp = pm.ScaleMultiPolygon(mp, scaleX, scaleY, offsetX, offsetY); //schaal multipolygon
if (peuker.IsChecked == true) mp = pm.Peuker(mp, peukerPercent.Value/1000); // als peuker (puntvermindering) moet gebeuren, doe dit hier if (peuker.IsChecked == true) mp = pm.Peuker(mp, peukerPercent.Value/1000); // als peuker (puntvermindering) moet gebeuren, doe dit hier
foreach (PolygonPunten pp in mp.PolygonPunten) //loop doorheen polygons in multipolygon foreach (PolygonPunten pp in mp.PolygonPunten) //loop doorheen polygons in multipolygon
{ {
@@ -192,7 +193,8 @@ namespace opdracht2
Debug.WriteLine(lb.SelectedItem.GetType().Name); Debug.WriteLine(lb.SelectedItem.GetType().Name);
c.Children.Clear(); //delete alle vorige afbeeldingen c.Children.Clear(); //delete alle vorige afbeeldingen
PolygonPunten p = (PolygonPunten)lb.SelectedItem; // haal land uit lijst PolygonPunten p = (PolygonPunten)lb.SelectedItem; // haal land uit lijst
if (scale.IsChecked == true) p = pm.ScalePolygon(p, c.ActualWidth/2, c.ActualHeight/2, 0, 0); // schaal polygon
if (scale.IsChecked == true) p = pm.ScalePolygon(p, scaleX, scaleY, offsetX, offsetY); // schaal polygon
if (peuker.IsChecked == true) p = pm.Peuker(p, peukerPercent.Value / 1000); // peuker (puntvermindering) if (peuker.IsChecked == true) p = pm.Peuker(p, peukerPercent.Value / 1000); // peuker (puntvermindering)
if (triangulate.IsChecked == true) //triangulation check if (triangulate.IsChecked == true) //triangulation check
{ {

View File

@@ -5,6 +5,7 @@
}, },
"projects": { "projects": {
"C:\\Users\\Beppe\\source\\repos\\opdracht2\\Datalaag\\Datalaag.csproj": { "C:\\Users\\Beppe\\source\\repos\\opdracht2\\Datalaag\\Datalaag.csproj": {
"version": "1.0.0",
"restore": { "restore": {
"projectUniqueName": "C:\\Users\\Beppe\\source\\repos\\opdracht2\\Datalaag\\Datalaag.csproj", "projectUniqueName": "C:\\Users\\Beppe\\source\\repos\\opdracht2\\Datalaag\\Datalaag.csproj",
"projectName": "Datalaag", "projectName": "Datalaag",
@@ -24,6 +25,7 @@
} }
}, },
"C:\\Users\\Beppe\\source\\repos\\opdracht2\\Globals\\Globals.csproj": { "C:\\Users\\Beppe\\source\\repos\\opdracht2\\Globals\\Globals.csproj": {
"version": "1.0.0",
"restore": { "restore": {
"projectUniqueName": "C:\\Users\\Beppe\\source\\repos\\opdracht2\\Globals\\Globals.csproj", "projectUniqueName": "C:\\Users\\Beppe\\source\\repos\\opdracht2\\Globals\\Globals.csproj",
"projectName": "Globals", "projectName": "Globals",
@@ -34,6 +36,7 @@
} }
}, },
"C:\\Users\\Beppe\\source\\repos\\opdracht2\\Logica\\Logica.csproj": { "C:\\Users\\Beppe\\source\\repos\\opdracht2\\Logica\\Logica.csproj": {
"version": "1.0.0",
"restore": { "restore": {
"projectUniqueName": "C:\\Users\\Beppe\\source\\repos\\opdracht2\\Logica\\Logica.csproj", "projectUniqueName": "C:\\Users\\Beppe\\source\\repos\\opdracht2\\Logica\\Logica.csproj",
"projectName": "Logica", "projectName": "Logica",

View File

@@ -7,7 +7,7 @@
<NuGetPackageRoot Condition=" '$(NuGetPackageRoot)' == '' ">$(UserProfile)\.nuget\packages\</NuGetPackageRoot> <NuGetPackageRoot Condition=" '$(NuGetPackageRoot)' == '' ">$(UserProfile)\.nuget\packages\</NuGetPackageRoot>
<NuGetPackageFolders Condition=" '$(NuGetPackageFolders)' == '' ">C:\Users\Beppe\.nuget\packages\</NuGetPackageFolders> <NuGetPackageFolders Condition=" '$(NuGetPackageFolders)' == '' ">C:\Users\Beppe\.nuget\packages\</NuGetPackageFolders>
<NuGetProjectStyle Condition=" '$(NuGetProjectStyle)' == '' ">PackageReference</NuGetProjectStyle> <NuGetProjectStyle Condition=" '$(NuGetProjectStyle)' == '' ">PackageReference</NuGetProjectStyle>
<NuGetToolVersion Condition=" '$(NuGetToolVersion)' == '' ">5.6.0</NuGetToolVersion> <NuGetToolVersion Condition=" '$(NuGetToolVersion)' == '' ">5.5.0</NuGetToolVersion>
</PropertyGroup> </PropertyGroup>
<PropertyGroup> <PropertyGroup>
<MSBuildAllProjects>$(MSBuildAllProjects);$(MSBuildThisFileFullPath)</MSBuildAllProjects> <MSBuildAllProjects>$(MSBuildAllProjects);$(MSBuildThisFileFullPath)</MSBuildAllProjects>

View File

@@ -1,6 +1,6 @@
{ {
"version": 2, "version": 2,
"dgSpecHash": "Zy6jypDVLiSwLfNswZHvoD7ul/+NOG2AgIE/eLzWMMgAaQ+TzAjn3Or2nqa6RpIYT9zQrkp/4+yCHo1D0FoSMQ==", "dgSpecHash": "p426YNxR+un7rXUpsV3S3g0htKyuFPUxB5pYHNl1fsHxje10LlIJDBLjupJb2IZCMEZ+Cv3TXWBEUMbbMYO5hA==",
"success": true, "success": true,
"projectFilePath": "C:\\Users\\Beppe\\source\\repos\\opdracht2\\opdracht2\\opdracht2.csproj", "projectFilePath": "C:\\Users\\Beppe\\source\\repos\\opdracht2\\opdracht2\\opdracht2.csproj",
"expectedPackageFiles": [ "expectedPackageFiles": [