我在NetLogo中相当新,我想创建斑驳的世界表面,其中补丁(黄色)与中央补丁的距离不同(虚线红色圆圈)。
更具体地说,我想在距离处选择3个随机补丁:来自中央补丁的10,20,30个补丁并将它们变为黄色。我确信这样做非常简单,但我无法确定距离测量的正确使用方法。
任何建议都非常感谢!
to setup
clear-all
setup-patches
end
to setup-patches
clear-all
ask patches [ set pcolor green ]
ask patch 0 0
[
set pcolor yellow
ask patches in-radius 10 [set pcolor yellow] ; how to include distance here??
]
ask n-of 5 patches [ set pcolor yellow] ; or here ??
end
答案 0 :(得分:2)
这比它看起来更棘手!你认为你可以使用distance
:
foreach [ 10 20 30 40 ] [
ask n-of 3 patches with [ distance patch 0 0 = ? ] [
set pcolor yellow
]
]
但是如果我们放弃n-of 3
以使每个距离处的所有补丁变为黄色,则结果如下:
问题在于它在指定的精确距离处寻找补丁。
也许你可以给它一点宽容呢?
foreach [ 10 20 30 40 ] [
ask patches with [
distance patch 0 0 > ? - 0.5 and
distance patch 0 0 < ? + 0.5
] [
set pcolor yellow
]
]
这样更好,但仍然不是完全正确。圈子的某些部分比其他部分厚:
但也许这对你的目的来说已经足够好了,或者你可以稍微调整一下公差。
最后,这是一种实现类似结果的古怪方法:
to-report circle-at [ d ]
let dummies []
let circle []
create-turtles 2 [
set dummies lput self dummies
]
ask last dummies [
setxy 0 d
create-link-with first dummies [ tie ]
]
repeat 3600 [
ask first dummies [
right 0.1
ask last dummies [
set circle lput patch-here circle
]
]
]
ask turtle-set dummies [ die ]
report patch-set circle
end
它使用tie
命令让一只乌龟绕另一只乌龟转动,并将它遍历的补丁添加到我们的结果集中。它很慢,但它有效,你会得到一个很好的平滑圆圈:
使用此程序,您的最终代码将是:
foreach [ 10 20 30 40 ] [
ask n-of 3 circle-at ? [
set pcolor yellow
]
]
答案 1 :(得分:2)
以下是另一种选择:
to setup
clear-all
ask patches [ set pcolor green ]
foreach [10 20 30] [
repeat 3 [
make-yellow-patch ?
]
]
end
to make-yellow-patch [dist]
create-turtles 1 [
rt random-float 360
fd dist
while [pcolor = yellow] [
bk dist
rt random-float 360
fd dist
]
set pcolor yellow
die
]
end
样本结果:
observer> show sort [round distancexy 0 0] of patches with [pcolor = yellow ]
observer: [10 10 10 19 20 20 30 30 30]
我不认为19是一个错误。正如尼古拉斯所说,你不想偏爱圈子的任何特定部分,这意味着你必须允许一些距离的变化。