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); // 右下角 } }
关键修正点
- 调整递归逻辑:仅当三角形尺寸≤4像素时才填充,上层通过递归组合形成谢尔宾斯基的镂空结构。
- 修复尺寸问题:设置Canvas的首选尺寸并调用
frame.pack(),确保组件在窗口显示前已获得正确尺寸。 - 添加
super.paint(g):调用父类方法清除背景,避免绘制残留或异常显示。
内容的提问来源于stack exchange,提问作者T P
相关产品推荐
相关产品推荐

