現在、 A star探索アルゴリズムを使って避難シミュレーションを作成しています。その中で高低差のある道路でPerson速度を低減したいと考えています。
①Personが特定の道路を通ったことを判別する方法
②上る方向で特定の道路を通るか下る方向で特定の道路を通るかを判別する方法
③通った際に速度を低減させる変数をPersonに与える方法
についてご教授お願い致します。
速度を低減させることに関係すると考えたコードを以下に記載します。
ルール:Pointで避難者を発生させるコード
Agt_Init{
//避難場所のIDと被ったら0になるIf文
If My.ID==Universe.FinishID then
MY.Clear=0
else If My.ID==Universe.FinishID2 then
My.Clear=0
else If My.ID==Universe.FinishID3 then
my.Clear=0
else If My.ID==Universe.FinishID4 then
my.Clear=0
else My.Clear=100
end If
end If
end If
end If
Dim personagt As Agt //「Dim 変数指定子 As 変数の型」
Dim PersonAgt2 As Agt
Dim i As Integer
For i=0 to 2 //next iまでの動作を3回繰り返す(3回以下の操作を繰り返す)
//記載しているID(=適当な避難開始地点)からエージェントを出す
If My.ID==3375 or My.ID==3387 or My.ID==3389 or My.ID==3390 or My.ID==3393 or My.ID==3392 or My.ID==3391 or My.ID==3399 or My.ID==3398 or My.ID==3397 or My.ID==3401 or My.ID==3402 or My.ID==3403 or My.ID==3426 or My.ID==3425 or My.ID==3424 or My.ID==3423 or My.ID==3422 or My.ID==3421 or My.ID==3429 or My.ID==3435 or My.ID==3439 or My.ID==3441 or My.ID==3433 or My.ID==3436 or My.ID==3437 or My.ID==3438 or My.ID==3440 or My.ID==3509 or My.ID==3510 or My.ID==3505 or My.ID==3497 or My.ID==3496 or My.ID==3443 or My.ID==3511 or My.ID==3508 or My.ID==3507 or My.ID==3506 or My.ID==3499 or My.ID==3498 or My.ID==3512 or My.ID==3504 or My.ID==3503 or My.ID==3502 or My.ID==3501 or My.ID==3500 or My.ID==3538 or My.ID==3539 or My.ID==3540 or My.ID==3551 or My.ID==3552 then
PersonAgt=CreateAgt(Universe.Map.Person)
PersonAgt.X=My.X
PersonAgt.Y=My.Y
PersonAgt.area=0 //エージェントの避難開始地点を把握する
Universe.Map.Point.iti=My.iti
//personAgt.RouteArray=@a_star(My.UniqueID,Cagt(Universe.FinishID+2))
//personAgt.RouteCount=1
PersonAgt.speed= 0.041256250196028
PersonAgt.st=My.ID
PersonAgt.SpeedRate=My.SpeedRate=1
end if
next i
ルール:Personのスピードや距離についてのコード
Dim TargetPointAgt As Agt
Dim distance As Double
if My.RouteCount<CountToken(My.RouteArray) then
//TargetpointID=CInt(GetToken(My.RouteArray,My.RouteCount))
TargetPointAgt=Universe.Map.Point(CInt(GetToken(My.RouteArray,My.RouteCount)))
//targetPointAgt=Universe.Map.Point(TargetPointID)
distance=Pursue(targetPointAgt,My.speed*My.SpeedRate)
高低差のある道路で歩行速度を変化させたいとのことで、
例えば、レシピブック12をベースに改造するとすれば、
① Pointに変数「高さ」を追加して、代入します。
② 次に、Personのルールで、目的地を示す「targetPointAgt」の他に1つ前のPointを取得します(例えば「lastPointAgt」)。
③「taretPointAgt」と「lastPointAgt」から、それぞれのPointの「高さ」を取得し比較することにより、上りなのか下りなのかを判定します。
④ 傾斜角度により、歩行速度を変化させます。