找到给定方向上一定距离内其他海龟的存在

Find the presence of other turtles in a given direction upto a distance

我想知道在给定海龟的航向中是否有另一个代理存在给定距离。

这里的距离是"D"。

注:

还应考虑在给定方向上出现在 D 之前的任何代理。

即使方向与对方的代理中心不重合,只是碰上了,也应该考虑那个代理

问题:

没有 turtle-ahead 程序可用。由于 patch-size>> turtle-size,patch-ahead 和 turtles-on 的组合不适用。 可能的方法: 1.Represent 乌龟的航向由直线方程决定。

to-report calculate-line[x y angle]
  let m tan angle
  let A m 
  let B -1 
  let C (- m * x + y) 
report (list A B C)
end
to-report heading-to-angle [ h ]
  report (90 - h) mod 360
end

let line-equ calculate-line (xcor) (ycor) (heading-to-angle heading)

2.Calculate此处与其他海龟的垂直距离,检查是否在其他海龟大小的范围内。

to-report value[A X1 Y1];;A is list of coefficents of line, x1 and y1 are coordinates of red turtle
  if-else(abs((item 0 A * X1 + item 1 A * Y1 + item 2 A) / (sqrt((item 0 A ^ 2) + (item 1 A ^ 2) ))) < [size] of wall )
 [ report "true"][report "false"]

结束

3.To 检查红海龟是否在 D 内。可以得到一条垂直于黑色海龟的线,并计算红海龟与它的距离,以检查它是否小于或等于 D。但是然后这增加了更多的复杂性。(尽管可以简化将海龟向左或向右旋转 90 度并得到直线方程。)

   to-report check-wall 
   let return false
  hatch 1[
    set color black
    set size ([size] of one-of walls) / 2
    show (2.5 * ([size] of myself))
    while [distance myself < (2.5 * ([size] of myself))]
    [

      fd ([size] of one-of walls) / 64
      if any? walls in-radius size
      [
        set return true
        ]
      show distance myself
      ]

    ]
  report return
  end

以上作品。但仍然是大约。正如问题中所阐明的那样,我正在寻找可能更少数学的更好解决方案。

这就是我评论的意思。 运行 此代码(作为其自身的模型)。它所做的是将几个 'ahead' 色块上的所有海龟变成不同的颜色。我知道这不是你想要做的,但代理集候选人是相对较少的海龟。这些是您必须检查它们是否在正确路径上的唯一方法。因此,与其将它们变成不同的颜色,不如检查它们与初始乌龟的方向。

to setup
  clear-all
  set-patch-size 25
  resize-world -10 10 -10 10
  create-turtles 1000
  [ setxy random-xcor random-ycor
    set color yellow
    set size 0.4
  ]
  ask one-of turtles
  [ set color red
    set size 1
    check-from-me 5
  ]
end

to check-from-me [howfar]
  let counter 0
  let candidates turtles-here
  while [counter < howfar]
  [ set counter counter + 1
    set candidates (turtle-set candidates turtles-on patch-ahead counter)
  ]
  ask candidates [set color red]
end