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

Java实现谢尔宾斯基三角形遇问题:仅显灰色大三角而非4层结构

问题分析与解决方案

你的代码存在两个核心问题,导致无法正确显示4层谢尔宾斯基三角形:

问题1:递归逻辑错误

谢尔宾斯基三角形的核心是通过递归绘制三个子三角形,仅在最小尺寸(≤4像素)时填充,而你的代码每次递归都填充当前大小的黑色三角形,导致所有层级的三角形重叠,最终整个区域被黑色覆盖(或因尺寸问题仅显示大三角)。

问题2:组件尺寸初始化异常

在Swing中,frame.setVisible(true)执行前,Canvas的尺寸未被布局管理器正确计算,导致paint方法第一次调用时getHeight()返回值远小于预期,递归提前终止。


修正后的代码

import java.awt.*;
import java.swing.*;

public class SierpTriangle extends Canvas {

    public static void main(String[] args) {
        JFrame frame = new JFrame("Sierp Triangle");
        SierpTriangle st = new SierpTriangle();
        st.setPreferredSize(new Dimension(900, 900)); // 固定Canvas首选尺寸
        frame.add(st);
        frame.pack(); // 让窗口适配组件尺寸
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setVisible(true);
    }

    @Override
    public void paint(Graphics g) {
        super.paint(g); // 清除背景,避免绘制残留
        drawSTriangle(0, getHeight(), getHeight(), g);
    }

    public void drawSTriangle(int x, int y, int size, Graphics g) {
        // 终止条件:尺寸≤4时填充三角形
        if (size <= 4) {
            int[] xPoints = {x, x + size / 2, x + size};
            int[] yPoints = {y, y - size, y};
            g.setColor(Color.BLACK);
            g.fillPolygon(xPoints, yPoints, 3);
            return;
        }

        int sub = size / 2;
        // 递归绘制三个子三角形
        drawSTriangle(x, y, sub, g);       // 左下角
        drawSTriangle(x + sub / 2, y - sub, sub, g); // 顶部
        drawSTriangle(x + sub, y, sub, g); // 右下角
    }
}

关键修正点

  1. 调整递归逻辑:仅当三角形尺寸≤4像素时才填充,上层通过递归组合形成谢尔宾斯基的镂空结构。
  2. 修复尺寸问题:设置Canvas的首选尺寸并调用frame.pack(),确保组件在窗口显示前已获得正确尺寸。
  3. 添加super.paint(g):调用父类方法清除背景,避免绘制残留或异常显示。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.27 03:52:51