ped生成时的初始朝向。
单位为弧度。
町选择卜拉单提供的North,South,East.Westo
15)Onexit
可以在这里编码。
ped离开该组件时会调用这段代码。
16)advaneedparameters—Pedsimulationalgorithm
ped的模拟器算法。
默认值为pedConf.algorithmSocialForceModeL这个参数我没右深入研究过。
高端人士可以自C编写模拟器算法來试验一下。
4PedGoTo
设定ped的行走目的地和路线。
1)Target(point,line)
ped的口的地,可以是line,也可以是point。
2)Pathchoicemode
有两种模式,auto和ManuaL
auto模式,ped会自动计算到达目的地的路径。
Targetreachtoleranee,meters
定义ped距离目的地多少范W内算完成pedgotOo
Onenter.Onexit.Oncancel
分别定义ped进入,离开,取消pedGoto时的行为・
Blockingdetect!
ontimeout
当ped进入一个死角,从该位置无法沿既定路径到达目的地,则会进入timeout计时,超时后会重新计算路径。
5PedSink
ped的最终端,进入该对象的ped会从W面消失。
1)Onenter
门定义进入该对象的行为。
Manual模式,ped则根据指定的path行走。
若选择Manual模式,则必须在Parameters栏path项填写设定的path。
path为ShapePolyLine^
4)
5)
3)
以上为该模型中对象的基本介绍。
其他模型介绍请参考help文档。
关于其他对鉄的示例,请查看help->SampleModels。
PedestrianDynamics的三个示例。
五进阶功能。
这一块内容比较乱,基本上以我在做地铁疏散遇到的问题为主。
1path的画法
可以这样理解,ped按path行走,实际是按于path关联的一连串ties行走。
表示path的polyline.以+点为起点,每条tie必须放在polyline的点上面。
以上polyline2位path。
左下带+的点为path起点,ped先到达Iine2上一点,再通过Iine3上一点,以此来完成该pathoIine2和Iine3为ties。
创建一个group.把这两条line加入这个group,并把group名填入PedGround的Addtionalties,这些ties才被认可,可以起作用。
2PedGototarget缓冲区的实现。
本身PedGoto有一个参数Targetreachtolerance来实现该功能,但是由于实际效果来看,该参数对pointtarget效果很不错,但是对linetarget支持很不好。
实现该方法时,需指定pedGotocan8l端【I连接的对象。
方法一:
自定义算法计算缓冲区。
代码如2
distanceLine(doubleax,doubleay,doublebx,doubleby,doubleex,doublecy)
doublef=(bx-ax)*(cx-ax)+(by-ay)*(cy-ay);到¥[线ab的投彫点不庄线段ab上.而H离a点最近
if(f<0)returndistancePoints(ax,ay,ex,cy);
doubled=(bx-ax)*(bx-ax)+(by-ay)*(by-ay);
〃C到H线小的投彩点不在线段小上,而11离15点朋近
if(f>d)returndistancePoints(bx,by,ex,cy);Uc在ab线段上的投影点在线段ab上
f=f/d;
double
distanceLine(doubleax,doubleay,doublebx,doubleby)
doxiblefDistance=sqrt(pow((ax-bx),2)+pow((ay-by),2));returnfDistance;
该方法主要是计算ped与targetline的距离。
如果距离小于某个值,判定ped已经实现该pedGoto*调用PedGoto.cancel(ped)进入下一个对象。
方法二:
利用PedArea自定义缓冲区。
当ped进入PedArea以后,判定ped已经实现该pedGoto,调用PedGoto.cancel(ped)进入下一个对象。
3PedArea的几个用途
1)电梯。
PedArea一个参数GroundisMoving可以设定地面的移动速度。
2)町以控制区域开关。
Enableaccesscontrolnf以控制区域开关.当选定该参数之后,町以调用pedArea.setOpen(booleansOpen)来设置区域开关。
一个比较常见的用法就是当区域内人数达到一定限制后,就不允许再继续进去了。
3)可以实现靠边行走。
Keepdirection参数会给进入区域的每一个ped指定方法的加速度,该方向就是Keepdirection的值,可以是下拉列表的east*west,sourth.north,也町以是特定的弧度值。
4)限制区域内peds的行走速度。
可以通过SpeedisLimited来限制ped的最大速度.
5)每个ped的速度增加百分比的速度。
可以通过Speedismultiplied来给每个ped设定百分比。
PedArea的缺陷。
由于pedArea在计算时,会把当前pedGround里所有的ped都计算一遍,所以,当pedArea的数量过多时,会极大地增加数据计算量。
4函数的用法。
函数的用途主要体现在a杂数据的处理。
比如main的初始化,比如多对象的选择。
函数的便用,在一定程度上可以大幅度的简化模型的复杂度,把流程柑同的对象画在同-条流程图上面。
下面举个例子,肖进入pedGoto的peds有同一个目的地,但是可以选择两条不同的路径时,选择函数来实现路径的选择是一个很好的办法•
从General>|»拖一个Function控件到模型中。
设置参数,返回值,然后编码。
请注盘返回值类型必须与path的类型保持一致,都必须是ShapePolyLineo5專件的用法。
班件有三种模型,一个是时间模型,肖时间到了触发爭件。
具体又町以分为Occursonce.Cyclic和usercontrol。
第二个是Rate,比率模型《第三个是Condition,条件模型。
结合函数,基本可以满足我们的需求。
6队列的实现。
AnyLogic提供了一种队列的模型*PedService。
PedService中有一个名为Service的参数,参数类型为PedServiceSo
PedServices具体实现队列模型。
PedServices包含两种队列,一个是服务队列,Services.该队列存在两种模式,justdelay.Delayandpassthrough«就好比地铁买票和过闸机。
买票接受服务时,只需要站在原地和地铁工作人员交流就可以了,可以选择justdelay模式,而过闸机接受的服务则是先刷卡,然后沿着闸机II过去,则ikDelayandpassthrough.
PedServices的另外一个队列则是Queues,即排队队列。
该队列存在两种选择模式,一是选择队列的方式,Shortestqueue,Closestqueue,Manual一个是选择服务队列的方式Longestqueue.Closestqueue.Manual。
町以根JI体的需求来选择。
7环境切换。
坏境的切换。
例如从一楼定到一楼这种。
两个坏境原本是ffl互独立的,町以通过Pedchangeground来实现切换。
该模型的参数设置很简单,仅Destinationground个。
但在在M的时候有些地方需要注意,切换ground前需要到达的目的地和两种环境的边缘保持一定的空间,以方便进行切换。
8导入shp文件。
其中原点坐标X,原点坐标Y需要记录卜来,因为后续录像时会用到。
比例鬧要与PedConfiguration中的Animationscale,pixelspermeter—致。
数据名称自定义。
其他数据自定义,相互关联不大。
六NetBeans卜•的Anylogic
己经冇了AnyLogic,为何还需要一个专门把Anylogic中的代码拷贝到NetBeans卜”运行?
主要是因为之前我们重载的时候,都在netbeans中进行的。
我们制作录像时,需要记录毎个ped的坐标位置,还有其他一些信息,但是这里面有很多数据是我们无法育接调用的,需要首先继承一些类,然后通过巫我等方法,使这些数据可以为我们所用。
例如要获取ped的坐标,但足,在ped中,坐标变量是friendly类型的,所以我们就需要在com.xj.anylogic.libraries.pedestrian包中创建一个ped的子类MyPed.然后在MyPed中新建一个public函数,返回ped的x,y坐标。
这样就町以实现我们的婆求了。
在使用既冇工程中的代码时,冇几个注盘点。
1SimMain中有个函数chargePos(MyPedped,doublex,doubley).该函数的作用是将录像中的xy坐标还原为实际的xy坐标。
我们在导入地图数据的时候,记录了一个原点坐标,那么现在模型中的坐标只需要按照这个原点坐标进行偏移就M以还原为实际坐标了。
2Simulation里面的Main全部改为SimMain.因为我们在SimMain里®载了一些函数。
3Simulation仅仅是一个模拟器的一些运行设置,可以不用拷贝。
宜接使用工程原有的代码。
但是main的代码必须从AnyLogic从拷贝到NetBeans的工程中。
为了拷贝方便,M以将NetBeans的包名称与AnyLogic的包名称保持一致。
4ped等的子类,应该放在com.xj.anylogic.libraries.pedestrian下面。
并注盘修改代码的package.改为packagecom.xj.anylogic.libraries.pedestrian;
5现在的NetBeans对AnyLogic的支持并不完美。
在使用6.5的库的时候,并不支持
PedSelectOutputo我们在建立模型的时候需要SelectOutput替代。
6町以使用pv已的反编译器查看库的源代码。
7当从别人那里拷贝NetBeansIfE到本地之后,请确认项目属性的项目文件夹是否一
致・七AnyLogic创建口己的对象
AnyLogic现冇的对彖,不一定可以完全满足我门的需求,在某些特定的需求之N我们需要创建属于自己的对彖,来实现我们的冃标。
一个很简单的例子,我们需要在一个特定的多边形范W内随机生成指定数量的peds.
而现右的对彖,都是在线或者点上生成。
为了实现这一需求,我们需要自己创建一个新的对彖。
建立一个新的对彖,需要考虑是out还是in。
我们创建的对象,没有进,只有出,所有只有一个out端I」。
右键选项目名称・>new->ActiveObjectClass。
Name定义PedDispose。
首先添加一个out端【1。
将General中的port拖到界面中。
命名为out。
并将showname的勾选去掉。
在Constructorcode中填入OutPortPush(this),指定该port的构造函数。
若是in端II,则填lnPort(this).
然后画PedDispose在模型中的显示图标。
画一个圆,并用一条line连接起来。
注意圆和line都要勾选icon.
Icon
~1
卜面就要定义一些生成ped所相关的信息.
创建一个参数。
例如生成多少人。
从general中拖Parameter控件到界而中。
填写所需的一些参数设置。
®Text
-Ch电ckButt^TL
ORadioButton
OCmbo
OEditableCombo
OSliler
-HypsrArrayEditor
使用同样的方法添加其它参数。
在这里我们需要的有speed,diameter,color三种初始属性。
pedGround.pedConfig.初始配置信息。
pedInitNumber.pedInitShape*生成ped数量和生成范出。
onCreaterPed,onOut,生成ped和ped离开时自定义代码。
创建一个变m,pedVector,用来保存生成的peds。
叼ShownameIIIgnoreFu*blic叼Sho瞥atrir
ObooLemOintOdoublftOstring©Other;IVector
IxutiJV^ue:
newVector(>;
创建4个函数>InitPed,GoOut.GoOutAILPedDisposeCreate^
由于ped的成员变S都是friendly.只能在同一个包中访问,所以要实现该对象,必须NetBeans的工程卜•完成。
publicboolean
PedDispose(){
if(pedlnitShape==null||pedConf==null)returnfalse;
ArrayListary=pedInitShape.getShapesO;for(inti=0;ii++)//教室编码
doublexmin,xmax,ymin»ymax,x1,yl;
ShapePolyLinepl=(ShapePolyLine)aryget(i);intn=pLgetNPointsO;
xmin=xmax=pLx+pLgetPointDx(0);ymin=ymax=pLy+pLgetPointDy(O):
for(intj=1;jx1=pl.x+pLgetPointDx(j);y1=pLy+pLgetPointDy(j);xmin=xminxmin:
x1;xmax=xmax>x1?
xmax:
x1;
ymin=yminymin:
y1;ymax=ymax>y1?
ymax:
y1:
for(intp=0;pMyPedped=newMyPed();InitPed(ped);
doubleX=uniform(xmin,xmax);doubley=uniform(ymin,ymax);while(pLcontains(x,y)==false)
X=uniform(xmin,xmax);y=uniform(ymin,ymax);
ped.e=x/this-pedConf.animationScale;ped.f=y/this.pedConf.animationScale;
ped-selectFlag=i+1;
onCreatePed(ped);pedVectoradd(ped);
returntrue;
这一段的代码«实很简单,想要生成ped.首先要确定ped生成的位置,然后创建一个ped的实例,初始化,将这个位置的坐标赋给ped,这时这个ped就在模型中生成了,但是该ped只能站在原地不动,还没有给他行走的命令。
public
void
GoOut(MyPedped){outtake(ped);
PedVectorremove(ped);onOut(ped);
public
void
GoOulAII(){while(pedVectorsize()>0)
MyPedp=(MyPed)pedVectorget(O);this.GoOut(p):
当端I丨port接受这个pedZ后.该p