2016-12-27 12 views
-1

Я хочу метод генерации случайных координат с границами. что-то вроде этого:генерировать случайные координаты с границами

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

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

Я понятия не имею, как создать координаты с указанными радиоприемниками. enter image description here

+0

это может помочь http://gis.stackexchange.com/questions/15545/calculating-coordinates-of-square- x-mile-from-center-point – CoderHawk

+1

что вы сделали до сих пор? – CoderHawk

+0

Я написал метод генерации координат с заданным радиусом. но я хочу, чтобы что-то работало с границами. – David

ответ

3

Просто сгенерируйте координаты от min до max и исключите ошибку.

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

с небольшим количеством знания геометрии, мы можем использовать следующий подход:

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

Вы не можете точно знать форму фигуры во время выполнения. Поэтому вы должны использовать много, если. Например, если location1 не слева, но вниз? Они по часовой стрелке или нет? Это может быть очень сложно. – RusArt

+0

Это работает только для тестового примера. Если форма многоугольника не предопределена, я предлагаю использовать ваш подход. однако с предопределенным многоугольником это не удобно использовать –