找到给定方向上一定距离内其他海龟的存在
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
我想知道在给定海龟的航向中是否有另一个代理存在给定距离。
这里的距离是"D"。
注:
还应考虑在给定方向上出现在 D 之前的任何代理。
即使方向与对方的代理中心不重合,只是碰上了,也应该考虑那个代理
问题:
没有 turtle-ahead 程序可用。由于 patch-size>> turtle-size,patch-ahead 和 turtles-on 的组合不适用。
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