2016-12-27 10 views
-1

Ich möchte eine Methode, um zufällige Koordinaten mit Grenzen zu erzeugen. etwas wie dieses:zufällige Koordinaten mit Grenzen erzeugen

private Coordinate[] Calculate(Coordinate location1, Coordinate location2, Coordinate location3, Coordinate location4) 

public class Coordinate 
{ 
    public double Latitude { set; get; } 
    public double Longitude { set; get; } 
} 

ich habe keine Idee, wie man Koordinaten mit spezifizierten Radios erzeugt. enter image description here

+0

könnte dies helfen http://gis.stackexchange.com/questions/15545/calculating-coordinates-of-square- x-Meilen-from-center-point – CoderHawk

+1

was hast du bisher gemacht? – CoderHawk

+0

Ich habe eine Methode geschrieben, um Koordinaten mit einem bestimmten Radius zu erzeugen. aber ich will, dass etwas mit Grenzen arbeitet. – David

Antwort

3

Nur Koordinaten von Min bis Max generieren und falsch ausschließen.

private Coordinate[] Calculate(Coordinate location1, Coordinate location2, Coordinate location3, 
     Coordinate location4) 
    { 
     Coordinate[] allCoords = {location1, location2, location3, location4}; 
     double minLat = allCoords.Min(x => x.Latitude); 
     double minLon = allCoords.Min(x => x.Longitude); 
     double maxLat = allCoords.Max(x => x.Latitude); 
     double maxLon = allCoords.Max(x => x.Longitude); 

     Random r = new Random(); 

     //replase 500 with your number 
     Coordinate[] result = new Coordinate[500]; 
     for (int i = 0; i < result.Length; i++) 
     { 
      Coordinate point = new Coordinate(); 
      do 
      { 
       point.Latitude = r.NextDouble()*(maxLat - minLat) + minLat; 
       point.Longitude = r.NextDouble()*(maxLon - minLon) + minLon; 
      } while (!IsPointInPolygon(point, allCoords)); 
      result[i] = point; 
     } 
     return result; 
    } 

    //took it from http://codereview.stackexchange.com/a/108903 
    //you can use your own one 
    private bool IsPointInPolygon(Coordinate point, Coordinate[] polygon) 
    { 
     int polygonLength = polygon.Length, i = 0; 
     bool inside = false; 
     // x, y for tested point. 
     double pointX = point.Longitude, pointY = point.Latitude; 
     // start/end point for the current polygon segment. 
     double startX, startY, endX, endY; 
     Coordinate endPoint = polygon[polygonLength - 1]; 
     endX = endPoint.Longitude; 
     endY = endPoint.Latitude; 
     while (i < polygonLength) 
     { 
      startX = endX; 
      startY = endY; 
      endPoint = polygon[i++]; 
      endX = endPoint.Longitude; 
      endY = endPoint.Latitude; 
      // 
      inside ^= ((endY > pointY)^(startY > pointY)) /* ? pointY inside [startY;endY] segment ? */ 
         && /* if so, test if it is under the segment */ 
         (pointX - endX < (pointY - endY)*(startX - endX)/(startY - endY)); 
     } 
     return inside; 
    } 
1

mit ein wenig Geometrie Wissen wir den folgenden Ansatz verwenden:

private Coordinate Calculate(Coordinate location1, Coordinate location2, Coordinate location3, 
     Coordinate location4) 
    { 
     Random random=new Random(DateTime.Now.Millisecond); 
     Coordinate randomCoordinate = new Coordinate() 
     { 
      Latitude = random.Next((int) Math.Floor(location4.Latitude), (int) Math.Floor(location2.Latitude)) 
     }; 
     if (randomCoordinate.Latitude > location1.Latitude) 
     { 
      double m1 = (location2.Longitude - location1.Longitude)/(location2.Latitude - location1.Latitude); 
      double m2 = (location2.Longitude - location3.Longitude)/(location2.Latitude - location3.Latitude); 
      double maxLongitude = (randomCoordinate.Latitude - location2.Latitude) *m1; 
      double minLongitude = (randomCoordinate.Latitude - location2.Latitude) *m2; 
      randomCoordinate.Longitude = random.Next((int) Math.Ceiling(minLongitude), (int) Math.Floor(maxLongitude)); 
     } 
     else 
     { 
      double m1 = (location4.Longitude - location1.Longitude)/(location4.Latitude - location1.Latitude); 
      double m2 = (location4.Longitude - location3.Longitude)/(location4.Latitude - location3.Latitude); 
      double maxLongitude = (randomCoordinate.Latitude - location4.Latitude) * m1; 
      double minLongitude = (randomCoordinate.Latitude - location4.Latitude) * m2; 
      randomCoordinate.Longitude = random.Next((int)Math.Ceiling(minLongitude), (int)Math.Floor(maxLongitude)); 
     } 
     return randomCoordinate; 
    } 
+1

Sie können nicht wirklich Form der Figur in der Laufzeit wissen. Daher sollten Sie viele if's verwenden. Zum Beispiel wenn location1 nicht links, sondern runter ist? Sind sie im Uhrzeigersinn oder nicht? Es kann sehr komplex sein. – RusArt

+0

Dies funktioniert nur für den Testfall der Frage. Wenn die Form des Polygons nicht vordefiniert ist, schlage ich vor, Ihren Ansatz zu verwenden. Bei einem vordefinierten Polygon ist es jedoch nicht zweckmäßig, das zu verwenden –

Verwandte Themen