NetLogo中如何分离turtle的左右视野区域?
NetLogo 海龟左右分离视野域实现方案
核心实现逻辑是先通过内置in-cone原语圈定整体视野范围,再通过相对角度计算拆分左右侧集合,性能和准确性都优于逐角度采样的方案。
方案1:连续视野高精度实现(推荐)
该方案会返回对应视野范围内所有连续的斑块集合,无采样遗漏,适合绝大多数建模场景,支持自定义视野半径、单侧视野角度。
; 左视野查询:传入参数为视野半径、单侧最大视野角度 to-report patches-in-left-view [view-radius max-side-angle] ; 先圈定整体锥形视野范围,减少后续计算量 let total-fov patches in-cone view-radius (max-side-angle * 2) report other total-fov with [ ; 计算当前斑块相对于观察者海龟的朝向差 let rel-angle (towards myself - [heading] myself) ; 将角度差归一化到[-180, 180]标准区间,处理360度循环边界问题 set rel-angle rel-angle mod 360 if rel-angle > 180 [set rel-angle rel-angle - 360] if rel-angle < -180 [set rel-angle rel-angle + 360] ; 匹配左视野范围:-max-side-angle 到 -1度 rel-angle < 0 and rel-angle >= (-1 * max-side-angle) ] end ; 右视野查询:传入参数为视野半径、单侧最大视野角度 to-report patches-in-right-view [view-radius max-side-angle] let total-fov patches in-cone view-radius (max-side-angle * 2) report other total-fov with [ let rel-angle (towards myself - [heading] myself) set rel-angle rel-angle mod 360 if rel-angle > 180 [set rel-angle rel-angle - 360] if rel-angle < -180 [set rel-angle rel-angle + 360] ; 匹配右视野范围:1度 到 max-side-angle度 rel-angle > 0 and rel-angle <= max-side-angle ] end
使用说明
- 按照左右各179度全侧视野的需求,调用时直接传入设定的视野半径即可,例:
let left-seen patches-in-left-view 10 179代表查询半径10以内的左视野所有斑块 - 代码默认将正前方0度线的斑块排除在左右视野外,如果需要将正前方归到某一侧,只要修改对应侧的判断条件即可,比如把正前方归到左视野,就将左视野的判断条件改为
rel-angle <= 0 and rel-angle >= (-1 * max-side-angle) - 如果需要检测视野内的海龟而非斑块,只要将代码中
patches in-cone替换为turtles in-cone,其余逻辑无需修改即可直接使用
方案2:离散采样实现(仅适合低精度场景)
如果不需要连续覆盖全视野,仅需要按固定角度间隔采样方向上的斑块,可以通过循环调用patch-left-and-ahead/patch-right-and-ahead实现,该方案存在采样遗漏问题,大半径下性能较差,非必要不推荐使用:
; 离散采样左视野:传入参数为视野半径、采样角度间隔 to-report patches-in-left-view-discrete [view-radius angle-step] let seen no-patches for [a 1 179 angle-step] [ set seen patch-set seen (patch-left-and-ahead a view-radius) ] report seen end ; 离散采样右视野:传入参数为视野半径、采样角度间隔 to-report patches-in-right-view-discrete [view-radius angle-step] let seen no-patches for [a 1 179 angle-step] [ set seen patch-set seen (patch-right-and-ahead a view-radius) ] report seen end
注意:离散采样方案的角度间隔越大,漏掉斑块的概率越高;如果间隔设为1度逐角度采样,大视野半径下的运行效率会远低于方案1。
内容的提问来源于stack exchange,提问作者Y S
相关产品推荐
相关产品推荐

