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

JavaScript Canvas线条绘制异常:点击按钮出现多余线条求助

问题修复:Canvas线条绕圆移动时出现多余线条

问题原因

代码里的drawCircle函数每次绘制圆形时,没有调用ctx.beginPath()重置路径,导致路径不断累积。再加上setInterval(drawCircle, 0)的高频调用,当线条移动到圆形下半部分并顺时针转动时,累积的路径就会被渲染成多余线条。

修复后的代码

JavaScript部分

var pos = 0; // 全局变量
var inc = 0.1;
function clockwise() {
  pos -= inc;
  drawCircle();
}
function counter() {
  pos += inc;
  drawCircle();
}
var canvas = document.getElementById("canvas");
var ctx = canvas.getContext("2d");
var radius = canvas.height / 2;
ctx.translate(radius, radius);
radius = radius * 0.9;

// 移除不必要的高频定时器,按钮点击已触发绘制
// setInterval(drawCircle, 0);

function drawCircle() {
  ctx.beginPath(); // 新增:重置路径,避免路径累积
  ctx.arc(0, 0, radius, 0, 2 * Math.PI);
  ctx.fillStyle = "white";
  ctx.fill();
  drawHand(ctx, pos, radius * 0.9, radius * 0.02);
}
function drawHand(ctx, pos, length, width) {
  ctx.beginPath();
  ctx.lineWidth = width;
  ctx.lineCap = "round";
  ctx.moveTo(0, 0);
  ctx.rotate(pos);
  ctx.lineTo(0, -length);
  ctx.stroke();
  ctx.rotate(-pos);
}

HTML部分

<p><b1 id="left" onclick="clockwise()">counter-clockwise</b1></p>                 
<p><b3 id="right" onclick="counter()">clockwise</b3></p>
<canvas id="canvas" width="240" height="240" style="background-color:transparent"></canvas>

关键修改点

  • 在drawCircle函数开头添加ctx.beginPath(),确保每次绘制圆形都是独立的新路径,不会和之前的路径叠加渲染。
  • 移除setInterval(drawCircle, 0),按钮点击已经会触发绘制逻辑,高频定时器只会造成不必要的重复重绘,徒增性能消耗。

内容的提问来源于stack exchange,提问作者Travis Grudzinskas

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.06 19:20:11