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

如何用GraphABC将金字塔图形铺满整个绘图窗口?

用GraphABC绘制铺满窗口的金字塔图形

原代码的问题

  1. 全局变量滥用:radpiramid过程直接修改全局x和y,主循环调用时无法控制垂直偏移,且每次调用都会重置x为80,导致重复绘制同一行。
  2. 主循环逻辑错误:y未正确初始化,且循环内没有递增y值,要么无法触发循环,要么无限重复绘制同一位置。
  3. 金字塔垂直位置硬编码: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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.31 15:37:35