如何使用两条相交线的概念在Netlogo中实现障碍物规避(海龟头与由补丁构成的墙)

如何使用两条相交线的概念在Netlogo中实现障碍物规避(海龟头与由补丁构成的墙),netlogo,Netlogo,我们如何将Netlogo海龟的标题转换为直线方程(y=mx+c),以便将其与另一直线方程(例如表示墙的面片)进行比较 我需要把海龟的头部转换成直线方程。然后将标题线方程与墙的线方程进行比较(墙具有固定的x或y,具体取决于墙是垂直还是水平) 库中有一个截取行示例代码(我不太理解),它使用移动段。我想我想要的是更简单一点。也许更好的起点是我在其中一个论坛上找到的下面的代码 报告计算线[x y角度] 让我来谈一谈角度 让我 让B-1 设C(-m*x+y) 报告(列表A、B、C) 结束 为了“读取”当前

我们如何将Netlogo海龟的标题转换为直线方程(y=mx+c),以便将其与另一直线方程(例如表示墙的面片)进行比较

我需要把海龟的头部转换成直线方程。然后将标题线方程与墙的线方程进行比较(墙具有固定的x或y,具体取决于墙是垂直还是水平) 库中有一个截取行示例代码(我不太理解),它使用移动段。我想我想要的是更简单一点。也许更好的起点是我在其中一个论坛上找到的下面的代码

报告计算线[x y角度]
让我来谈一谈角度
让我
让B-1
设C(-m*x+y)
报告(列表A、B、C)
结束

为了“读取”当前海龟头部的x和y值并将其输入方程式,必须做些什么?类似地,如何将一组已着色以表示墙的面片转换为线方程,用于检查可能的交点(在标题线方程和墙线方程之间)? 例如,我使用下面的代码创建了一条灰色面片的线/段来表示墙 如果它是直的,一定有办法把它转换成一个直线方程(它会 一个固定的y值-因此我只需根据海龟头部的直线方程“测试”x值。(在模拟环境中,总共有4堵墙-2堵垂直墙和2堵水平墙)

使用[abs pycor=10][set pcolor grey]询问修补程序

用[abs pycor=11][set pcolor grey]
询问补片,
计算线的参数中的
x
y
指海龟的当前位置,以及
角度
海龟当前航向与x轴之间的角度,以零“东”逆时针测量我不知道为什么会有
B
,它被简单地设置并返回为-1,所以更简单的版本会是

to-report calculate-line [x y angle]
  let m tan angle  ; the slope
  let c y - m * x   ; the constant
  report (list m c)
end
然而,NetLogo测量海龟的
航向
是从垂直轴顺时针方向,零“北”,所以我们需要在确定其角度之前调整航向。最简单的方法是将航向增加90度,顺时针旋转所有东西,因为这会使海龟移动(比如说)NE移动SE,因此反转坡度符号,我们需要取结果的负数。最后,如果让海龟自己确定直线,它只需填写自己的位置和航向

然后我们就以

to-report calculate-line
  ; We need to remember that NetLogo measures 
  ; heading from the vertical axis, while the
  ; tan function assumes an angle measured from
  ; the horizontal axis. Thus we rotate the
  ; heading 90 degrees before taking the tan.
  ; also we deal separately with headings of 
  ; 0 and 180, where the slope is "infinite",
  ; and headings of 90 and 270, where the slope
  ; is zero.
  let m 0
  (ifelse (heading mod 180 = 0) [set m 10e16] ; m is "infinite"
  (heading mod 90 = 0) [set m 0]
  [set m (- tan (heading + 90))])
  let c ycor - m * xcor
  report (list m c)
end

ask one-of turtles [show calculate-line]
通过这种方式,海龟填写自己的坐标和航向。请注意,我们将沿轴线的航向视为特例,并使和“无限”(垂直)坡度非常大


如果你有四个墙,你需要小心地测试,这条线不与一个垂直于它的界限的墙相交。而且,如果你用墙的PXCOR和Pycor来定义它的位置,记住十字路口会出现在墙的中间,也就是说,在斑块的中间。太多了!现在计算线更有意义了。下一个挑战是用可用的墙创建线方程。墙(形成平方面积)确实有固定的坐标,但有垂直或水平表示门或通道的“间隙”。我必须找到一种方法,为墙壁的每个部分建立一个方程式,每次将计算线标题与墙壁的进行比较,以检查交点。我假设所有的线方程式必须放在某个列表中r设置。正确吗?(我对Netlogo非常陌生)或者我应该创造出具有墙特征的海龟,因为如果我使用面片,我将不得不使用pxcor等作为线方程,而不是xcor——当比较两条线的交点时,我最可能需要xcor。不确定什么是解决这个难题的正确方法。如果墙有固定的e> pycor
,则它是一条水平线,因此斜率为零。它的方程简单地是
y=10+0*x
,或
y=10
。类似地,x=10的垂直墙会有一个“无限”斜率,方程
x=10
m
是墙的斜率,而不是墙的头。所有数字都是实数NetLogo中的(十进制)数字。有些,如面片坐标,仅采用整数值。NetLogo中没有整数算法。涉及整数值的计算仍然以实数计算(例如,3/2=1.5)此外,如果一堵墙的pxcor=11,你可以指定左边的方程是x=10.5,右边的方程是x=11.5。现在海龟也有一个大小和形状,所以如果你想在海龟的边缘和墙的边缘之间发生碰撞,那么它是b根据海龟的形状,生态系统要复杂一些。