如何随机删除网格中的块边?

时间:2014-03-07 21:27:51

标签: netlogo

How to control square size in a grid from square area?开始,我想在网格中随机删除块侧。我的想法在这里:

%%我第一次在网格中随机选择一个白色补丁(如下图所示):

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]

%%最后,我在棕色的所有白色斑块中着色,这些斑块位于两个红色斑块之间,并且与随机斑块位于同一侧。要识别这些白色斑块,我是否要计算随机斑块和最近的红色斑块之间的距离,并为沿这些距离设置的所有白斑补色?

提前感谢您的帮助。

enter image description here

2 个答案:

答案 0 :(得分:1)

考虑问题的另一种方法是找到白色补丁集群:您随机选择一个白色补丁,并且希望将所有连续白色补丁变为棕色

您可以查看NetLogo模型库的代码示例部分中的“Patch Clusters示例”,了解一种方法。

我将如何做到这一点。让我们从定义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

如果您不习惯函数式编程,代码可能很难理解,因为它在recursion的调用中使用了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

警告:为此,必须在模型设置中禁用世界包装。

答案 1 :(得分:0)

由于您正在制作统一网格,因此您可能会考虑仅在pxcorpycor上进行数学运算,而不是采用Patch Clusters示例方法。这种方法最适合处理不规则形状。

要设置网格,您可以执行以下操作:

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 ]
]