在视锥的另一端计算代理

时间:2015-01-02 15:20:41

标签: netlogo

Image1


enter image description here给定:

  • 墙壁(灰色剂)位于沿着顶部的恒定位置 世界。
  • 蓝色代理商总是直接在下面,但各种各样 距离。但是,尽管如此,他们仍然处于差距的一边 可以旋转,使它们面对间隙。
  • 所有蓝龟的视锥角相同。

在上图中,描绘了蓝色药剂的视锥。我希望计算出满足视锥末端的灰色墙壁,即右侧和左侧的灰色墙壁。我也可以以某种方式计算该点的X坐标。灰色代理的坐标不是近似值。

要计算:

视锥的极端与灰龟相交的x坐标。或者他们相交的那些灰龟。

粗略图:

所以我希望在下图中计算x_1和x_2。 一种方法可以由@JenB建议将其分为三种情况并在每种情况下计算A.(主要在左侧或右侧)。然后使用三角学。我是对的。还有其他方法吗? enter image description here

3 个答案:

答案 0 :(得分:2)

如果这是一个2D问题,那只是一个相交线的情况。

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

您将有一条线描述您的海龟墙,以及描述您的FOV边界的两条线。您可以将这三条线中的每条线以参数形式表示为[ox,oy] + [vx,vy] * s,这是一个固定点[ox,oy]加上由s缩放的法线向量[vx,vy]。 / p>

海龟的墙只定义为's'的某个领域;让我们说wall.s = [0到0.4,和0.6到1]

的域

我将描述如何找到交叉点,但参数化2D线的交叉点是相当标准的票价,并且在PDF中更好地显示,所以我将引用你这个...... http://www.ahinson.com/algorithms_general/Sections/Geometry/ParametricLineIntersection.pdf (记住永远不要除以零)

一旦你知道了尺度参数'left.wall.s'和'right.wall.s'的值,就可以判断龟墙的域是否在玩家的视野范围内。您也可以通过插回参数线公式来确定交点。

答案 1 :(得分:2)

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

样本结果:
sample

当然,通过公式直接计算答案实际上在计算上会更有效率。 (最后有一个可选的舍入步骤,取决于你是否需要一个点或补丁。)但是这段代码显示了如何在不进行任何棘手的数学运算的情况下完成它。

答案 2 :(得分:1)

以下三角学方法(由@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时,问题就出现了。我没有考虑这种情况。无论如何,上面的代码解决了这个问题。