De null-situatie
Er zijn twee lijsten, één voor punten en één voor lijnen. Een lijn is niets meer dan een verzameling van punten.
Het Point object:
Het Line object
Voorwaarden
De eisen aan de constructie zijn eenvoudig. Ieder eerste en laatste punt van een lijn ligt op een punt die geen deel uitmaakt van een (andere) lijn constructie. In code; een lijn is geldig als hij voldoet aan de volgende twee voorwaarden:
Validatie
Een lijn is dan ook vrij eenvoudig te valideren. Een simpel foreach loopje en een LINQ query doen wonderen;
Het probleem
Zoals je wellicht inmiddels al vermoed, kan dit proces bij grotere lijsten met punten en lijnen behoorlijk in tijd oplopen. De uitdaging is hier dan ook om dit proces te versnellen.
Mogelijke oplossing
Een oplossing die ik zelf al bedacht heb ik om de puntenlijst in delen op te splitsen. Coördinaten lopen uiteen van 155.000,000 tot 300.000,000 meter in de X en van 463.000,000 tot 600.000,000 meter in de Y.
Mijn idee was om de puntenlijst op te splitsen in stukken van 50.000 meter, vervolgens te kijken in welke range het lijn object valt, en dan nog enkel in de juiste puntenlijst kijken met behulp van bovenstaande validatie methode.
Mijn vraag
Aangezien ik er al aardig over nagedacht heb, maar hierdoor de kans heb dat ik vast zit in mijn eigen denkwijze, aan jullie de vraag of jullie een andere / betere methode hebben om mijn lijnconstructies te valideren.
Er zijn twee lijsten, één voor punten en één voor lijnen. Een lijn is niets meer dan een verzameling van punten.
C#:
1
2
| var points = new List<Point>(); var lines = new List<Line>(); |
Het Point object:
C#:
1
2
3
4
5
| public class Point { public double X { get; set; } public double Y { get; set; } } |
Het Line object
C#:
1
2
3
4
| public class Line { public Point[] Points { get; set; } } |
Voorwaarden
De eisen aan de constructie zijn eenvoudig. Ieder eerste en laatste punt van een lijn ligt op een punt die geen deel uitmaakt van een (andere) lijn constructie. In code; een lijn is geldig als hij voldoet aan de volgende twee voorwaarden:
C#:
1
2
| points.Any(p => p.X.Equals(line.Points.First().X) && p.Y.Equals(line.Points.First().Y)) points.Any(p => p.X.Equals(line.Points.Last().X) && p.Y.Equals(line.Points.Last().Y)) |
Validatie
Een lijn is dan ook vrij eenvoudig te valideren. Een simpel foreach loopje en een LINQ query doen wonderen;
C#:
1
2
3
4
5
6
7
8
9
10
11
12
13
| foreach (var line in lines) { if (!points.Any(p => p.X.Equals(line.Points.First().X) && p.Y.Equals(line.Points.First().Y))) { // eerste vertexpunt ligt niet op een punt object } if (!points.Any(p => p.X.Equals(line.Points.Last().X) && p.Y.Equals(line.Points.Last().Y))) { // laatste vertextpunt ligt niet op een punt object } } |
Het probleem
Zoals je wellicht inmiddels al vermoed, kan dit proces bij grotere lijsten met punten en lijnen behoorlijk in tijd oplopen. De uitdaging is hier dan ook om dit proces te versnellen.
Mogelijke oplossing
Een oplossing die ik zelf al bedacht heb ik om de puntenlijst in delen op te splitsen. Coördinaten lopen uiteen van 155.000,000 tot 300.000,000 meter in de X en van 463.000,000 tot 600.000,000 meter in de Y.
Mijn idee was om de puntenlijst op te splitsen in stukken van 50.000 meter, vervolgens te kijken in welke range het lijn object valt, en dan nog enkel in de juiste puntenlijst kijken met behulp van bovenstaande validatie methode.
Mijn vraag
Aangezien ik er al aardig over nagedacht heb, maar hierdoor de kans heb dat ik vast zit in mijn eigen denkwijze, aan jullie de vraag of jullie een andere / betere methode hebben om mijn lijnconstructies te valideren.