Проблема
Я хочу разделить сетку (2D массив) в части случайной формы (думайте тектонические плиты земли).
Критерии:
Мое решение:
Обратите внимание, что для предотвращения частей с длинным растянуло "руки" или большие дыры в них, я создал два массива хранения данных: один для ячеек, смежных со всего одной ячейкой с текущим идентификационным номером части и другим для ячеек, смежных больше чем с одним, затем, я исчерпываю последнего перед первым.
Выполнение моего решения дает следующее:
Размер сетки: 200
ширина: 20
высота: 10
Части: 7
66633333111114444466
00033331111114444466
00003331111114444466
00003331111144444660
00000333111164444660
00000336111664422600
00000336615522222200
00006655555522222200
00006655555552222220
00066655555552222220
Номер детали: 0
Размер части: 47
Номер детали: 1
Размер части: 30
Номер детали: 2
Размер части: 26
Номер детали: 3
Размер части: 22
Номер детали: 4
Размер части: 26
Номер детали: 5
Размер части: 22
Номер детали: 6
Размер части: 27
Проблемы с моим решением:
Другие идеи:
Заключение:
Таким образом, вот протирание: Я - программист новичка, который не уверен, если я занимаюсь этой проблемой правильным способом. Я могу создать еще многие, "исправляют" методы, тот сдвиг фрагментированные части вместе, и позволяют являться частями для "выскакивания" тупиков, если они застревают в них, но это чувствует себя грязным.
Как Вы приблизились бы к этой проблеме? Есть ли некоторая сексуальная математика, которую я мог использовать для упрощения вещей, возможно?
Спасибо
Несколько месяцев назад я сделал нечто подобное для игры, но это была прямоугольная сетка, а не шестигранная. Тем не менее, теория та же самая, и в результате были получены красивые смежные области примерно одинакового размера - некоторые были больше, некоторые меньше, но ни одна из них не была слишком маленькой или слишком большой. YMMV.
Вот что я бы сделал: использовал алгоритм Вороного. Сначала разместите несколько случайных точек, а затем позвольте алгоритму Вороного сгенерировать части. Чтобы получить представление о том, как это выглядит, обратитесь: к этому приложению .