Поворот вектора, обозначающего положение черепахи, на угол Netlogo

Я устанавливаю/обновляю положение каждой черепахи следующим образом:

 set xcor xcor + item 0 vector
 set ycor ycor + item 0 vector

Поэтому я добавляю вектор к координатам текущего агента.

ПРОБЛЕМА: я хочу повернуть добавленный вектор на угол x. Таким образом, вектор "вектор" должен быть повернут на угол x. Угол следует брать из распределения Гаусса с заданным отклонением.

Я пытаюсь добиться чего-то похожего на модель Кузена. http://www.csim.scu.edu.tw/~chiang/course/ComputerGameAdvance/Collective%20Memory%20and%20Spatial%20Sorting%20in%20Animal%20Groups.pdf

Заранее спасибо!


person Abhishek Bhatia    schedule 14.08.2014    source источник


Ответы (3)


Кажется, у вас есть два вопроса здесь; Я обращусь к тому, что вы использовали для названия. Расширение матрицы позволяет умножать матрицы, поэтому вы можете просто создать стандартную матрицу вращения, когда у вас есть угол вращения. Но стандартный совет в NetLogo — использовать более ориентированный на черепаху подход. Затем вам нужно решить, следует ли использовать условные обозначения заголовков NetLogo (0 градусов для севера, 90 градусов для востока и т. д.). Если это так, вы можете сделать что-то вроде этого:

to move [#dx #dy]
  let %dist 0
  ask patch 0 0 [set %dist distancexy #dx #dy]
  facexy (xcor + #dx) (ycor + dy)
  let %theta random-rotation
  rt %theta
  jump %dist
end

to-report random-rotation
  report (random-float 360) - 180
end

Здесь случайное вращение не распределено по Гауссу, потому что я не был уверен, что вы имели в виду. Возможно, распределение фон Мизеса? В любом случае стоит уточнить и задать как отдельный вопрос.

person Alan    schedule 14.08.2014
comment
Спасибо! Чтобы было понятнее, я хочу просто повернуть вектор на угол. Как бы я это сделал? Я не согласен с вашим подходом, поскольку он включает в себя черепаший заголовок, который является последовательным. Распределение Гаусса в netlogo реализовано случайно-нормальным. - person Abhishek Bhatia; 14.08.2014
comment
Я предполагаю, что вы имели в виду вектор элемента 0 и вектор элемента 1. Вы можете использовать первый вектор и последний вектор, чтобы избежать этой ошибки в будущем. - person TurtleZero; 14.08.2014
comment
1. TurtleZero хотел прокомментировать вопрос, а не этот ответ. 2. Да у NetLogo есть random-normal, но ковырять с ним ротацию особого смысла нет (поскольку значения не ограничены). Вот почему я предположил, что, возможно, требуется распределение фон Мизеса. Или завернутый нормальный. - person Alan; 14.08.2014

Несколько просто: преобразовать вектор в угол, повернуть (рандомизировать), а затем преобразовать обратно. Для хорошего стиля кодирования и тому подобного разбивайте на модули.

to-report rotate [ #vector #angle ]
   let $dx first #vector
   let $dy last #vector
   let $magnitude sqrt ($dx * $dx + $dy * $dy)
   set #angle #angle + atan first #vector last #vector
   report (list $magnitude * sin #angle $magnitude * cos #angle)
end

to-report nudge-vector [ #vector #std-dev ]
   report rotate #vector random-normal 0 #std-dev
end

to move-inaccurately [ #vector #std-deviation ]
   set #vector nudge-vector #vector #std-deviation  
   setxy (xcor + first #vector) (ycor + last #vector)
end
person TurtleZero    schedule 14.08.2014

Просто чтобы подчеркнуть точку зрения Алана: если у вас нет веских причин для использования векторов, обычно гораздо проще и понятнее избегать их в NetLogo. Если все, что вы хотите сделать, это повернуть черепаху на случайную величину, полученную из распределения Гаусса, вы можете просто сделать:

right-turn random-normal 0 <std-dev>

где <std-dev> — желаемое стандартное отклонение. Затем вы можете сказать черепахе двигаться вперед на величину вектора: forward <distance>.

Если вам абсолютно необходимо выполнить вращение вектора, вы можете сделать это без расширения матрицы довольно легко:

to-report rotate-vector [ vec angle ]
  let x first vec
  let y last vec
  let mag sqrt (x * x + y * y)
  let old-angle atan x y
  let new-angle angle + old-angle
  report (list (mag * sin new-angle) (mag * cos new-angle))
end

Помните, что углы в NetLogo перевернуты примерно на 45º, так что 0º соответствует северу, а 90º — востоку; таким образом, sin и cos переворачиваются при работе с углами.

person Bryan Head    schedule 14.08.2014