从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]
%%最后,我在棕色的所有白色斑块中着色,这些斑块位于两个红色斑块之间,并且与随机斑块位于同一侧。要识别这些白色斑块,我是否要计算随机斑块和最近的红色斑块之间的距离,并为沿这些距离设置的所有白斑补色?
提前感谢您的帮助。
答案 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)
由于您正在制作统一网格,因此您可能会考虑仅在pxcor
和pycor
上进行数学运算,而不是采用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 ]
]