在NetLogo中创建给定区域的随机形状(blob)
是否可以创建随机形状,例如NetLogo中的给定区域,请参见下文在NetLogo中创建给定区域的随机形状(blob),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