ЭТО МОДИФИКАЦИЯ И ПЕРЕСТАНОВКА МОЕГО ПРЕДЫДУЩЕГО ОТВЕТА, КОТОРЫЙ ИМЕЕТ ОШИБКУ
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 стены для определения ее положения, помните, что пересечения будут происходить в середине стены, то есть в середине участка.
Надеюсь, это поможет, Чарльз