万花筒模型与代码(一)

这个模型使用海龟来重复绘制圆圈和其他几何形状,同时定期转动,形成复杂的图案,看起来像万花筒和风车。它展示了即使简单的规则也能创造复杂而美丽的图案。

它是如何工作的

图案-1

在这个图案中,每10只海龟向前移动0.5步,向右转动DIRECTION度。每次调用图案都会孵化一只海龟,它执行RIGHT-CIRCLE函数,然后执行LEFT-CIRCLE函数,然后死亡。通过增加DIRECTION,海龟转动的角度也会增加。这意味着每次向前移动,海龟都会在一个中心点周围转动得更紧密。因此,当DIRECTION设置为0时,海龟只是向前移动。当它增加时,比如从0到1再到10,海龟的运动就会变得更加圆形。虽然图案会改变,但必须明白正在创建的基本形状是一个圆。

图案-2

每个偶数编号的海龟向前移动1步,并向右转1度。然后孵化一只执行HEXAGON函数的海龟,然后死亡。每个奇数编号的海龟向前移动1步,并向左转1度。然后孵化一只执行OCTAGON函数的海龟,然后死亡。有趣的是,当NUM-TURTLES滑块调到一个很高的数字,比如大于或等于20时,较小的数字中的图案变得难以辨认。然而,必须明白,尽管新图案可能看起来不同,但正在制作的基本形状仍然是六边形和八边形。

图案-3

每5只海龟向前移动0.5步,并向右转动DIRECTION度。然后孵化一只执行PENTAGON函数的海龟,然后死亡。图案-3和图案-5可能是这个模型中最简单的图案,因为它们的行为解释起来最简单。基本上,图案-3创建五边形,但是因为海龟向前移动0.5步,并向右转动DIRECTION度,这就导致图案发生了显著的变化。看上去好像孵化的海龟在创造不同的形状,但事实上,它们正在制作五边形,而且永远都是五边形。只有外部影响的轻微变化才会导致图案的变化。

图案-4

每3只海龟向右转1度,然后孵化一只执行NINE-GON函数的海龟,然后死亡。所有其他海龟都向左转1度,然后孵化一只执行LEFT-CIRCLE函数的海龟,然后死亡。

图案-5

每只海龟都孵化一只执行LEFT-SQUARE函数的海龟,然后死亡。

图案-6

每只海龟向前移动DIRECTION步,然后孵化一只按照以下顺序执行以下函数的海龟:NINE-GON、OCTAGON、RIGHT-CIRCLE、PENTAGON、HEXAGON和LEFT-CIRCLE。执行完这些函数后,每只孵化的海龟都死亡。

如何使用它

将NUM-TURTLES设置为0到36之间的一个期望值(默认值为10)。NUM-TURTLES确定您希望初始拥有多少只海龟。这些初始海龟将孵化其他制造形状的海龟。

将COLOR-SEP设置为0到30之间的一个期望值(默认值为2)。COLOR-SEP确定海龟(因此是万花筒)将采用的颜色范围。值越高,范围越小。

将MAX-NUM设置为1024到8192之间的一个期望值(默认值为4096)。MAX-NUM确定世界中可以同时存在的最大海龟数量。但需要注意,更高的值会使模型运行速度变慢。

设置完COLOR-SEP和NUM-TURTLES后,按下SETUP按钮设置模型。

接下来,选择一个图案。在每个图案中,初始海龟会孵化其他海龟,并且这些孵化的海龟会绘制不同的几何形状。每个图案由一个永远按钮表示。用户无法更改PATTERN-2、PATTERN-4或PATTERN-6。然而,PATTERN-1、PATTERN-3和PATTERN-5允许使用DIRECTION和EXPANDER滑块进行用户控制。有关每个图案中指令的详细描述,请转到信息窗口末尾。

滑块DIRECTION(默认值为2)是为PATTERN-1和PATTERN-3设计的。在每个周期中,DIRECTION确定制造图案的海龟向右转的角度。换句话说,如果DIRECTION设置为12,每只海龟都会在向前移动之前向右转12度。

滑块EXPANDER专门为图案5设计(默认值为80)。在PATTERN-5的每个周期,EXPANDER确定多边形的每条边将有多大。

用户还可以控制每个图案展示的颜色分布。COLOR-SHIFT按钮将不断增加或减少'curr-color-sep'的值一小段随机量。因此,滑块值本身不会改变,但海龟的颜色值会改变。SHIFT-DIRECTION选择器确定'curr-color-sep'是增加还是减少。

模型的其他特点包括LIFT-PEN和RESTORE按钮。LIFT-PEN将所有海龟的笔抬起,并杀死所有编号大于NUM-TURTLES的海龟。RESTORE将杀死所有编号大于NUM-TURTLES的海龟,并告诉所有海龟将笔放下。杀死所有编号大于NUM-TURTLES的海龟将恢复世界中海龟的原始数量。

与LIFT-PEN和RESTORE按钮一起使用的一个有用工具是一个名为FOLLOW-TURTLE的开关。如果在没有打开FOLLOW-TURTLE的情况下按下LIFT-PEN,您会看到图案的轮廓,因为海龟在没有放下笔的情况下移动。但是当打开开关时,一只孵化的海龟会放下笔。但是,由于海龟不断出生和死亡,这只特定的海龟可能需要一些时间才能出现。还应该明白,因为一些图案将海龟分成不同的组,并分配给它们不同的形状来创建,所以可能需要多只海龟放下笔来代表图案中所有海龟正在做的事情。

界面窗口底部提供了两个监视器。COUNT-TURTLES显示当前世界中的海龟数量。同样,CURR-COLOR-SEP显示该变量的值,这样您就知道它何时已经被更改,以及更改了多少。

注意事项

这里要注意的一个重要问题是COUNT-TURTLES中显示的数量。立即,它的值会比NUM-TURTLES大得多,但很快就会稳定在一个不错的大数字上。查看代码标签。最初,在设置时,有NUM-TURTLES只海龟。一旦按下图案按钮之一,这些海龟中的每一只都会反复孵化一只新的海龟,并按指定的角度转动。

重要的是要理解,NUM-TURTLES的数量迅速增长到大于NUM-TURTLES的数量是因为在孵化一只海龟和完成绘制给定形状之间,其他海龟也在被孵化。因此,如果我们在其中一个图案中添加一个wait语句,就不能孵化那么多只海龟。换句话说,大于NUM-TURTLES的海龟数量会减少。由于海龟执行命令的速度比孵化的海龟快得多,它们在一个图案循环中产生了很多海龟;然而,最终,海龟开始死亡。在这一点上,每一步中出生的海龟数量大致等于死亡的海龟数量。

您还应该注意到,COLOR-SEP(代码中称为'current-color-sep')如何改变图案的外观。打开COLOR-SHIFT,并让'current-color-sep'变得非常大。然后观察当它很小,可能为零或一些负数时会发生什么。

尝试的事情

尝试在PATTERN-1和PATTERN-3上玩转DIRECTION滑块,以及在PATTERN-5上玩转EXPANDER滑块。观察当您更改每个值时图案会发生什么变化。GEOMETRON-TOP-DOWN旨在成为一个视觉上令人愉悦的模型,只需观看即可。看看不同的COLOR-SEP值会产生什么样的效果,并探索COLOR-SHIFT如何改变万花筒的外观。哪种情况对您来说最好?

尝试更改代码标签中的代码。增加每只海龟绘制的形状的大小,或者尝试更改每只海龟转动的角度的大小。

每只海龟移动或转动一定量的行为之外,让它移动一小段随机量(就像COLOR-SHIFT中对curr-color-sep的更改)。您可以添加多少随机性到“万花筒”中,并且仍然保持某种总体结构?

在运行了其中一个图案之后,尝试更改NUM-TURTLES的数量,然后停止图案,并按下CLEAR-PATCHES-LIFT-PEN。然后再次开始图案。会发生什么?您能解释为什么会这样吗?

尝试在运行期间更改MAX-NUM滑块,会发生什么?您能解释为什么会发生这种情况吗?

扩展模型

每当一只海龟被NUM-TURTLES中的一只孵化时,它会开始绘制一定的图案。更改hatch中的命令,以便海龟绘制其他形状或图案。尝试预测将出现的整体形状。

尝试编写一个全新的GEOMETRON-TOP-DOWN项目。在当前项目中,海龟从NUM-TURTLES海龟的中心核心中分离出来。在您的新项目中,也许绘制的海龟可以围绕某个固定(或移动)的点轨道-查看NetLogo项目'n-bodies'和'gravitation'。

NETLOGO功能

GEOMETRON-TOP-DOWN很好地利用了海龟原语hatch。每当孵化一只海龟,它都会执行hatch命令后面的命令列表。通常它只是改变颜色或改变一些变量-它没有理由不能运行其他一些可能很长的程序。这正是这里发生的事情。

这个模型是NetLogo模型库中少数使用“连续”显示更新模式的模型之一。这是因为这个模型没有“ticks”的概念,因为每只海龟都是并行遵循一组规则。

关于形状的说明

以下是在这个模型中用于创建六个图案的所有基本形状函数的列表。重要的是要理解,这些图案的复杂性实际上只是这些形状函数的不同组合。例如,图案-1利用了right-shape和left-shape函数。这两个函数只是绘制圆圈。但是通过对海龟的操作和执行操作的海龟的选择进行轻微变化,可以创建图案-1代表的图案。事实上,这正是模型用来创建所有图案的基本算法。采用基本形状函数,对海龟的操作进行轻微变化,并选择哪些海龟来做。

关于RIGHT-CIRCLE:
执行以下过程180次:
向前移动1.5步,向右转2度。
要看到此函数创建的形状,请尝试在命令中心使用笔放下的一只海龟调用它。
一只海龟将会绘制一个朝右方向的圆。

关于LEFT-CIRCLE:
执行以下过程180次:
向前移动1.5步,向左转2度。
要看到此函数创建的形状,请尝试在命令中心使用笔放下的一只海龟调用它。
一只海龟将会绘制一个朝左方向的圆。

关于LEFT-SQUARE:
执行以下过程4次:
向前移动EXPANDER步,并向右转90度。
要看到此函数创建的形状,请尝试在命令中心使用笔放下的一只海龟调用它。
一只海龟将会绘制一个朝左方向的正方形。

关于RIGHT-TRIANGLE:
执行以下过程3次:
向前移动35步,并向右转120度。
要看到此函数创建的形状,请尝试在命令中心使用笔放下的一只海龟调用它。
一只海龟将会绘制一个朝右方向的三角形。

关于OCTAGON:
执行以下过程8次:
向前移动30步,并向右转45度。
要看到此函数创建的形状,请尝试在命令中心使用笔放下的一只海龟调用它。
一只海龟将会绘制一个朝右方向的八边形。

关于PENTAGON:
执行以下过程5次:
向前移动35步,并向右转72度。
要看到此函数创建的形状,请尝试在命令中心使用笔放下的一只海龟调用它。
一只海龟将会绘制一个朝右方向的五边形。

关于HEXAGON:
执行以下过程6次:
向前移动30步,并向右转60度。
要看到此函数创建的形状,请尝试在命令中心使用笔放下的一只海龟调用它。
一只海龟将会绘制一个朝右方向的六边形。

关于NINE-GON:
执行以下过程9次:
向前移动35步,并向右转40度。
要看到此函数创建的形状,请尝试在命令中心使用笔放下的一只海龟调用它。
一只海龟将会绘制一个朝右方向的九边形。

  • 21
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

异数时空

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值