Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/matlab/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在NetLogo中创建给定区域的随机形状(blob)_Netlogo - Fatal编程技术网

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

在NetLogo中创建给定区域的随机形状(blob),netlogo,Netlogo,是否可以创建随机形状,例如NetLogo中的给定区域,请参见下文 生成随机斑点是一个没有明显解决方案的难题。修复斑点区域会使其更加困难 您需要选择一种方法,然后尝试找出如何在NetLogo代码中表达这种方法 至于选择什么方法,我想如果你搜索的话,会有关于这个的文献。但就在我脑海中,我有三个想法: 在世界各地散布随机点,使用“漫反射”在这些山峰周围创建平滑的景观。请参阅NetLogo模型库艺术部分中的扩散图形模型,以获取此模型的代码;不过,您需要关闭“世界包装”。然后仅选择高程超过某个阈值的面片。

是否可以创建随机形状,例如NetLogo中的给定区域,请参见下文


生成随机斑点是一个没有明显解决方案的难题。修复斑点区域会使其更加困难

您需要选择一种方法,然后尝试找出如何在NetLogo代码中表达这种方法

至于选择什么方法,我想如果你搜索的话,会有关于这个的文献。但就在我脑海中,我有三个想法:

在世界各地散布随机点,使用“漫反射”在这些山峰周围创建平滑的景观。请参阅NetLogo模型库艺术部分中的扩散图形模型,以获取此模型的代码;不过,您需要关闭“世界包装”。然后仅选择高程超过某个阈值的面片。要获得所需区域,请改变阈值,直到达到目标

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

通过遍及世界的散射点生成随机多边形,然后丢弃中间的一些或所有点。你可以选择凸面外壳,但是你总是会得到一个凸面形状,它可能不够大。因此,您可能希望生成n个随机点,然后保留距离中心最远的m个点,而不考虑凸性。获得随机多边形后,应用一些平滑函数将其转化为曲线斑点。然后根据需要缩放整个对象,以获得所需的区域


第一次尝试塞思的建议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

我发现了一个非常简单的方法,可以产生非常好的结果

创造一只海龟。海龟进行随机行走。在每一步之后,他们将离他们最近的未着色面片设置为所需的颜色。海龟这样做的次数等于所需的面积

代码如下:

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