Создание цилиндрического пространства в Repast Simphony?

Я пытаюсь смоделировать внутреннюю часть эпителиального пространства и застреваю при движении вокруг внутренних краев цилиндрического пространства. По сути, я пытаюсь реализовать StickyBorders и держать агентов на тех границах в цилиндрическом пространстве, которое я создаю.

Есть ли способ использовать цилиндрические координаты в Repast Simphony? Я нашел этот пример ( https://www.researchgate.net/publication/259695792_An_Agent-Based_Model_of_Vascular_Disease_Remodeling_in_Pulmonary_Arterial_Hypertension), где они, кажется, сделали что-то похожее, но статья не объясняет методы очень подробно, и я не верю, что это пример в моделях repast simphony.

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

GridPoint intendedpt = new GridPoint((int)Math.rint(alongX),(int)Math.rint(alongY),(int)Math.rint(alongZ));
        GridCellNgh<EpithelialCell> nearEpithelium = new GridCellNgh<EpithelialCell>(mac_grid, intendedpt, EpithelialCell.class, 1,1,1);    
        List<GridCell<EpithelialCell>> EpiCells = nearEpithelium.getNeighborhood(false);
        int nearbyEpiCellsCount=0;
        for (GridCell<EpithelialCell> cell: EpiCells) {
            nearbyEpiCellsCount++;
        }
        if (nearbyEpiCellsCount<2) {
            System.out.println(this + " leaving epithelial wall /r");
            RunEnvironment.getInstance().pauseRun();

            //TODO: where to go if false
        }

Мне интересно, есть ли способ установить границы пространства в виде цилиндра или проверить, какая сторона агента находится напротив стены, и ограничить его движение в этом направлении.

2 ответа

Липкий код границы ( StickyBorders.java), по сути, просто проверяет, находится ли точка, в которую перемещается агент, за пределами какого-либо из измерений пространства, и если это так, точка привязана к этому измерению. Так, например, если пространство составляет 3х4, а движение агента увеличит его до 4,2, то эта точка станет 3,2, и агент окажется там. Можете ли вы сделать что-то подобное в этом случае? Если нет, можете ли вы отредактировать свой вопрос, чтобы объяснить, почему нет, и, возможно, это поможет нам лучше понять.

Подход, который мы использовали в этой модели, заключался в использовании трехмерного пространства сетки с пользовательскими границами и методами запросов. Само пространство было все еще декартовым - мы просто визуализировали его как цилиндр, используя пользовательский код дисплея. Использование декартовой сетки было разумным приближением для этого приложения, поскольку размеры ячеек были значительно меньше радиуса сосуда, поэтому эффектом кривизны пренебрегали. Граничные условия на пространстве сосуда были обернуты в угловом измерении, так что ячейки могли непрерывно перемещаться по окружности сосуда, а осевые граничные условия также были обернуты, так как мы предполагали достаточно большую длину сосуда, чтобы это было разумно, Измерение толщины стенки имело жесткие границы на базальной мембране (y=0) и на границе раздела текучей среды (y = толщина стенки).

В зависимости от того, какой тип пространства вы используете, вам потребуется реализовать PointTranslator или GridPointTranslator, который выполняет граничные функции. Если вы хотите конкретные примеры кода, я предлагаю вам обратиться непосредственно к автору.

Другие вопросы по тегам