疏散模型中节点准入被拒时行人目标出口切换的代码实现
行人疏散模型路线切换需求及代码实现
模型背景
- 我搭建了一个行人疏散模型,布局中行人从绿色目标线出发,可选择两个红色标记的出口疏散:exit1有10%阻塞概率,exit2有50%阻塞概率。
- 当两个出口都可用时,已实现让行人前往当前位置最近的可用出口的逻辑,
availableExits为存储可用出口的集合,对应逻辑已完成。 - 布局中设置了一个带访问限制的红色节点,同时容纳行人上限为8;当两个出口均可用时,到达该节点的行人会因exit1更近而选择它。
需求
希望在该节点的**"On enter denied"**事件中编写代码,让被拒绝进入该节点的行人,将目标从exit1切换至次近的exit2,模拟疏散中寻找更畅通路线的行为。
代码实现方案
在节点的"On enter denied"事件中添加以下代码即可实现需求:
场景一:仅两个出口的简化写法
// 获取当前被拒绝进入的行人 Pedestrian ped = getPedestrian(); // 移除原目标exit1,将exit2设为新目标 ped.removeDestination(exit1); ped.setDestination(exit2);
场景二:支持多出口的通用写法(扩展性更强)
// 获取当前被拒绝进入的行人 Pedestrian ped = getPedestrian(); // 从可用出口集合中排除原目标exit1 Collection<Exit> alternativeExits = new HashSet<>(availableExits); alternativeExits.remove(exit1); // 从剩余可用出口中计算最近的那个 Exit nearestAlternative = null; double minDistance = Double.MAX_VALUE; for(Exit exit : alternativeExits) { double distance = ped.getDistanceTo(exit); if(distance < minDistance) { minDistance = distance; nearestAlternative = exit; } } // 切换至新目标 if(nearestAlternative != null) { ped.removeDestination(exit1); ped.setDestination(nearestAlternative); }
代码说明
- 简化写法适合固定两个出口的场景,逻辑直接清晰。
- 通用写法适合出口数量可能调整的场景,会自动从剩余可用出口中重新筛选最近的作为新目标,无需修改代码适配出口数量变化。
内容的提问来源于stack exchange,提问作者SA_2003
相关产品推荐
相关产品推荐

