Задание топологии железнодорожного узла

Железнодорожный узел (это может быть сортировочная станция, пути погрузки/разгрузки и т.д.) состоит из объектов двух типов: путей и стрелок. Чтобы задать топологию железнодорожного узла, Вы должны создать группу фигур AnyLogic – ломаных и кругов. Пути задаются ломаными, стрелки - кругами. Вы можете как нарисовать эти фигуры вручную в графическом редакторе, так и создать их программно, например, считав данные из базы данных.


Топология железнодорожного узла, заданная в графическом редакторе AnyLogic

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

  1. В группе фигур должны присутствовать только ломаные (фигуры - экземпляры класса ShapePolyLine) и круги (фигуры класса ShapeOval).
  2. В каждом круге, задающем стрелку, должны находиться конечные точки ровно трех ломаных (концы путей), удаленные от центра круга не далее, чем на 2 пиксела.
  3. У каждой стрелки из трех углов, образуемых путями, по крайней мере два угла должны быть тупыми. Стрелка будет определять маршруты согласно этим углам.

Пожалуйста, обратите внимание, что Железнодорожная библиотека не будет автоматически определять пересечение путей (т.e. точек, где два пути пересекают друг друга без стрелки), и именно пользователь несет ответственность за то, чтобы в модели не было подобных мест, где поезда могут перемещаться друг поверх друга, в то время как столкновения поездов на стрелках определяются автоматически, о чем показываются соответствующие сообщения об ошибках.

Фрагмент железнодорожной топологии рядом с ж.д. станцией. Задание стрелки

Толщина и цвет задающих пути ломаных, равно как и размеры и цвет задающих стрелки кругов, рисуемых Вами в процессе задания модели, не имеют значения: в режиме выполнения модели они будут изменяться в соответствии с заданными настройками масштаба и цветовой схемой, заданной в объекте RailYard.

Кривые сегменты путей можно аппроксимировать ломаными с множественным количеством точек. Если ж/д узел рисуется вручную, может иметь смысл добавить на анимацию чертеж САПР или изображение плана узла в качестве "подложки" (фонового рисунка), заблокировать его и рисовать ломаные поверх этого рисунка.

Нарисовав пути и стрелки, Вы должны добавить эти фигуры в группу, указать имя этой группы в параметре Группа фигур объекта RailYard и задать масштаб (параметр объекта RailYard Масштаб, пикселей в метре), в котором Вы нарисовали анимацию (т.е. сколько пикселей анимации соответствует одному метру).

Чтобы создать 3D анимацию ж/д узла, Вам нужно выбрать у группы фигур опцию Отображать на 3D сцене. Если у входящих в группу ломаных и кругов аналогичная опция выбрана не была, то Z-высота этих фигур автоматически установится равной 10, что может быть нежелательно. Простейший способ изменения Z-высоты фигур анимации путей и стрелок: щелкните правой кнопкой мыши по группе, выберите Выделить содержимое группы из контекстного меню и введите нужное Вам значение (например, 1) в поле Z-Высота на странице свойств Дополнительные.

3D анимация железнодорожного узла с масштабом 2 пиксела на метр и Z-Высотой путей, равной 1 пикселу

Ниже приводится пример кода, показывающий, как можно создать фигуры железнодорожного узла с помощью программного интерфейса AnyLogic:

// создание пути A
ShapePolyLine trackA = new ShapePolyLine();
trackA.setNPoints( 2 );
trackA.setPoint( 1, 200, 0 );
trackA.setPos( 0, 0 );
groupRailYard.add( trackA );

// создание пути B
ShapePolyLine trackB = new ShapePolyLine();
trackB.setNPoints( 2 );
trackB.setPoint( 1, 400, 0 );
trackB.setPos( 200, 0 );
groupRailYard.add( trackB );

// создание пути C
ShapePolyLine trackC = new ShapePolyLine();
trackC.setNPoints( 3 );
trackC.setPoint( 1, 100, 50 );
trackC.setPoint( 2, 400, 50 );
trackC.setPos( 200, 0 );
groupRailYard.add( trackC );

// создание стрелки на конце пути trackA
ShapeOval switchABC = new ShapeOval();
switchABC.setRadius( 10 );
switchABC.setPos( 200, 0 );
groupRailYard.add( switchABC );

//обновление параметра "Группа фигур" объекта RailYard
railYard.set_railYardShapes( null ); //на случай, если какие-то фигуры были заданы ранее
railYard.set_railYardShapes( groupRailYard );

Пожалуйста, обратите внимание, что местоположение фигур задается относительно группы, в которую они включены. Координаты точек ломаной задаются относительно координат начальной точки этой ломаной, следовательно у начальной точки ломаной с номером 0 координаты всегда (0,0). В приведенном выше коде подразумевается, что группа фигур group уже была создана к моменту вызова этого кода.