NetLogo:在距离中心特定距离处设置随机补丁的pcolor

时间:2015-08-03 19:50:22

标签: distance netlogo

我在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

expected result

2 个答案:

答案 0 :(得分:2)

这比它看起来更棘手!你认为你可以使用distance

foreach [ 10 20 30 40 ] [
  ask n-of 3 patches with [ distance patch 0 0 = ? ] [
    set pcolor yellow
  ]
]

但是如果我们放弃n-of 3以使每个距离处的所有补丁变为黄色,则结果如下:

enter image description here

问题在于它在指定的精确距离处寻找补丁。

也许你可以给它一点宽容呢?

foreach [ 10 20 30 40 ] [
  ask patches with [
    distance patch 0 0 > ? - 0.5 and
    distance patch 0 0 < ? + 0.5
  ] [
    set pcolor yellow
  ]
]

这样更好,但仍然不是完全正确。圈子的某些部分比其他部分厚:

enter image description here

但也许这对你的目的来说已经足够好了,或者你可以稍微调整一下公差。

最后,这是一种实现类似结果的古怪方法:

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命令让一只乌龟绕另一只乌龟转动,并将它遍历的补丁添加到我们的结果集中。它很慢,但它有效,你会得到一个很好的平滑圆圈:

enter image description here

使用此程序,您的最终代码将是:

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

样本结果:

view

observer> show sort [round distancexy 0 0] of patches with [pcolor = yellow ]
observer: [10 10 10 19 20 20 30 30 30]

我不认为19是一个错误。正如尼古拉斯所说,你不想偏爱圈子的任何特定部分,这意味着你必须允许一些距离的变化。