Java CodeDraw绘制动态正方形时右侧最后蓝色正方形底边缺失求助
问题解决方案:CodeDraw绘制正方形底边缺失及循环逻辑错误修复
问题核心分析
- 循环顺序错误:原代码先调用绘制方法再赋值
fraction,导致每次绘制使用的是上一次循环的比例值,最后一个红色正方形和右侧蓝色正方形的位置完全错位。 - 边界绘制溢出:右侧蓝色正方形的底边恰好对齐画布下边缘,由于线宽为2,线条一半超出画布范围,导致底边缺失。
- 无效迭代:原循环
i <= n会触发一次完全超出画布的无效红色正方形绘制。
修正步骤及完整代码
1. 调整循环逻辑
将fraction的计算移到绘制方法之前,确保每次迭代使用当前正确的比例值;同时将循环条件改为i < n,刚好执行n次有效绘制,避免溢出。
2. 添加坐标边界检查
对所有正方形的坐标做边界限制,确保图形完全在画布内,解决线条溢出问题。
3. 优化变量类型
将n改为int类型,避免浮点运算带来的精度误差。
import codedraw.CodeDraw; import codedraw.Palette; public class Aufgabe5 { // Constants defining canvas dimensions private static final double CANVAS_WIDTH = 300.0; private static final double CANVAS_HEIGHT = 300.0; private static final double MIN_X = 0.0; private static final double MAX_X = CANVAS_WIDTH; private static final double MIN_Y = 0.0; private static final double MAX_Y = CANVAS_HEIGHT; private static final int n = 9; // 改为int避免浮点精度问题 private static int i; public static void main(String[] args) { CodeDraw myDrawObj = new CodeDraw((int)CANVAS_WIDTH, (int)CANVAS_HEIGHT); double fraction = 0.0; boolean inRange = (n >= 5 && n <= 19); boolean isOdd = (n % 2 != 0); if (inRange && isOdd) { // 先计算当前比例,再执行绘制 for (i = 0; i < n; i++) { fraction = (double)i / n; drawSquares(myDrawObj, fraction); } } else { System.out.println("Invalid Input: n has to be an odd number between 5 and 19."); } myDrawObj.show(); } private static void drawSquares(CodeDraw myDrawObj, double fraction) { double sideLength = CANVAS_WIDTH / n; // 绘制红色正方形:确保不超出画布右下角 myDrawObj.setLineWidth(4); myDrawObj.setColor(Palette.RED); double redX = Math.min(MAX_X * fraction, MAX_X - sideLength); double redY = Math.min(MAX_Y * fraction, MAX_Y - sideLength); myDrawObj.drawSquare(redX, redY, sideLength); // 绘制左侧蓝色正方形:确保不超出画布顶部 myDrawObj.setLineWidth(2); myDrawObj.setColor(Palette.BLUE); double blueLeftY = Math.max(MAX_Y - (MAX_Y * fraction) - sideLength, 0); myDrawObj.drawSquare(MIN_X, blueLeftY, sideLength); // 绘制右侧蓝色正方形:确保不超出画布底部 double blueRightY = Math.min(MAX_Y * fraction, MAX_Y - sideLength); myDrawObj.drawSquare((MAX_X - sideLength), blueRightY, sideLength); } }
关键说明
- 所有图形坐标均添加了
Math.min/Math.max边界检查,确保完全在画布范围内,解决了右侧蓝色正方形底边缺失的问题。 - 循环逻辑调整后,每个红色正方形的位置完全正确,且蓝色正方形始终绘制在红色上层,满足“红色不覆盖蓝色”的要求。
- 移除了原代码中多余的
if (i < n)判断,因为循环条件已经保证了迭代次数的有效性。
内容的提问来源于stack exchange,提问作者user22142988
相关产品推荐
相关产品推荐

