如何用GraphABC将金字塔图形铺满整个绘图窗口?
用GraphABC绘制铺满窗口的金字塔图形
原代码的问题
- 全局变量滥用:
radpiramid过程直接修改全局x和y,主循环调用时无法控制垂直偏移,且每次调用都会重置x为80,导致重复绘制同一行。 - 主循环逻辑错误:
y未正确初始化,且循环内没有递增y值,要么无法触发循环,要么无限重复绘制同一位置。 - 金字塔垂直位置硬编码:
kv调用的y值(50、100、150)固定,无法随垂直偏移调整位置。
修改后的完整代码
uses GraphABC; var xOffset, yOffset: integer; procedure kv(x, y: integer; color: system.Drawing.Color); begin Rectangle(x, y, x + 20, y - 50); FloodFill(x + 10, y - 10, color); end; procedure DrawPyramidRow(baseY: integer); var x: integer; begin x := 80; while x < windowWidth do begin SetPenColor(clBlack); // 绘制金字塔底层(绿色),基于baseY调整位置 kv(x - 40, baseY + 50, clGreen); // 绘制中间层(橙色) for var i := 1 to 3 do kv(x - 20 * i, baseY + 100, clOrange); // 绘制顶层(红色) for var i := 1 to 5 do kv(x + 40 - 20 * (i + 1), baseY + 150, clRed); // 水平方向间隔105像素绘制下一个金字塔 x := x + 105; end; end; begin yOffset := 0; // 金字塔垂直总高度为100(从baseY+50到baseY+150) const pyramidHeight = 100; while yOffset + pyramidHeight <= windowHeight do begin DrawPyramidRow(yOffset); // 垂直方向下移一个金字塔高度 yOffset := yOffset + pyramidHeight; end; end.
关键修改说明
- 拆分全局变量:将绘制逻辑改为
DrawPyramidRow过程,接收baseY参数控制垂直起始位置,用局部变量x处理水平位置,避免全局变量冲突。 - 动态垂直偏移:主循环中用
yOffset控制每一行金字塔的位置,每次绘制后递增金字塔高度,直到超出窗口范围。 - 窗口适配:使用
windowWidth和windowHeight替代硬编码数值,自动适配窗口大小。 - 位置动态计算:金字塔各层位置基于
baseY偏移计算,确保每一行都能垂直向下排列。
内容的提问来源于stack exchange,提问作者intelligent
相关产品推荐
相关产品推荐

