Создание замкнутых пространственных полигонов - PullRequest
2 голосов
/ 07 января 2010

Мне нужно создать (большой) набор пространственных полигонов для целей тестирования. Существует ли алгоритм, который будет создавать многоугольник произвольной формы, оставаясь в ограничивающей оболочке? Я использую OGC Simple, поэтому процедура создания хорошо известного текста наиболее полезна, язык для выбора - C #, но это не так важно.

Ответы [ 3 ]

1 голос
/ 07 января 2010

Они действительно должны быть случайными, или какой-то реальный WKT подойдет? Потому что, если это так, просто перейдите на http://koordinates.com/ и загрузите несколько слоев.

1 голос
/ 24 января 2010

Здесь вы можете найти два примера того, как генерировать случайные выпуклые многоугольники. Они оба на Java, но их легко переписать на C #:

Другой возможный подход, основанный на генерации множества случайных точек и использовании Делоне тесселяции.

Как правило, проблема генерации собственных случайных многоугольников не является тривиальной.

1 голос
/ 07 января 2010

Какую форму ваш ограничивающий конверт? Если это прямоугольник, то сгенерируйте случайный многоугольник в виде списка точек в пределах [0,1] x [0,1] и масштабируйте до размера вашего прямоугольника.

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

НТН

Mark

Дополнение

Если вам нужны только выпуклые многоугольники, вы бы использовали один из алгоритмов выпуклой оболочки . Поскольку вам, кажется, не нужны только выпуклые многоугольники, ваше предложение круговой развертки сработает.

Но вам может показаться, что проще провести по линии, параллельной оси x или y. Предположим, ось X.

  1. Сортировка точек в x-порядке.
  2. Выберите крайнюю левую (т.е. первую) точку. В координате y этой точки нарисуйте воображаемую горизонтальную линию через единичный квадрат. Подготовьтесь создать список точек вдоль границы многоугольника над воображаемой линией и еще один список вдоль границы ниже нее.
  3. Выберите следующую точку. Добавьте его в верхний или нижний список границ, определяемый его координатой y.
  4. Продолжайте, пока у вас не будет точек.

Это будет генерировать выпуклые и невыпуклые многоугольники, но невыпуклость будет иметь довольно ограниченную форму. Нет входов или поворотов.

Другая мысль

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

  1. Генерация случайных точек внутри единичного круга в полярных координатах, т. Е. (R, тета).
  2. Сортировка точек в тета-порядке.
  3. Преобразовать в декартовы координаты.
  4. Масштабируйте единицу окружности до ограничительного эллипса по вашему выбору.

С макушки головы, похоже, все в порядке.

...