2016-12-27 53 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-從中心點到中心點的距離爲 – CoderHawk

+1

到目前爲止你做了什麼? – CoderHawk

+0

我寫了一個方法來生成指定半徑的座標。但我想要一些有邊界的東西。 – David

回答

3

只需從最小值到最大值生成座標並排除錯誤。

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

在運行時您無法確切知道圖形的形式。因此,你應該使用很多if。例如,如果location1不是在左邊,而是在下面?他們順時針或不是?它可能非常複雜。 – RusArt

+0

這僅適用於問題的測試用例。如果多邊形的形狀不是預定義的,我建議使用你的方法。但是,使用預定義多邊形時,使用該多邊形並不方便 –