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

Processing中Java实现圆形沿窗口边缘顺时针无限循环移动问题求解

问题根源
  • 边界判断用了width-485这类硬编码值,没有和圆形尺寸绑定,适配性差
  • 先更新坐标再做边界判断,圆形已经移出边界才触发方向调整,误差多轮累积后就会明显超出屏幕
  • 四个边界判断都是独立if,极端场景下会同时触发多个方向修改逻辑,导致运动逻辑混乱
修复方案

调整边界判断逻辑的顺序、关联圆形尺寸、修改判断分支结构即可,修改后完整代码如下:

// 圆形直径
final int diameter = 25; 
// 圆形中心坐标,初始位置贴左上角
int xPos = diameter / 2; 
int yPos = diameter / 2;
int xDir = 4; 
int yDir = 0;


void setup()
{
 size(500, 500); 
 background(177, 237, 247);
}

void draw()
{
  background(177, 237, 247); 
  ellipse(xPos, yPos, diameter, diameter); 
  
  // 先判断边界调整方向,再更新坐标,避免移出后才修正
  if (xPos >= width - diameter / 2) { 
    // 触碰到右边界,改为向下移动
    yDir = 4;
    xDir = 0;
  } else if (yPos >= height - diameter / 2) {
    // 触碰到下边界,改为向左移动
    xDir = -4; 
    yDir = 0;
  } else if (xPos <= diameter / 2) {
    // 触碰到左边界,改为向上移动
    xDir = 0; 
    yDir = -4;
  } else if (yPos <= diameter / 2) {
    // 触碰到上边界,改为向右移动
    yDir = 0; 
    xDir = 4;
  }
  
  xPos += xDir; 
  yPos += yDir;
}
核心修改点说明
  • 把原代码的radius变量重命名为diameter,匹配Processing ellipse方法的宽高参数规则(传入值为直径而非半径),避免语义混淆
  • 所有边界阈值都通过diameter/2动态计算,后续调整圆形尺寸或者窗口大小都不需要手动修改阈值
  • 把边界判断逻辑放到坐标更新之前,方向调整后再移动,不会出现已经移出边界才修正的问题
  • 用else if关联四个判断分支,同一时间只会触发一个方向调整逻辑,不会出现方向混乱

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 03:57:02