Når man begynder at arbejde lidt med polygoner i WPF, så syntes jeg hurtigt at man møder begrænsningerne. I mit tilfælde ville jeg lave lidt geometriske beregninger. Når man umiddelbart kigger på API'erne så er der ikke meget hjælp at hente.
Polygon og Point er sealed, så du kan altså ikke nedarve fra den og tilføje dine egne metoder. Jeg forsøgte mig med at lave en Wrapper, men koden blev temmelig svær at læse - også for mig selv.
Meeen, så må man jo tage et skridt tilbage. Det jeg vil opnår er jo bare at lave beregninger på punkter (points) i polygoner.
Propertien Points i Polygon returnere en PointCollection. PointCollection implementerer IEnumerable<T>. Det vil sige at jeg umiddelbart kan lave en LINQ forespørgsel på punkter i polygonen:
private Point ClosestPoint(Polygon polygon, Point p)
{
return (from e in polygon.Points
let x = e.X - p.X
let y = e.Y - p.Y
orderby Math.Sqrt( x * x + y * y)
select e).First<Point>();
}
Så ved hjælp af lidt pythagoras og LINQ kan jeg nu finde det punkt i polygonen, der er tættets på et givet punkt (p). Lækkert?
Det kan eksempelvis refactoreres med en extension method på Point, så det bliver lidt nemmere at læse:
public static double DistanceTo(this Point p1, Point p2)
{
double x = p1.X - p2.X;
double y = p1.Y - p2.Y;
return Math.Sqrt(x * x + y * y);
}
Så ville man kunne lave en lidt pænere forespørgsel:
private Point ClosestPoint(Polygon polygon, Point p)
{
return (from e in polygon.Points
orderby e.DistanceTo(p)
select e).First<Point>();
}
Ovenstående ClosestPoint kunne også implementeres som en Extension Method på Polygon, for at sikre vedligeholdbarheden.
Tænk selv andre geometriske operationer ind ;-)