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
相关产品推荐
相关产品推荐

