【问题标题】:generate random coordinates with boundaries生成带边界的随机坐标
【发布时间】:2016-12-27 09:11:47
【问题描述】:

我想要一种方法来生成带有边界的随机坐标。像这样:

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

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

我不知道如何使用指定的无线电生成坐标。

【问题讨论】:

  • 到目前为止你做了什么?
  • 我写了一个方法来生成指定半径的坐标。但我想要一些有边界的东西。
  • 分享这个可能是明智的,否则这个问题会变得过于广泛

标签: c# .net math location coordinates


【解决方案1】:

只生成从最小值到最大值的坐标并排除错误。

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

【讨论】:

  • 我想指出,这似乎无限循环以尝试在多边形中生成点。可能与最小/最大纬度有关?
【解决方案2】:

有了一点几何知识,我们可以使用以下方法:

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

【讨论】:

  • 在运行时你无法真正知道图形的形式。因此,您应该使用大量的 if。例如,如果 location1 不在左侧而是在下方?它们是顺时针还是非顺时针?它可能非常复杂。
  • 这仅适用于问题的测试用例。如果多边形的形状未预定义,我建议使用您的方法。但是,对于预定义的多边形,使用它并不方便
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-10-03
  • 2022-01-18
  • 1970-01-01
  • 1970-01-01
  • 2023-02-03
  • 2023-01-07
  • 2013-03-12
相关资源
最近更新 更多