服务热线:010-62964229
格瑞纳根植于教育行业,让仿真软件从理论教学到应用实践
新闻资讯
当前位置:首页 > 新闻资讯 > 行业新闻
操作教程 |Anylogic中获取矩形节点和多边形节点区域面积和行人密度的方法
2022-06-22 14:46:29 发布人:admin 阅读 4856

说明:自 AnyLogic 8.7 之后,原来用于区域建模的PedAreaDescriptor模块被弃用,取而代之的是使用多边形节点(Polygonal Node)和矩形节点(Rectangular Node)来对规则不规则区域,有速度和访问限制的区域进行建模。在8.7之前常用到PedAreaDescriptor模块的用户,可以参考帮助的相关章节,了解相关的修改。

在本文中,我们将简单介绍绘制并设置节点区域以及获取区域面积、区域内行人密度的相关操作。下面我们会通过创建一个简单的行人模型来进行说明。

示例

在此模型中,我们模拟行人流会走过一个曲折通道的情景,并希望通过Anylogic的相关函数获取该区域面积、通过行人数量以及区域内行人密度。好了,新建模型的步骤我们就直接跳过,直接从创建行人通道开始。

Step 1 :创建行人通道

1.绘制区域

双击空间标记(或行人库)模块中的多边形节点组件,于main智能体界面中绘制一个多边形通道,示例下图:

1:用多边形节点绘制行人通道

2.设置属性

绘制完成后,在该节点的属性面板中,我们找到速度限制进入限制属性,在勾选进入限制,将进入限制通过选项,选择条件,并将条件的值设置为false,如下图:

图2:设置节点区域属性


注:这一步的设置是为了在获取区域密度时使用density()方法:density()方法必须给节点加上限制之后才能使用,否则获取的数据一直为0,无法获取正确数据。

3.添加目标线

节点属性设置完成之后,我们为这个通道的头尾处添加两条目标线。绘制目标线的目的是为定义行人的入口、等待位置或目的地(出口)的。在空间标记(或行人库)模块中,直接拖拽目标线组件到相应位置即可,绘制完成示意如下:


图3:为节点区域添加目标线

4.绘制行进路径

在两条目标线设置完成后,双击空间标记模块行人部分(或行人库)路径组件,沿着该通道绘制一条路线,目的是为了让行人沿着这条通道从入口目标线走到出口目标线,此示例中是从左上方入口到右下方出口,绘制完成后应如下图所示:

4:绘制行人的行进路径


至此,第一步的通道绘制工作结束。

Step 2 :利用行人库组件构建流程

1.创建行人流程

我们从行人库模块中按顺序拖出pedSourcepedGoTopedSink组件,并将其连接,如下图:

5:行人流程图

2.设置模块属性

我们将pedSource模块中的目标线设置为通道左端开端的目标线,可以从列表中选择,也可以通过右侧的捕获器从图中选中对应的目标线,设置如下:

6:pedSource模块属性设置

pedGoTo模块中,我们将模式更改为跟随路线,并将路线选中我们刚才绘制的路径,设置更改如下:

图7pedGoTo模块属性设置

3.试运行

此处设置完之后可以尝试运行,若运行成功可以看到如下画面:

图8:模型运行效果演示


Step 3 :获取面积、行人数量、区域密度

1.创建文本组件

我们从演示模块中,拖出文本组件,创建3个文本,分别将它们属性面板中的文本更改为“面积 =”、“区域内人数=”、“密度=”,更改例如下图:

图9:文本组件属性设置

随后在其文本后拖入3个新的文本,将其属性面板中的文本内容清空,完成后如下图所示:

10:创建的文本效果示意

2.创建按钮组件

完成后,我们从控件模块中拖出3个按钮组件,分别将它们的标签设置为获取面积、获取区域内人数、获取密度,放置在刚才对应的文本前方,并分别更改属性如下:

获取面积:行动:text3.setText(node.area(SQ_METER));

11:设置获取面积按钮的属性

获取区域内人数:行动:text4.setText(node.agents().size());

12:设置获取区域内人数按钮的属性


获取密度:行动:text5.setText(node.density(SQ_METER));

13:设置获取密度按钮的属性

3. 运行实验

设置完成之后,运行实验,我们可以通过点击按钮获得点击时对应的node区域内部对应的行人(智能体)数量、区域密度,如下:

14:最终模型运行效果演示

小结

获取矩形节点和多边形节点区域面积的方法,是通过area()方法实现的,该方法是无法代码补全的,所以要通过手动输入。

获取区域内的行人密度,有两种方法:

1.通过分别获取区域的面积和区域内的人数,然后人数/面积= 密度。

人数 = node.agents().size();

面积 = node.area(SQ_METER);

double area() : 返回此区域的面积,以平方米为单位

int size() :返回区域内的行人数量。


2.直接调用density()方法

密度 = node.density(SQ_METER);

double density() :返回此区域内的行人密度的平均值,以每平方米行人数为单位

注意,使用此方法时,必须给节点加上限制:在速度和进入限制属性框中,勾选进入限制选项,并将进入限制通过选为【条件】,并将条件的值置为false


下附本文中涉及到的示例模型,附件modeldensitycount

  电话:010-62964229
  邮箱:support@carila.cn
  地址:北京市海淀区上地信息产业基地三街3号楼1门4层401
©2021 北京格瑞纳电子产品有限公司 版权所有 京ICP备19024141号 京公网安备 11010802029095号
 
QQ在线咨询
点击这里给我发消息 点击这里给我发消息
服务热线
010-62964229
E-mail
support@
carila.cn
地址:北京市海
淀区上地信息产
业基地三街3号