You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Processing4蚁群模拟旋转物体视角下食物感知角度计算问题

问题根源
  • 原sense()方法中调用atan2时传入了绝对值参数,直接将计算出的角度限制在了0~π/2的第一象限范围,完全无法匹配全局坐标下食物的真实方向
  • 角度判断逻辑未绑定蚂蚁的实时朝向:你在render()中绘制图形和视锥圆弧时用到了随速度变化的旋转值theta,但感知逻辑完全没有引入这个变量,自然和可视化的视锥范围不匹配
  • 视锥的起止角度写死了270度相关的固定值,这个值是你平移旋转到蚂蚁局部坐标系后绘制圆弧用的局部值,不能直接拿到全局坐标的角度判断里用
最优实现方案

直接用Processing内置的PVector向量运算方法,不需要手动计算三角函数,逻辑清晰不容易出错:

void sense() {
    if (!detectFood) {
        float closest = viewRadius;
        Food selected = null;
        // 和render方法里保持一致,先获取蚂蚁当前的朝向角度
        float antHeading = velocity.heading() + radians(90);
        // 视角半角,提前算好避免重复计算
        float halfViewAngle = radians(viewAngle / 2);
        for (Food fd : foods){
            float foodDist = position.dist(fd.position);
            if(foodDist <= viewRadius) {
                // 计算蚂蚁指向食物的向量
                PVector foodDir = PVector.sub(fd.position, position);
                // 计算食物方向和蚂蚁朝向的夹角
                float angleDiff = abs(foodDir.heading() - antHeading);
                // 角度是循环的,超过180度的差值取补角才是真实的最小夹角
                if(angleDiff > PI) angleDiff = TWO_PI - angleDiff;
                // 夹角小于半视角,说明在视锥范围内
                if(angleDiff < halfViewAngle && foodDist < closest){
                    selected = fd;
                    closest = foodDist;
                }
            }
        }  
        if (selected != null){
            detectFood = true;
            foodFocused = selected;
        }
    } else {
        if(position.dist(foodFocused.position) < r) {
            takeFood();
            detectFood = false;
        }
    }
}
额外优化提示

你当前render()方法的if(detectFood)分支只写了fill(0,173,67),没有重置颜色、没有绘制蚂蚁本体,会导致蚂蚁检测到食物后直接消失,建议补充完整对应分支的渲染逻辑。


内容的提问来源于stack exchange,提问作者Dr Tipmack

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.27 07:15:04