Движение в непрерывном пространстве

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

Вызов функций движения агента

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

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

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

Определение текущих координат агента

double getX() - возвращает текущую X-координату агента.

double getY() - возвращает текущую Y-координату агента.

double getZ() - возвращает текущую Z-координату агента в 3D пространстве.

Определение координат цели

double getTargetX() - возвращает X-координату места назначения движения агента, если он движется, или его текущую X-координату, если нет.

double getTargetY() - возвращает Y-координату места назначения движения агента, если он движется, или его текущую Y-координату, если нет.

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

Расчет расстояния

double distanceTo(Agent other) - возвращает расстояние от этого агента до указанного агента other.

double distanceTo(double x, double y) - возвращает расстояние от этого агента до указанной точки (x, y) в пространстве.

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

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

Эти функции инициируют перемещение агента в место с заданными координатами. Движение будет производиться с определенной скоростью (которая при необходимости может быть изменена динамически). По прибытии будет выполнено действие агента При достижении точки назначения.

Агенты будут перемещаться по кратчайшему пути к место назначения, которое задается как точка с координатами (x, y, z) в непрерывном 2D или 3D пространстве:

void moveTo(double x, double y)

void moveTo(double x, double y, double z)

Вы можете задавать движение агента к какому-либо элементу модели, используя имя элемента как цель движения. Имеется три основных типа таких объектов:

void moveTo(Node node) - инициирует перемещение агента в заданный узел.
Параметр: node - узел, который может быть в сети

void moveTo(Attractor attractor) - инициирует перемещение агента в заданный аттрактор в узле.
Параметр: attractor - аттрактор

void moveToNearestAgent (Agent agents) - инициирует перемещение агента к ближайшему агенту из данной популяции. Прекращает какое-либо движение в этот момент.
Параметр: agents - популяция агентов

Мгновенное перемещение

Эти функции немедленно помещают агента в заданное место или узел в непрерывном 3D пространстве. Они прекращают любое движение и не вызывают действие При достижении точки назначения.

Эти параметры вам уже знакомы:

void jumpTo(double x, double y)

void jumpTo(double x, double y, double z)

void jumpTo(Node node)

Перемещение за заданное время

Следующие функции изменяют скорость агента так, чтобы он достигал цели за tripTime единиц модельного времени. вы знакомы со всеми параметрами, кроме tripTime - времени перемещения.

moveToInTime(Agent agent, double tripTime)

moveToInTime(double x, double y, double tripTime)

moveToInTime(double x, double y, double z, double tripTime)

moveToInTime(Node node, double tripTime)

moveToInTime(Attractor attractor, double tripTime)

moveToNearestAgent(Agent agents, double tripTime)

Каждая функция moveToInTime() имеет другую нотацию с еще одним аргументом: units. Используйте эту нотацию, когда хотите задать время перемещения в отличных от модельных единицах времени. Передайте одну из констант, задающих единицу измерения времени (к примеру, MINUTE, HOUR, DAY) в качестве значения аргумента. Предположим, что единицы модельного времени - секунды, а время перемещения 2 дня, поэтому проще будет написать truck.moveToInTime(city, 2, DAY), после чего агент truck начнет движение к городу city. Агенту truck понадобится 2 дня, чтобы добраться до города city.

moveToInTime(Agent agent, double tripTime, TimeUnits units)

moveToInTime(double x, double y, double tripTime, TimeUnits units) 

moveToInTime(double x, double y, double z, double tripTime, TimeUnits units)

moveToInTime(Node node, double tripTime, TimeUnits units)

moveToInTime(Attractor attractor, double tripTime, TimeUnits units)

moveToNearestAgent(Agent agents, double tripTime, TimeUnits units)

Дополнительные функции

boolean isMoving() - проверяет, движется ли агент в данный момент времени.

double timeToArrival() - если агент движется, то возвращает время (в единицах модельного времени), нужное ему для того, чтобы прибыть в место назначения, с учетом того, что скорость не изменится. Если агент не движется, возвращает 0.

double timeToArrival(TimeUnits units) - если агент движется, возвращает оставшееся время до приезда, при условии, что скорость не изменится. Если агент не движется, возвращает 0. Функция возвращает время в заданных константой единицах времени. Единицы измерения времени задаются аргументом функции units, который передает константу единиц измерения времени (к примеру, MINUTE, HOUR) в качестве значения аргумента. 

void stop() - останавливает агента (если он двигался); агент остается при этом в том же месте, и действие При достижении точки назначения не выполняется

Определение движения объектом библиотеки

Имеется еще один способ инициировать движение агентов: задать движение в свойствах объекта диаграммы процесса. Для этого обычно используются Блоки Библиотеки Моделирования Процессов.

Специальный объект Библиотеки моделирования процессов, который задает движение, называется MoveTo.

В эго свойствах вы можете выбрать, хотите ли вы, чтобы объект перемещался с определенной скоростью или хотите переместить его мгновенным "скачком" в место назначения (первый параметр блока, Агент). Параметр Место назначения здесь имеет несколько опций:


Как вы видите на картинке выше, если вы выбираете Узел сети в качестве места назначения, ниже появится параметр Узел сети, в котором вы можете задать узел, выбрав его из выпадающего списка или в графическом редакторе. Таким же образом, вы можете выбрать другие элементы, задающие цель движения.

Также вы можете задать нестандартную скорость движения агента, или время его перемещения, как при использовании функций moveToInTime().

Больше информации о параметрах этого объекта вы можете найти Справочном руководстве по библиотеке.

Обычно, работая с Библиотекой моделирования процессов, вы создаете сеть разметки пространства, чтобы задавать местоположение агентов. Сети могут также использоваться в движении агентов. В таком, часто местом назначения бывает узел сети. Маршруты движения агентов могут изменяться в зависимости от того, является ли узел частью сети.

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


См. также

Непрерывное пространство

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

Скорость движения агента

Поворот анимации агента

Действие при достижении точки назначения