我按如下方式设置/更新每个海龟的位置:
set xcor xcor + item 0 vector
set ycor ycor + item 0 vector
因此,我将向量添加到当前代理的坐标。
问题: 我希望按角度x旋转添加的矢量。因此,矢量"矢量"应旋转角度x。 该角度应取自具有指定偏差的高斯分布。
我正在尝试实现与Couzin模型类似的东西。 http://www.csim.scu.edu.tw/~chiang/course/ComputerGameAdvance/Collective%20Memory%20and%20Spatial%20Sorting%20in%20Animal%20Groups.pdf
提前致谢!
答案 0 :(得分:3)
你似乎有两个问题;我将解释您用于标题的那个。矩阵扩展允许矩阵乘法,因此您可以在拥有旋转角度后创建标准旋转矩阵。但NetLogo的标准建议是使用更加以龟为中心的方法。然后你需要决定是否使用NetLogo标题约定(北为0度,东为90度等)如果是这样你可以这样做:
to move [#dx #dy]
let %dist 0
ask patch 0 0 [set %dist distancexy #dx #dy]
facexy (xcor + #dx) (ycor + dy)
let %theta random-rotation
rt %theta
jump %dist
end
to-report random-rotation
report (random-float 360) - 180
end
这里的随机旋转不是高斯分布的,因为我不确定你的意思。也许是冯米塞斯分布?无论如何,你应该澄清并提出一个单独的问题。
答案 1 :(得分:3)
有点简单,将矢量转换为角度,旋转(随机化),然后转换回来。对于良好的编码风格等,请分解模块。
to-report rotate [ #vector #angle ]
let $dx first #vector
let $dy last #vector
let $magnitude sqrt ($dx * $dx + $dy * $dy)
set #angle #angle + atan first #vector last #vector
report (list $magnitude * sin #angle $magnitude * cos #angle)
end
to-report nudge-vector [ #vector #std-dev ]
report rotate #vector random-normal 0 #std-dev
end
to move-inaccurately [ #vector #std-deviation ]
set #vector nudge-vector #vector #std-deviation
setxy (xcor + first #vector) (ycor + last #vector)
end
答案 2 :(得分:3)
只是为了强调艾伦的观点:除非你有充分的理由使用向量,否则在NetLogo中避免它们通常会更容易和更清晰。如果您想要做的就是从高斯分布中随机抽取乌龟,您可以这样做:
right-turn random-normal 0 <std-dev>
其中<std-dev>
是您所需的标准偏差。然后,你可以通过向量的大小来告诉乌龟前进:forward <distance>
。
如果你绝对需要进行矢量旋转,你可以很容易地完成这个矩阵扩展:
to-report rotate-vector [ vec angle ]
let x first vec
let y last vec
let mag sqrt (x * x + y * y)
let old-angle atan x y
let new-angle angle + old-angle
report (list (mag * sin new-angle) (mag * cos new-angle))
end
请记住,NetLogo中的角度在45º左右翻转,因此0º是北,90º是东;因此,在处理角度时会翻转sin
和cos
。