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

Java CodeDraw绘制动态正方形时右侧最后蓝色正方形底边缺失求助

问题解决方案:CodeDraw绘制正方形底边缺失及循环逻辑错误修复

问题核心分析

  1. 循环顺序错误:原代码先调用绘制方法再赋值fraction,导致每次绘制使用的是上一次循环的比例值,最后一个红色正方形和右侧蓝色正方形的位置完全错位。
  2. 边界绘制溢出:右侧蓝色正方形的底边恰好对齐画布下边缘,由于线宽为2,线条一半超出画布范围,导致底边缺失。
  3. 无效迭代:原循环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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.26 03:35:04