В непрерывном пространстве есть возможность изменять местоположение агента и получать информацию о его текущем местоположении, перемещать агента с заданной скоростью из одного места в другое, выполнять действия по его прибытии в место назначения, рисовать анимацию (статического или движущегося) агента. Часть функциональности непрерывного пространства даже не требует того, чтобы агенты принадлежали явно заданной среде — если среда не указана, то пространства по умолчанию будет считаться непрерывным.
Тип агента имеет богатый 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(Agent other, LengthUnits units) Возвращает расстояние от этого агента до указанного агента other в заданных единицах измерения. double distanceTo(Point point) Возвращает расстояние от этого агента до указанной точки. double distanceTo(Point point, LengthUnits units) Возвращает расстояние от этого агента до указанной точки в заданных единицах измерения. double distanceTo(double x, double y) Возвращает расстояние от этого агента до указанной точки (x, y) в пространстве. double distanceTo(double x, double y, LengthUnits units) Возвращает расстояние от этого агента до указанной точки (x, y) в непрерывном 3D пространстве в заданных единицах измерения. double distanceTo(level level, double x, double y) Возвращает расстояние от этого агента до указанной точки за указанном уровне. double distanceTo(Level level, double x, double y, LengthUnits units) Возвращает расстояние от этого агента до указанной точки на указанном уровне в заданных единицах измерения. 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(double x, double y) Начинает перемещение агента в место с заданными координатами.
x, y — X, Y-координаты местоположенияvoid moveToStraight(double x, double y) Начинает перемещение агента по прямой (без учета существующих сетей или маршрутов) в место с заданными координатами.
x, y — X, Y-координаты местоположенияvoid moveTo(double x, double y, double z) Инициирует перемещение агента в место с заданными координатами.
x, y, z — X, Y, Z-координаты местоположенияvoid moveToStraight(double x, double y, double z) Инициирует перемещение агента по прямой (без учета существующих сетей или маршрутов) в место с заданными координатами.
x, y, z — X, Y, Z-координаты местоположенияvoid moveTo(Agent agent) Инициирует перемещение агента к другому агенту.
agent — другой агентvoid moveStraightTo(Agent agent) Инициирует перемещение агента по прямой (без учета существующих сетей или маршрутов) к другому агенту.
agent — другой агентvoid moveTo(Point location) Инициирует перемещение агента к заданной точке.
location — место назначенияvoid moveToStraight(Point location) Инициирует перемещение агента по прямой (без учета существующих сетей или маршрутов) к заданному местоположению.
location — место назначенияvoid moveTo(INode node) Инициирует перемещение агента в заданный узел.
node — узел сетиvoid moveTo(INode node, Point location) Инициирует перемещение агента в заданную точку внутри указанного узла.
node — узел сети
location — (дополнительно) местоположение внутри узла, может быть nullvoid moveTo(Attractor attractor) Инициирует перемещение агента в заданный аттрактор.
attractor — аттракторvoid moveToNearestAgent(java.lang.Iterable 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)
- Перемещение за указанное время
-
Все приведенные в этом разделе функции изменяют скорость агента так, чтобы достичь цели за заданное время (не позже и не раньше). При достижении точки назначения вызывается Действие при достижении места назначения.
Функция Описание void moveToInTime(double x, double y, double tripTime) Инициирует перемещение агента в точку с заданными координатами. Изменяет скорость агента так, чтобы достичь цели за tripTime единиц модельного времени.
x, y — X-, Y-координаты местоположения
tripTime — время перемещения, в единицах модельного времениvoid moveToInTime(double x, double y, double tripTime, TimeUnits units) Инициирует перемещение агента в точку с заданными координатами. Изменяет скорость агента так, чтобы достичь цели за tripTime единиц времени.
x — X-координата местоположения. В случае ГИС пространства это широта, измеренная в градусах (-90 ... (Юг) ... 0 ... (Север) ... +90).
y — Y-координата местоположения. В случае ГИС пространства это долгота, измеренная в градусах (-180 ... (Запад) ... 0 ... (Восток) ... +180).
tripTime — время перемещения, в заданных единицах
units — константа, задающая единицы измерения времениvoid moveToInTime(double x, double y, double z, double tripTime) Инициирует перемещение агента в место с заданными координатами. Изменяет скорость агента так, чтобы достичь цели за tripTime единиц модельного времени.
x, y, z: X-, Y-, Z- координаты местоположения
tripTime — время перемещения, в единицах модельного времениvoid moveToInTime(double x, double y, double z, double tripTime, TimeUnits units) Инициирует перемещение агента в место с заданными координатами. Изменяет скорость агента так, чтобы достичь цели за tripTime единиц времени.
x, y, z: X-, Y-, Z- координаты местоположения
tripTime — время перемещения, в заданных единицах
units — константа, задающая единицы измерения времениvoid moveToInTime(Agent agent, double tripTime) Инициирует перемещение агента к другому агенту. Изменяет скорость агента так, чтобы достичь цели за tripTime единиц модельного времени.
agent — другой агент
tripTime — время перемещения, в единицах модельного времениvoid moveToInTime(Agent agent, double tripTime, TimeUnits units) Инициирует перемещение агента к другому агенту. Изменяет скорость агента так, чтобы достичь цели за tripTime единиц времени.
agent — другой агент
tripTime — время перемещения, в заданных единицах
units — константа, задающая единицы измерения времениvoid moveToInTime(Attractor attractor, double tripTime) Инициирует перемещение агента в заданный аттрактор. Изменяет скорость агента так, чтобы достичь цели за tripTime единиц модельного времени.
attractor — аттрактор
tripTime — время перемещения, в единицах модельного времениvoid moveToInTime(Attractor attractor, double tripTime, TimeUnits units) Инициирует перемещение агента в заданный аттрактор. Изменяет скорость агента так, чтобы достичь цели за tripTime единиц времени.
attractor — аттрактор
tripTime — время перемещения, в заданных единицах
units — константа, задающая единицы измерения времениvoid moveToInTime(INode node, double tripTime) Инициирует перемещение агента в заданный узел. Изменяет скорость агента так, чтобы достичь цели за tripTime единиц модельного времени.
node — узел
tripTime — время перемещения, в единицах модельного времениvoid moveToInTime(INode node, double tripTime, TimeUnits units) Инициирует перемещение агента в заданный узел. Изменяет скорость агента так, чтобы достичь цели за tripTime единиц времени.
node — узел
tripTime — время перемещения, в заданных единицах
units — константа, задающая единицы измерения времениvoid moveToInTime(INode node, Point location, double tripTime) Инициирует перемещение агента в заданную точку внутри указанного узла. Изменяет скорость агента так, чтобы достичь цели за tripTime единиц модельного времени.
node — узел
location — место внутри узла, может быть null
tripTime — время перемещения, в единицах модельного времениvoid moveToInTime(INode node, Point location, double tripTime, TimeUnits units) Инициирует перемещение агента в заданную точку внутри указанного узла. Изменяет скорость агента так, чтобы достичь цели за tripTime единиц времени.
node — узел
location — место внутри узла, может быть null
tripTime — время перемещения, в заданных единицах
units — константа, задающая единицы измерения времениvoid moveToInTime(Point location, double tripTime) Инициирует перемещение агента в направлении заданного местоположения. Изменяет скорость агента так, чтобы достичь цели за tripTime единиц модельного времени.
location — место назначения
tripTime — время перемещения, в единицах модельного времениvoid moveToInTime(Point location, double tripTime, TimeUnits units) Инициирует перемещение агента в направлении заданного местоположения. Изменяет скорость агента так, чтобы достичь цели за tripTime единиц времени.
location — место назначения
tripTime — время перемещения, в заданных единицах
units — константа, задающая единицы измерения времениvoid moveToNearestAgent (java.lang.Iterable agents, double tripTime) Инициирует перемещение агента к ближайшему агенту из данной коллекции (или популяции агентов). Прекращает какое-либо движение в этот момент. Изменяет скорость агента так, чтобы достичь цели за tripTime единиц модельного времени.
agents — коллекция (или популяция) агентов
tripTime — время перемещенияvoid moveToStraightInTime(double x, double y, double z, double tripTime) Инициирует перемещение агента по прямой (без учета существующих сетей или маршрутов) в место с заданными координатами. Изменяет скорость агента так, чтобы достичь цели за tripTime единиц модельного времени.
x, y, z: X-, Y-, Z- координаты местоположения
tripTime — время перемещения, в единицах модельного времениvoid moveToStraightInTime(double x, double y, double z, double tripTime, TimeUnits units) Инициирует перемещение агента по прямой (без учета существующих сетей или маршрутов) в место с заданными координатами. Изменяет скорость агента так, чтобы достичь цели за tripTime единиц времени.
x, y, z: X-, Y-, Z- координаты местоположения
tripTime — время перемещения, в заданных единицах
units — константа, задающая единицы измерения времениvoid moveToStraightInTime(Point location, double tripTime) Инициирует перемещение агента по прямой (без учета существующих сетей или маршрутов) в направлении заданного местоположения. Изменяет скорость агента так, чтобы достичь цели за tripTime единиц модельного времени.
location — место назначения
tripTime — время перемещения, в единицах модельного времениvoid moveToStraightInTime(Point location, double tripTime, TimeUnits units) Инициирует перемещение агента по прямой (без учета существующих сетей или маршрутов) в направлении заданного местоположения. Изменяет скорость агента так, чтобы достичь цели за tripTime единиц времени.
location — место назначения
tripTime — время перемещения, в заданных единицах
units — константа, задающая единицы измерения времени
Функция | Описание |
---|---|
boolean isMoving() | Проверяет, движется ли агент в данный момент времени. |
double timeToArrival() | Если агент движется, то возвращает время (в единицах модельного времени), нужное ему для того, чтобы прибыть в место назначения, с учетом того, что скорость не изменится. Если агент не движется, возвращает 0. |
double timeToArrival(TimeUnits units) | Если агент движется, возвращает оставшееся время до приезда, при условии, что скорость не изменится. Если агент не движется, возвращает 0. Функция возвращает время в заданных константой единицах времени. Единицы измерения времени задаются аргументом функции units, который передает константу единиц измерения времени (к примеру, MINUTE, HOUR) в качестве значения аргумента. |
void stop() | Останавливает агента (если он двигался); агент остается при этом в том же месте, и действие При достижении точки назначения не выполняется |
Имеется еще один способ инициировать движение агентов: задать движение в свойствах объекта диаграммы процесса. Для этого обычно используются Блоки Библиотеки Моделирования Процессов.
Специальный объект Библиотеки моделирования процессов, который задает движение, называется MoveTo.
В его свойствах вы можете выбрать, хотите ли вы, чтобы объект перемещался с определенной скоростью или хотите переместить его мгновенным "скачком" в место назначения (первый параметр блока, Агент). Параметр Место назначения здесь имеет несколько опций:
Как вы видите на картинке выше, если вы выбираете Узел сети в качестве места назначения, ниже появится параметр Узел сети, в котором вы можете задать узел, выбрав его из выпадающего списка или в графическом редакторе. Таким же образом, вы можете выбрать другие элементы, задающие цель движения.
Также вы можете задать нестандартную скорость движения агента, или время его перемещения, как при использовании функций moveToInTime().
Больше информации о параметрах этого объекта вы можете найти в Справочном руководстве по библиотеке.
Обычно, работая с Библиотекой моделирования процессов, вы создаете сеть разметки пространства, чтобы задавать местоположение агентов. Сети могут также использоваться в движении агентов. В таком, часто местом назначения бывает узел сети. Маршруты движения агентов могут изменяться в зависимости от того, является ли узел частью сети.
Кроме того, вы можете задавать конкретное положение внутри узла с помощью аттракторов, или использовать сам аттрактор в качестве места назначения.
-
Как мы можем улучшить эту статью?
-