是否可以在NetLogo中创建给定区域的随机形状(例如,见下文)?
答案 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个点一样距离中心最远,不考虑凸度。)一旦你得到了随机多边形,就应用一些平滑函数将它变成一个弯曲的斑点。然后根据需要缩放整个物体以获得所需的区域。