Как реализовать предотвращение препятствий в Netlo go, используя концепцию двух пересекающихся линий (заголовок черепахи против стены из заплат) - PullRequest
1 голос
/ 12 марта 2020

Как мы можем преобразовать заголовок черепахи Netlo go в линейное уравнение (y = mx + c), чтобы его можно было сравнить с другим линейным уравнением (например, с участками, представляющими стену) ?

Мне нужно преобразовать заголовок черепахи в линейное уравнение. Затем сравните уравнение линии заголовка с уравнением линии стены (которое будет иметь либо фиксированный x, либо фиксированный y - в зависимости от того, вертикальная или горизонтальная стена). В библиотеке есть пример кода для линий перехвата (который я надеваю не понимаю, что хорошо), который использует движущиеся сегменты. Я думаю, что я после немного проще. Возможно, лучшей отправной точкой будет приведенный ниже код, который я нашел на одном из форумов.

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

Что необходимо сделать, чтобы «прочитать» значения x и y курс текущей черепахи и ввести их в уравнения? Аналогично, как можно преобразовать набор участков, окрашенных для представления стены, в уравнение линии, которое будет использоваться для проверки возможного пересечения (между уравнением линии заголовка и уравнением линии стены)? Например, я создал линию / сегмент серых пятен, используя приведенный ниже код для представления стены, и учитывая, что она прямая, должен быть способ преобразовать это в уравнение линии (которое будет иметь фиксированное значение y - так, чтобы я нужно только «проверить» значение x по уравнению линии курса черепахи. (В моделируемой среде всего 4 стены - 2 вертикальные и 2 горизонтальные)

ask patches with [abs pycor = 10] [set pcolor grey] ask patches with [abs pycor = 11] [set pcolor grey]

Большое спасибо заранее за любую помощь / предложения

1 Ответ

2 голосов
/ 12 марта 2020

ЭТО МОДИФИКАЦИЯ И ПЕРЕСТАНОВКА МОЕГО ПРЕДЫДУЩЕГО ОТВЕТА, КОТОРЫЙ ИМЕЕТ ОШИБКУ

x и y в аргументах calculate-line относятся к текущему положению черепахи, и angle угол между текущим направлением черепахи и осью 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

и будет вызываться черепахой. Тем не менее, NetLo go измеряет heading черепахи по часовой стрелке от вертикальной оси с нулевым «севером», поэтому нам нужно отрегулировать направление перед тем, как брать его угол. Самый простой способ сделать это - добавить 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 стены для определения ее положения, помните, что пересечения будут происходить в середине стены, то есть в середине участка.

Надеюсь, это поможет, Чарльз

...