通过角度Netlogo旋转表示龟位置的向量

时间:2014-08-14 09:12:49

标签: netlogo

我按如下方式设置/更新每个海龟的位置:

 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

提前致谢!

3 个答案:

答案 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º是东;因此,在处理角度时会翻转sincos