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

Canvas分形树阴影模糊不均、线条粗细异常的问题求助

分形树Canvas绘制问题排查与解决

问题1:左侧分支线条偏粗、阴影过重

你的递归逻辑确实存在错误:处理"]"符号时,ctx.restore()已经恢复了"["时保存的画布状态(包括旋转角度),但你额外执行了ctx.rotate(Math.PI / 4),这会导致角度错误叠加,最终让左侧分支被重复绘制多次,造成线条变粗、阴影叠加变重的效果。

问题2:独立路径后阴影效果消失

当你把beginPath()移入递归后,每条分支成为独立路径,阴影本该正常生效,但因为问题1的画布状态混乱才导致异常。修复问题1后,阴影就能正常显示。

修复后的完整代码

generateFractal(ctx, grammar, sentence, branchSize) {
    ctx.translate(canvas.width / 2, canvas.height);
    ctx.shadowColor = "teal";
    ctx.shadowBlur = 14;
    const drawRecursive = (ctx, sentence, idx, branchSize) => {
      if (idx === sentence.length) return;
      if (sentence[idx] === "1" || sentence[idx] === "0") {
        ctx.beginPath();
        ctx.moveTo(0, 0);
        ctx.lineTo(0, -branchSize);
        ctx.stroke();
        ctx.translate(0, -branchSize);
        // 单线段不需要closePath,否则会产生多余的闭合连线
      } else if (sentence[idx] === "[") {
        ctx.save();
        ctx.rotate(-Math.PI / 4);
      } else if (sentence[idx] === "]") {
        ctx.restore();
        // 移除错误的额外旋转操作
      }
      drawRecursive(ctx, sentence, idx + 1, branchSize);
    };
    drawRecursive(ctx, sentence, 0, branchSize);
  }

核心修复说明

  • 删除"]"后的多余旋转:ctx.restore()会直接回退到分支保存的初始画布状态,手动旋转会导致角度偏移,重复绘制同一路径。
  • 移除不必要的closePath():单条线段不需要闭合路径,否则会自动连接起点和终点,出现多余线条。
  • 阴影效果自动恢复:修复状态错误后,每条独立路径的stroke()都会应用你预先设置的阴影参数,阴影效果自然正常显示。

内容的提问来源于stack exchange,提问作者Andrew Song

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.12 00:06:15