Как случайно удалить сторону блока в сетке?

Следуя Как контролировать размер квадрата в сетка из квадратной области?, я хотел бы случайно удалить сторону блока в сетке. Вот моя идея:

%% В первый раз я случайным образом выбираю белое пятно в сетке (рисунок ниже):

let random-patch one-of patches with [pcolor = white]

%% Затем я рисую красные пятна, чтобы обозначить перекрестки между белыми дорогами (рисунок ниже):

ask patches with [ (pxcor mod (side + 1) = 0 ) and (pycor mod (side + 1) = 0 ) ] [set pcolor red]

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

Заранее спасибо за помощь.

введите описание изображения здесь


person Pierre    schedule 07.03.2014    source источник


Ответы (2)


Альтернативный способ подумать о вашей проблеме - найти кластеры белых пятен: вы выбираете белое пятно наугад и хотите превратить все смежные белые участки в коричневые.

Вы можете посмотреть на «Пример кластеров исправлений» в разделе Примеры кода библиотеки моделей NetLogo, чтобы увидеть один из способов сделать это.

Вот как бы я это сделал. Начнем с определения grow-cluster репортера:

to-report grow-cluster [ current-cluster new-patch ]
  let patches-to-add [
    neighbors4 with [
      pcolor = [ pcolor ] of myself and
      not member? self current-cluster
    ]
  ] of new-patch
  let new-cluster (patch-set current-cluster new-patch)
  report ifelse-value any? patches-to-add
    [ reduce grow-cluster fput new-cluster sort patches-to-add ]
    [ new-cluster ]
end

Код может быть трудным для понимания, если вы не привыкли к функциональному программированию, поскольку он использует рекурсию при вызове reduce. Тем не менее, в двух словах, это:

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

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

to remove-random-side
  let random-patch one-of patches with [pcolor = white]
  let side grow-cluster no-patches random-patch
  ask side [ set pcolor brown ]
end

Предостережение: чтобы это работало, в настройках вашей модели необходимо отключить обтекание мира.

person Nicolas Payette    schedule 08.03.2014

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

Чтобы настроить сетку, вы можете просто сделать:

ask patches [
  set pcolor brown
  let horizontal-street? pycor mod (side + 1) = 0
  let vertical-street? pxcor mod (side + 1) = 0
  if horizontal-street? or vertical-street?
    [ set pcolor white ]
  if horizontal-street? and vertical-street?
    [ set pcolor red ]
]
person Seth Tisue    schedule 23.03.2014