Случайная генерация координат внутри ограниченной области

У меня есть список долгот и широт, которые образуют границу для географического района. Я хотел бы сгенерировать некоторые случайные координаты внутри этой географической области . Не могли бы вы предложить некоторые подходы, которые я могу принять на любом языке?

3 ответов


Как и любая проблема, есть много способов ее решить, первое, что пришло мне в голову, это

  1. назовем эту "географическую область" многоугольником.
  2. найдите ограничивающую рамку многоугольника (легко, просто найдите Maxx maxY minX miny).
  3. генерировать случайную координату внутри ограничивающей рамки x=rand()%(maxX-minX)+minX (и то же самое для Y)
  4. проверьте, что координата находится внутри многоугольника, есть много решений этой проблемы, и они реализованы в любом заданном язык, поэтому вам не нужно реализовывать его самостоятельно. Вот реализация на C / C++ (ее легко изменить на любой другой язык):точка в полигональном алгоритме

http://en.wikipedia.org/wiki/Point_in_polygon

Edit: Как предположил Ян Дворжак, может быть проблематично использовать его технику на огромных площадях, я считаю, что если ваш многоугольник близок к экватору, а его размер меньше 100 км, он будет прекрасно работать.

также вы столкнетесь с проблемами, если вы находитесь рядом с линией 180°, потому что рядом с ней находится -180°.


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

создания случайная точка на сфере сравнительно легко.

создания случайная точка на сферическом треугольнике сложнее, но объясняется в этой связанной статье.

вам нужно разделить свой многоугольник на сферических треугольников и весьте их согласно их области. Затем случайным образом выберите сферический треугольник на основе Весов.

для общего случая, триангуляция сферического многоугольника невозможна, однако, для большинства практических случаев триангуляции является простой задачей. Один такой алгоритм описан здесь (алгоритм 1, стр. 901) с исходным кодом C++ доступен здесь (поиск "вычислительные методы расчета геометрических параметров тектонических плит").


вы можете попробовать это:

  1. вычислить все координаты в пределах этой географической области, см. сохранить в vector<Point> points.

  2. генерировать случайное число int в [0, points.size()) см. k.

  3. points[k] - это то, что вы хотите.