生成交替随机大小圆形序列的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); } } } }
问题分析
- 无限循环问题:第二个
while(validHeight)循环没有终止条件,validHeight始终为true,导致循环无限执行,不断生成圆形直至填满区域。 - 重复绘制问题:内部
for循环用circleSize作为循环次数,会重复绘制同一个大小的圆形多次,而非生成不同大小的单个圆形。 - 位置计算问题:
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
相关产品推荐
相关产品推荐

