在NetLogo中创建给定区域的随机形状(blob)

时间:2014-01-08 14:05:39

标签: netlogo

是否可以在NetLogo中创建给定区域的随机形状(例如,见下文)?

enter image description here

3 个答案:

答案 0 :(得分:4)

第一次尝试Seth的建议#1。它也创造了一个整洁的视觉效果!

patches-own [ height ]

to blobbify
  clear-all
  repeat (ceiling 2 * (ln (world-height * world-width))) [
    ask patch (round (random (world-width / 2)) - world-width / 4)
              (round (random (world-height / 2)) - world-height / 4)
              [ set height world-width * world-height ] ]
  while [ count patches with [ height > 1 ] < (world-width * world-height / 4)] 
        [ diffuse height 1
          ask patches with [ height > 0 ] [ set pcolor height ]
        ]
   ask patches with [ height > 1 ] [ set pcolor white ]
end

答案 1 :(得分:4)

我找到了一种非常简单的方法,可以产生非常好的效果。

创建一只乌龟。乌龟随意散步。在每个步骤之后,他们将最接近它们的未着色补丁设置为所需的颜色。乌龟这样做的次数等于所需的面积。

以下是代码:

to make-blob [ area ]
  let blob-maker nobody
  crt 1 [ set blob-maker self ]
  repeat area [
    ask blob-maker [
      ask min-one-of patches with [ pcolor = black ] [ distance myself ] [ set pcolor blue ]
      rt random 360
      fd 1
    ]
  ]
  ask blob-maker [ die ]
end

这自然会产生很好的弯曲斑点。

使乌龟的步长更小使得斑点更圆。使其更大可以产生更薄,更零星的斑点(尽管您可能会遇到断开补丁的风险)。

编辑:

我注意到当你有一个庞大的补丁时,我的答案运行得很慢。这是一个更快的版本:

to make-blob [ area x y ]
  let blob-maker nobody
  crt 1 [ set blob-maker self setxy x y ]
  let border patch-set [ patch-here ] of blob-maker
  repeat area [
    ask blob-maker [
      ask min-one-of border [ distance myself ] [
        set pcolor green
        set border (patch-set border neighbors4) with [ pcolor = black ]
      ]
      rt random 360
      fd .8
    ]
  ]
  ask blob-maker [ die ]
end

答案 2 :(得分:2)

生成随机blob是一个难题,没有明显的解决方案。修复blob的区域会使它变得更难。

您需要选择一种方法,然后尝试弄清楚如何在NetLogo代码中表达该方法。

至于选择什么方法,我想如果你搜索就有这方面的文献。但就我而言,我有三个想法:

  • 分散世界各地的随机点,使用diffuse在这些山峰周围形成平滑的景观。 (请参阅NetLogo模型库的Art部分中的Diffusion Graphics模型,以获取此代码;但是,您需要关闭世界包装。)然后仅选择“高程”超过某个阈值的那些修补程序。要获得所需区域,请更改阈值,直至达到目标。

  • 使用极坐标绘制围绕中心点的曲线,其中θ从0到360,随机变化4。你需要一种方法来获得半径的平滑随机变化,可能是通过生成随机数然后对它们应用平滑函数。为了强制blob具有所需的区域,首先生成整个曲线,然后根据需要进行缩放。你可能需要一些技巧来避免θ= 0时的不连续性,也许是通过使用包装的平滑函数。

  • 通过在世界各地散布点生成随机多边形,然后丢弃中间的部分或全部点。 (你可以采用凸包,但是你总会得到一个凸形,对你来说可能不是“blobby”。所以你可能想要像生成n个随机点然后保持m个点一样距离中心最远,不考虑凸度。)一旦你得到了随机多边形,就应用一些平滑函数将它变成一个弯曲的斑点。然后根据需要缩放整个物体以获得所需的区域。