风车模型与代码

这篇文章介绍了一个使用NetLogo编程语言的模型,通过简单的代理规则和迭代机制,创造出复杂的图案,如万花筒或风车效果。模型的核心是乌龟绘制圆圈并随着旋转产生视觉变化,可通过调整参数控制图案的复杂度和颜色分布。
摘要由CSDN通过智能技术生成

这个模型使用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命令后面的命令列表。在大多数情况下,这通常只是用来改变新乌龟的颜色或改变一些变量。但并没有理由它不能运行其他一些,可能是很长的,过程,这正是这里发生的事情。

  • 24
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

异数时空

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

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

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

打赏作者

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

抵扣说明:

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

余额充值