Netlogo 在视锥的另一端计算代理
Netlogo 在视锥的另一端计算代理,netlogo,Netlogo,给定: 墙(灰剂)沿墙的顶部处于固定位置 世界 蓝色特工总是在正下方,但在不同的位置 距离。但他们可能会走到差距的一边,但是 可以旋转,使其面向间隙 所有蓝海龟的视锥角度都是一样的 在上图中,蓝色代理的视锥被描绘出来。我想计算出与视锥两端相接的灰墙,也就是说,一个在右边,一个在左边。我也可以计算出那个点的x坐标。不是灰色代理的坐标,因为这是一个近似值 计算: 在x坐标中,视觉锥的极值与灰海龟相交。或者它们相交的那些灰海龟 大致数字: 因此,我希望在下图中计算x_1和x_2。 一种方法可以像@
给定:
- 墙(灰剂)沿墙的顶部处于固定位置 世界李>
- 蓝色特工总是在正下方,但在不同的位置 距离。但他们可能会走到差距的一边,但是 可以旋转,使其面向间隙李>
- 所有蓝海龟的视锥角度都是一样的
如果这是一个二维问题,那么它只是一个相交线的情况 我会避免使用多个案例;这很容易出错 你将有一条线描述你的海龟墙,两条线描述你的视野边界。您可以将这三条线中的每一条以参数形式表示为[o.x,o.y]+[v.x,v.y]*s,这是一个固定点[o.x,o.y]加上按s缩放的法向量[v.x,v.y] 海龟墙只是为某个“s”域定义的;假设wall.s的域=[0到0.4,0.6到1] 我将描述如何找到交点,但参数化二维直线的交点是非常标准的,最好以PDF格式显示,因此我将向您介绍此。。。 (记住永远不要被零除)
一旦你知道缩放参数'left.wall.s'和'right.wall.s'的值,你就可以知道海龟墙的域是否在玩家的视图中。此外,您还可以通过插入参数化直线公式来确定交点。如果这是一个二维问题,则这只是相交直线的情况 我会避免使用多个案例;这很容易出错 你将有一条线描述你的海龟墙,两条线描述你的视野边界。您可以将这三条线中的每一条以参数形式表示为[o.x,o.y]+[v.x,v.y]*s,这是一个固定点[o.x,o.y]加上按s缩放的法向量[v.x,v.y] 海龟墙只是为某个“s”域定义的;假设wall.s的域=[0到0.4,0.6到1] 我将描述如何找到交点,但参数化二维直线的交点是非常标准的,最好以PDF格式显示,因此我将向您介绍此。。。 (记住永远不要被零除)
一旦你知道缩放参数'left.wall.s'和'right.wall.s'的值,你就可以知道海龟墙的域是否在玩家的视图中。您还可以通过插入参数线公式来确定交点。dwn的答案包括计算精确的交点 你说你还想找出答案所在的补丁。下面是代码:
to setup
clear-all
create-turtles 1 [
set heading -30 + random 60
]
ask turtles [
;; show center of vision cone
ask boundary-patch [ set pcolor red ]
;; show edges of 20 degree vision cone
lt 10
ask boundary-patch [ set pcolor blue ]
rt 20
ask boundary-patch [ set pcolor blue ]
;; restore turtle's original heading
lt 10
]
end
;; answers the question, what patch on the top row of the
;; world is the turtle currently facing?
to-report boundary-patch ;; turtle procedure
let n 0
while [true] [
let target patch-ahead n
if target = nobody or [pycor = max-pycor] of target [
report target
]
set n n + 1
]
end
样本结果:当然,通过公式直接计算答案在计算上更有效。(末尾有一个可选的舍入步骤,具体取决于您想要的是点还是面片。)但这段代码展示了如何做到这一点,而无需进行任何复杂的数学运算。dwn的答案包括计算精确的交点 你说你还想找出答案所在的补丁。下面是代码:
to setup
clear-all
create-turtles 1 [
set heading -30 + random 60
]
ask turtles [
;; show center of vision cone
ask boundary-patch [ set pcolor red ]
;; show edges of 20 degree vision cone
lt 10
ask boundary-patch [ set pcolor blue ]
rt 20
ask boundary-patch [ set pcolor blue ]
;; restore turtle's original heading
lt 10
]
end
;; answers the question, what patch on the top row of the
;; world is the turtle currently facing?
to-report boundary-patch ;; turtle procedure
let n 0
while [true] [
let target patch-ahead n
if target = nobody or [pycor = max-pycor] of target [
report target
]
set n n + 1
]
end
样本结果:当然,通过公式直接计算答案在计算上更有效。(最后有一个可选的取整步骤,这取决于你是想要一个点还是一个面片。)但这段代码展示了如何做到这一点,而不必做任何复杂的数学运算。以下三角法(由@JenB建议)非常适用:
to-report calx2 [x0 y0 x1 y1 A]
report x0 + (y1 - y0) * tan ( A + atan (x1 - x0) (y1 - y0))
end
to start
ask turtles[
set corner-1 list calx2 xcor ycor ([pxcor] of patch-goal)([pycor] of patch-goal - 0.4) (-45) ([pycor] of patch-goal - 0.4)
set corner-2 list calx2 xcor ycor ([pxcor] of patch-goal)([pycor] of patch-goal - 0.4) ( 45) ([pycor] of patch-goal - 0.4)
]
当左边缘超过180,右边缘超过0时,问题才会出现。我没有考虑过这种情况。无论如何,上面的代码解决了这个问题。下面的三角法(由@JenB建议)非常有效:
to-report calx2 [x0 y0 x1 y1 A]
report x0 + (y1 - y0) * tan ( A + atan (x1 - x0) (y1 - y0))
end
to start
ask turtles[
set corner-1 list calx2 xcor ycor ([pxcor] of patch-goal)([pycor] of patch-goal - 0.4) (-45) ([pycor] of patch-goal - 0.4)
set corner-2 list calx2 xcor ycor ([pxcor] of patch-goal)([pycor] of patch-goal - 0.4) ( 45) ([pycor] of patch-goal - 0.4)
]
当左边缘超过180,右边缘超过0时,问题才会出现。我没有考虑过这种情况。无论如何,上面的代码解决了这个问题。您能解释一下为什么需要非三角解吗?顺便说一下,对于所有情况,A的计算方法都相同,x偏移的长度也是如此。您需要cases的唯一原因是决定是否从代理的xcor中添加或减去偏移量,您可以在计算结束时作为一个简单的“if”来完成。您能解释一下为什么需要非三角解吗?顺便说一下,对于所有情况,A的计算方法都相同,x偏移的长度也是如此。您需要cases的唯一原因是决定是否从代理的xcor中添加或减去偏移量,您可以在计算结束时作为一个简单的“if”来执行。例如,NetLogo中两条线相交的代码,请参见相交线示例和相交链接示例(在NetLogo模型库的代码示例部分)@Abhishek,但是,请注意,在您的情况下,其中一条线是水平的。这方面的数学比一般情况下的数学更简单,因此从一般公式开始可能不是解决方案的最简单途径。例如,NetLogo中两条线相交的代码,请参阅相交线示例和Inters