AnyLogic
Развернуть
Размер шрифта

Движение агента

Вы можете переместить агента в новое местоположение вызовом одной из его многочисленных функций передвижения.

Движение в непрерывном пространстве имеет наибольшее количество функций. Также имеются специальные функции, задающие движение в пространстве ГИС и дискретном пространстве.

Свои особенности имеет движение агентов в сети и вне сети.

Вы можете задать начальную скорость, поворот фигуры анимации агента, а также реакцию агента на достижение места назначения.

Функции

Во-первых, существуют функции, чтобы получать информацию о текущем местоположении (эти функции работают и при движении агента). Кроме того, имеется набор функций для перемещения агента и получения соответствующей информации.

Функции moveTo() и moveToInTime() имеют несколько нотаций, позволяя задавать местоположение цели различными способами.

Вы можете задать местоположение как:

  • X, Y координаты: moveTo(double x, double y)
  • X, Y, Z координаты: moveTo(double x, double y, double z)
  • Точку: moveTo(Point location)
  • Аттрактор: moveTo(Attractor attractor)
  • Узел сети: moveTo(Node node)
  • Узел сети и место внутри узла — точку (x,y,z): moveTo(Node node, Point location)
Задание начального местоположения при запуске модели
Функция Описание
void setXY(double x, double y) Задает координаты местоположения агента. Должен использоваться только для начальной расстановки агентов. Подразумевает, что агент не движется.

x — X-координата местоположения
y — Y-координата местоположения
Определение текущего местоположения
Функция Описание
double getX() Возвращает текущую X-координату агента в непрерывном пространстве.
double getY() Возвращает текущую Y-координату агента в непрерывном пространстве.
double getZ() Возвращает текущую Z-координату агента в непрерывном пространстве.
Position getPosition() Возвращает текущие X- и Y-координаты (и Z-координату также, в случае 3D пространства) и угол поворота агента в непрерывном пространстве.
Задание движения агента
Функция Описание
void moveTo(double x, double y) Инициирует перемещение агента в место с заданными координатами в непрерывном 3D пространстве.

x — X-координата местоположения
y — Y-координата местоположения
void moveTo(double x, double y, double z) Инициирует перемещение агента в место с заданными координатами в непрерывном 3D пространстве.

x — X-координата местоположения
y — Y-координата местоположения
z — Z-координата местоположения
void moveTo(Point location) Инициирует перемещение агента в направлении заданного местоположения в непрерывном 3D пространстве.

location — место назначения
void moveTo(Node node, Point location) Инициирует перемещение агента в заданный узел сети.

node — узел сети.
location — (дополнительно) местоположение внутри узла, может быть null
void moveTo(Attractor attractor) Инициирует перемещение агента в заданный аттрактор.

attractor — аттрактор
void moveToNearestAgent(java.lang.Iterable agents) Инициирует перемещение агента к ближайшему агенту из данной коллекции. Прекращает какое-либо движение в этот момент.

agents — коллекция агентов
boolean isMoving() Проверяет, движется ли агент в текущий момент в непрерывном 3D пространстве. Возвращает true, если агент движется; в противном случае возвращает false.
double timeToArrival() Если агент движется, то возвращает время (в единицах модельного времени), нужное ему для того, чтобы прибыть в место назначения, с учетом того, что скорость не изменится. Если агент не движется, возвращает 0.
void stop() Останавливает агента (если он двигался); агент остается при этом в том же месте, и Действие при достижении места назначения не выполняется.
Перемещение за указанное время
Функция Описание
void moveToInTime(Point location, double tripTime) Инициирует перемещение агента в направлении заданного местоположения. Изменяет скорость агента так, чтобы достичь цели за tripTime единиц модельного времени.

location — место назначения
tripTime — время перемещения
void moveToNearestAgent (java.lang.Iterable agents, double tripTime) Инициирует перемещение агента к ближайшему агенту из данной коллекции. Прекращает какое-либо движение в этот момент. Изменяет скорость агента так, чтобы достичь цели за tripTime единиц модельного времени.

agents — коллекция агентов
tripTime — время перемещения
void moveToInTime(double x, double y, double tripTime) Инициирует перемещение агента в место с заданными координатами в непрерывном 3D пространстве. Изменяет скорость агента так, чтобы достичь цели за tripTime единиц модельного времени.

x — X-координата местоположения
y — Y-координата местоположения
tripTime — время перемещения
void moveToInTime(double x, double y, double z, double tripTime) Инициирует перемещение агента в место с заданными координатами в непрерывном 3D пространстве. Изменяет скорость агента так, чтобы достичь цели за tripTime единиц модельного времени.

x, y, z: X-, Y-, Z- координаты местоположения
tripTime — время перемещения
void moveToInTime(Node node, Point location, double tripTime) Инициирует перемещение агента в заданный узел сети. Изменяет скорость агента так, чтобы достичь цели за tripTime единиц модельного времени.

node — узел сети.
location — (дополнительно) место внутри узла, может быть null
tripTime — время перемещения
void moveToInTime(Attractor attractor, double tripTime) Инициирует перемещение агента в заданный аттрактор. Изменяет скорость агента так, чтобы достичь цели за tripTime единиц модельного времени.

attractor — аттрактор
tripTime — время перемещения
Мгновенное перемещение ("скачком")
Функция Описание
void jumpTo(double x, double y) Немедленно помещает агента в заданное место в непрерывном 3D пространстве. Прекращает любое движение. Не вызывает Действие при достижении места назначения.

x — X-координата нового местоположения
y — Y-координата нового местоположения
void jumpTo(double x, double y, double z) Немедленно помещает агента в заданное место в непрерывном 3D пространстве. Прекращает любое движение. Не вызывает Действие при достижении места назначения.

x — X-координата нового местоположения
y — Y-координата нового местоположения
z — Z-координата нового местоположения
void jumpTo(Node node, Point location) Немедленно помещает агента в заданный узел сети в непрерывном 3D пространстве. Прекращает любое движение. Не вызывает Действие при достижении места назначения.

node — узел сети
location — новое местоположение
void jumpTo(Point location) Немедленно помещает агента в заданное место в непрерывном 3D пространстве. Прекращает любое движение. Не вызывает Действие при достижении места назначения.

location — новое местоположение
Получение координат цели движения
Функция Описание
double getTargetX() Возвращает X-координату места назначения движения агента, если он движется, или его текущую X-координату, если нет.
double getTargetY() Возвращает Y-координату места назначения движения агента, если он движется, или его текущую Y-координату, если нет.

double getTargetZ()

Возвращает Z-координату места назначения движения агента, если он движется, или его текущую Z-координату, если нет.

Определение расстояния
Функция Описание
double distanceTo(Agent other) Возвращает расстояние от текущего до указанного агента в непрерывном 3D пространстве.

other — другой агент
double distanceTo(double x, double y) Возвращает расстояние от данного агента до заданной точки в непрерывном 3D пространстве.

x — X-координата точки
y — Y-координата точки
double distanceTo(double x, double y, double z) Возвращает расстояние от данного агента до заданной точки (x, y, z) в непрерывном 3D пространстве.

x — X-координата точки
y — Y-координата точки
z — Z-координата точки
double distanceTo(Point p) Возвращает расстояние от данного агента до заданной точки в непрерывном 3D пространстве.

p — точка
Определение и задание скорости
Функция Описание
double getSpeed() Возвращает скорость агента (скорость является параметром агента, это та скорость, с которой он обычно передвигается, и ненулевая скорость еще не означает, что этот агент движется в данный момент времени)
void setSpeed(double v) Задает скорость (в пикселях в секунду), с которой агент будет передвигаться. Если на момент вызова метода агент движется, то он продолжит движение с новой скоростью. Если агент не движется, то он не начнет движение, пока вы не вызовете метод moveTo().

v — новая скорость
Определение и задание поворота
Функция Описание
double getRotation() Возвращает текущий угол горизонтального вращения агента в непрерывном трехмерном или ГИС-пространстве (измеряется относительно точки координат 1.0 по часовой стрелке; т.е. нулевому углу соответствует положение часовой стрелки, показывающей на три часа). Значение возвращается в радианах.
Вы можете отключить автоматическое вращение агента в его свойствах (для этого отключите опцию Поворачивать анимацию согласно направлению движения) или с помощью функции setAutomaticHorizontalRotation(). Если автоматическое вращение активно, то агент вращается автоматически при начале движения, а также при поворотах внутри непрерывного трехмерного или ГИС-пространства.
Чтобы повернуть агента вручную, используйте функцию setRotation().
void setRotation(double rotation) Задает угол поворота анимации агента (в радианах, по часовой стрелке). Этот угол поворота будет переопределен при следующем вызове метода moveTo().

rotation — угол поворота анимации агента (в радианах)
void setAutomaticHorizontalRotation(boolean yes) Заставляет агента автоматически вращаться во время перемещений. Если yes — true, то агент будет вращаться во время движения, если же false — вращение не происходит.
boolean isAutomaticHorizontalRotation() Возвращает true, если агент настроен вращаться во время движения, в противном случае возвращает false.
void setVerticalRotation(double rotation) Устанавливает вертикальный поворот (угол в радианах) вдоль оси Z анимации агента в 3D пространстве. В зависимости от настроек автоматического вращения, этот поворот может быть отменен во время следующего вызова moveTo() или во время следующего движения вдоль пути/ломаной.

rotation — угол вертикального поворота агента в радианах
double getVerticalRotation() Возвращает текущий угол поворота агента вокруг оси Y в радианах в 3D пространстве. Если установлен режим автоматического вертикального вращения, поворот меняется каждый раз, когда агент начинает движение, а также меняется много раз, пока агент движется вдоль ломаной.
void setAutomaticVerticalRotation(boolean yes) Заставляет агента автоматически вращаться (вертикально, вдоль оси Z) во время движения в 3D пространстве. Если yes — true, то агент будет вращаться во время движения (например, коробка, которая едет по конвейеру),а если false — поворот не меняется (например, пешеход перемещается на уровень выше)
boolean isAutomaticVerticalRotation() Возвращает true, если агент должен вращаться (вертикально, вдоль оси Z) во время движения в 3D пространстве, в противном случае возвращает false.

Также существуют специфические функции для движения в дискретном пространстве и пространстве ГИС.

Чтобы задать начальную скорость и угол поворота агента

  1. Откройте панель Свойства типа агента, щелкнув по нему мышью в панели Проекты.
  2. Откройте секцию свойств Размеры и движение.
  3. Укажите начальную скорость агентов этого типа в поле Начальная скорость (в метрах в секунду).
  4. Если вы хотите вращать фигуру анимации по направлению движения, поставьте флажки в опциях ниже.

Чтобы задать действие, которое должно выполняться при достижении агентом точки назначения (после того, как выполнится метод moveTo())

  1. Откройте секцию свойств типа агента Действия агента.
  2. Впишите код Java, задающий действие в поле При достижении точки назначения.

Хотя AnyLogic напрямую поддерживает движение на постоянной скорости и при нулевом ускорении, вы можете смоделировать ускорение/торможение, изменяя скорость в подходящие моменты времени. Вы можете использовать диаграмму состояний с таким состояниями как Статический, Медленный, Средний, Быстрый и т.д. и переходы по таймауту, чтобы управлять движением.

Как мы можем улучшить эту статью?