Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Netlogo 在视锥的另一端计算代理_Netlogo - Fatal编程技术网

Netlogo 在视锥的另一端计算代理

Netlogo 在视锥的另一端计算代理,netlogo,Netlogo,给定: 墙(灰剂)沿墙的顶部处于固定位置 世界 蓝色特工总是在正下方,但在不同的位置 距离。但他们可能会走到差距的一边,但是 可以旋转,使其面向间隙 所有蓝海龟的视锥角度都是一样的 在上图中,蓝色代理的视锥被描绘出来。我想计算出与视锥两端相接的灰墙,也就是说,一个在右边,一个在左边。我也可以计算出那个点的x坐标。不是灰色代理的坐标,因为这是一个近似值 计算: 在x坐标中,视觉锥的极值与灰海龟相交。或者它们相交的那些灰海龟 大致数字: 因此,我希望在下图中计算x_1和x_2。 一种方法可以像@


给定:

  • 墙(灰剂)沿墙的顶部处于固定位置 世界
  • 蓝色特工总是在正下方,但在不同的位置 距离。但他们可能会走到差距的一边,但是 可以旋转,使其面向间隙
  • 所有蓝海龟的视锥角度都是一样的
在上图中,蓝色代理的视锥被描绘出来。我想计算出与视锥两端相接的灰墙,也就是说,一个在右边,一个在左边。我也可以计算出那个点的x坐标。不是灰色代理的坐标,因为这是一个近似值

计算:

在x坐标中,视觉锥的极值与灰海龟相交。或者它们相交的那些灰海龟

大致数字:

因此,我希望在下图中计算x_1和x_2。 一种方法可以像@JenB所建议的那样,将其分成三种情况,并在每种情况下计算A(主要在左侧或右侧)。然后用三角法。我是对的。还有其他方法吗?

如果这是一个二维问题,那么它只是一个相交线的情况

我会避免使用多个案例;这很容易出错

你将有一条线描述你的海龟墙,两条线描述你的视野边界。您可以将这三条线中的每一条以参数形式表示为[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