这个模型使用NetLogo乌龟来重复绘制圆圈,定期转动,以便显示出类似万花筒或风车的效果。这是一个演示,展示了一组简单的代理规则如何产生复杂而美丽的图案。
内部工作原理非常简单。创建了许多乌龟,它们的笔都是放下的(无论它们走到哪里,都会留下痕迹)。在每个时刻,每只原始乌龟都会孵化出一只新的“绘画乌龟”,它的唯一工作就是画一个圆圈,然后立即死亡。在孵化之间,原始乌龟唯一要做的就是缓慢旋转。虽然模型内置了两种图案,但两种图案都遵循相同的规则,唯一的区别是PATTERN-2中一半的绘画乌龟逆时针画圆圈,而PATTERN-1中所有乌龟都顺时针画圆圈。
如何使用
NUM-TURTLES滑块实际上决定了万花筒的“臂”或“花瓣”的数量。首先将该滑块设置为所需值(10是可以的)。
接下来,将COLOR-SEP设置为某个值。 COLOR-SEP确定了乌龟(因此也是万花筒)将采用的颜色范围。值越高,范围越小。要获得一个漂亮的三色万花筒,将COLOR-SEP设置为25。COLOR-SEP与颜色范围之间的这种反比关系是因为COLOR-SEP充当一个常数,用来除以乌龟的颜色。
设置好NUM-TURTLES和COLOR-SEP后,按下SETUP按钮,准备好开始绘制模型。
然后,选择你想要的图案。每个图案都有自己的永久按钮来控制它。PATTERN-1让万花筒的“臂”都顺时针螺旋,而PATTERN-2让万花筒的“臂”顺时针和逆时针螺旋,产生了稍微复杂的设计。
最后,你可以改变这个模型展示的颜色分布。COLOR-SHIFT按钮将增加或减少乌龟使用的COLOR-SEP的值,这个值在内部保存为CURR-COLOR-SEP。因此滑块值本身并没有改变,但乌龟所查看的数字不断变化。这个数字会随机改变一小部分。INCREASE-COLOR?开关确定CURR-COLOR-SEP是增加(true)还是减少(false)。
你还有一个监视器CURR-COLOR-SEP,它会显示该变量的值,这样你就知道它已经被改变了,改变了多少。
代码
globals [ curr-color-sep ] ; spread of the colors in the kaleidoscope
; INITIALIZATION PROCEDURES
to setup
clear-all
set-default-shape turtles "circle"
; the patterns assume evenly spaced turtles
create-ordered-turtles num-turtles [ pen-down ]
set curr-color-sep color-sep
reset-ticks
end
; RUN-TIME PROCEDURES
; First Pattern
; Turn a bit right, hatch a turtle which draws a circle then dies
to pattern-1
ask turtles [
rt 1
hatch 1 [
set color 5.375 * ((count turtles - 1) / curr-color-sep) + 10
right-circle
die
]
]
every 1 [ if color-shift? [ color-shift ] ]
tick
end
; Second Pattern
; Half our turtles do Pattern 1; the other half do the same,
; except mirrored (they turn left circles)
to pattern-2
ask turtles [
ifelse (who mod 2) = 0 [
rt 1
hatch 1 [
set color 5.375 * ((count turtles - 1) / curr-color-sep) + 10
right-circle
die
]
][
lt 1
hatch 1 [
set color 5.375 * ((count turtles - 1) / curr-color-sep) + 10
left-circle
die
]
]
]
every 1 [ if color-shift? [ color-shift ] ]
tick
end
; Spin a circle, clockwise
to right-circle
repeat 36 [
fd 4
rt 10
]
end
; Spin a circle, counterclockwise
to left-circle
repeat 36 [
fd 4
lt 10
]
end
; Change curr-color-sep, to increase colors or decrease colors
; and cap the value at the bottom at 1 and at the top at 60
to color-shift
ifelse increase-color? [
set curr-color-sep curr-color-sep + random 3
if curr-color-sep > 60 [ set curr-color-sep 60 ]
][
set curr-color-sep curr-color-sep - random 3
if curr-color-sep < 1 [ set curr-color-sep 1 ]
]
end
; Copyright 1998 Uri Wilensky.
; See Info tab for full copyright and license.
注意事项
首先,尝试玩耍并观察发生了什么。这个模型的目的是观看时能带来视觉上的愉悦。看看不同的NUM-TURTLES和COLOR-SEP值会产生什么样的效果,探索COLOR-SHIFT如何改变万花筒的外观。哪种效果对你来说最好呢?
这里需要注意的一件重要的事情是COUNT-TURTLES中的数字。它立即变得比NUM-TURTLES大得多,但很快就会定型成一个很大的数字。看看Procedures窗口。这里实际上有两个级别的乌龟命令。最初,在设置时,有NTURTLES数量的乌龟。一旦按下图案按钮之一,这些乌龟(组成了万花筒的“臂”)会重复孵化一个新的乌龟并转动一度。新孵化的乌龟开始绘制圆圈,完成后自毁。由于“臂”乌龟执行命令的速度比孵化的乌龟快得多,它们在一个圆圈的循环中会产生许多乌龟;然而,最终乌龟开始死亡。此时,出生的乌龟数量大致等于任何给定步骤中死亡的乌龟数量。
你还应该注意COLOR-SEP(或者实际上是CURR-COLOR-SEP)如何改变万花筒的外观。打开COLOR-SHIFT?,让CURR-COLOR-SEP变得非常大。然后看看它变小时会发生什么,也许是零或一些负数。
尝试
尝试在代码标签中更改代码。增加每只乌龟绘制的圆圈的大小,或者尝试改变每只乌龟转动的角度大小。
每个乌龟移动或转动一定量,那么让它移动一小段随机量呢(就像COLOR-SHIFT中对curr-color-sep的更改)。你可以添加多少随机性,而仍然保持某种整体结构?
扩展模型
每当“臂”乌龟孵化出一只乌龟时,它会开始绘制一个圆圈。更改hatch
命令列表,使其绘制其他一些形状或图案。试着预测出会出现什么整体形状。
目前,两种图案的唯一区别是PATTERN-2让一半的“臂”乌龟画左边的圆圈,另一半画右边的圆圈。编写自己的图案--即,为这些乌龟编写一个新的命令或一组命令。
尝试编写一个完全新的类似模型。在当前模型中,乌龟从NTURTLES乌龟的中心核心中分裂出来。在你的新模型中,也许绘画的乌龟可以围绕某个固定(或移动)的点轨道运动,就像在StarLogoT模型N Bodies和Gravitation中一样。
NETLOGO功能
这很好地利用了乌龟原语hatch
。每当孵化一只乌龟时,它会执行hatch
命令后面的命令列表。在大多数情况下,这通常只是用来改变新乌龟的颜色或改变一些变量。但并没有理由它不能运行其他一些,可能是很长的,过程,这正是这里发生的事情。