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

生成交替随机大小圆形序列的Java代码问题求助

问题修复:控制随机圆形生成数量避免无限循环

我需要生成多个可区分的不同随机大小的圆形,但当前程序会绘制过多圆形直至填满区域。预期是生成有限个不同大小的圆形,而非无限绘制。我通过askDouble获取输入值,要求输入的height小于常量PATTERN_SIZE(值为300)。

常量定义

public static final double PATTERN_LEFT = 50.0;   // Left side of the pattern
public static final double PATTERN_TOP = 50.0;    // Top of the pattern
public static final double PATTERN_SIZE = 300.0;  // The size of the pattern on the window

原绘制方法代码

/**
 * Drawing a sequence of circles.
 */
public void drawRandomCircles(){
    double height = 0;
    boolean validHeight = false;

    while(!validHeight){
        height = UI.askDouble("Enter height below 300px: ");

        if(height < PATTERN_SIZE && height > 0){
            validHeight = true;
            UI.setColor(Color.black);
            UI.drawRect(PATTERN_LEFT,PATTERN_TOP,PATTERN_SIZE,height);

        }

    }

    while(validHeight){
        double circleSize = (3 * Math.random() * (height-3));
        UI.setColor(Color.blue);
        for(int i = 0; i < circleSize; i++){
            if(circleSize < height){
                UI.fillOval(PATTERN_LEFT + i,PATTERN_TOP,circleSize,circleSize);
            }
        }

    }
}

问题分析

  1. 无限循环问题:第二个while(validHeight)循环没有终止条件,validHeight始终为true,导致循环无限执行,不断生成圆形直至填满区域。
  2. 重复绘制问题:内部for循环用circleSize作为循环次数,会重复绘制同一个大小的圆形多次,而非生成不同大小的单个圆形。
  3. 位置计算问题:PATTERN_LEFT + i的位置逻辑错误,会导致圆形横向连续重叠绘制,无法区分单个圆形。

修复方向

  • 添加循环终止条件:维护当前绘制的x轴位置,当当前x位置 + 圆形直径 > PATTERN_LEFT + PATTERN_SIZE时,将validHeight设为false,退出循环。
  • 简化绘制逻辑:移除内部for循环,每次while循环生成一个随机大小的圆形,计算合适的x位置(带间隔避免重叠),绘制单个圆形即可。
  • 优化随机大小范围:调整circleSize的生成逻辑,确保圆形直径在合理区间(比如3到height之间),避免超出矩形高度范围。

修复后示例代码

/**
 * Drawing a sequence of circles.
 */
public void drawRandomCircles(){
    double height = 0;
    boolean validHeight = false;

    while(!validHeight){
        height = UI.askDouble("Enter height below 300px: ");

        if(height < PATTERN_SIZE && height > 0){
            validHeight = true;
            UI.setColor(Color.black);
            UI.drawRect(PATTERN_LEFT,PATTERN_TOP,PATTERN_SIZE,height);
        }
    }

    // 记录当前绘制的x坐标起始位置
    double currentX = PATTERN_LEFT;
    // 循环终止条件:当前x位置无法再容纳最小尺寸的圆形
    while(validHeight && currentX + 3 <= PATTERN_LEFT + PATTERN_SIZE){
        // 生成3到height之间的随机圆形大小
        double circleSize = 3 + Math.random() * (height - 3);
        // 确保圆形不超出矩形高度
        if(circleSize <= height){
            UI.setColor(Color.blue);
            UI.fillOval(currentX, PATTERN_TOP, circleSize, circleSize);
            // 更新x位置,增加圆形大小+2px间隔,避免重叠
            currentX += circleSize + 2;
        }
        // 检查是否还能容纳下一个最小圆形,不能则终止循环
        if(currentX + 3 > PATTERN_LEFT + PATTERN_SIZE){
            validHeight = false;
        }
    }
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 08:00:54