Polygoner, Pythagoras, LINQ og Extension methods

Polygoner, Pythagoras, LINQ og Extension methods

  • Comments 2

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 ;-)

  • Cool! Men hvad mener du med "PointCollection implementerer AsQueryable()"?

    Mener du ikke blot, at PointCollection implementerer IEnumerable<T> - og at vi dermed kan benytte LINQ to Objects?

  • Hej Niels

    Du har fuldstændig ret. Jeg havde godt set den, men tak:-)

    Jeg retter det med det samme.

    /Henrik

Page 1 of 1 (2 items)