2017-11-16 2 views
0

Aus einer Liste von lat/long Paaren, versuche ich das nächste lat/long Paar wrt zu einem gegebenen Lat/Lang. Für die Liste von {42_-72,42, -75,43, -76} und einem gegebenen Punkt 42, -71Gegeben ein lat/long, finde das nächste lat/long Paar aus einer Liste von lat/long in C#

Der Punkt 42, -72 ist am nächsten zu 42, -71, also Ausgang = > 42, -72.

+1

Hallo! Welchen Code hast du bisher und welche Schwierigkeiten hast du damit? – tehDorf

+0

Möchten Sie im Falle eines Unentschiedens den Längen- oder Breitengrad priorisieren? Oder möchtest du beides zurückgeben? –

+0

Es scheint mir logisch, dass Sie sie als Punkte auf einer Grafik verfolgen und die Entfernung von Ihrem Zielpunkt zu jedem Kandidatenpunkt berechnen und dann den Punkt zurückgeben, der die kürzeste Entfernung hat. –

Antwort

0

Ich würde beginnen, indem Sie eine Methode erstellen, die den Abstand zwischen zwei Punkten erhalten kann. Wenn wir davon ausgehen, dass in einem beliebigen rechtwinkligen Dreieck a^2 + b^2 = c^2 und der Abstand vom Punkt P1 zum Punkt P2c ist, können wir diese Formel verwenden, um den Abstand zwischen zwei Punkten zu erhalten, da wir ihre Koordinaten X und Y kennen. Der Abstand a ist der Unterschied zwischen P2.X und P1.X und der Abstand b ist der Unterschied zwischen P2.Y und P1.Y:

private static double GetDistance(Point a, Point b) 
{ 
    return Math.Sqrt(Math.Pow(b.X - a.X, 2) + Math.Pow(b.Y - a.Y, 2)); 
} 

Dann können wir eine Methode erstellen, die in einem Zielpunkt und eine Liste der Kandidatenpunkte und kehrt nimmt der Kandidat, der die kürzeste Entfernung vom Ziel ist:

private static Point GetClosestPoint(Point target, List<Point> candidates) 
{ 
    if (candidates == null) throw new ArgumentNullException(nameof(candidates)); 
    if (!candidates.Any()) throw new ArgumentException("The candidates list is empty."); 

    var minDistance = double.MaxValue; 
    var closestPoint = new Point(); 

    foreach (var candidate in candidates) 
    { 
     var distance = GetDistance(target, candidate); 
     if (distance > minDistance) continue; 
     minDistance = distance; 
     closestPoint = candidate; 
    } 

    return closestPoint; 
} 
Verwandte Themen