arc()不显示图形需检查:是否调用beginpath()、设置strokestyle/fillstyle、执行stroke()/fill();半径非正或角度单位错误(须用弧度);anticlockwise方向影响路径长度;arc()与arcto()用途完全不同。

arc() 画不出东西?先检查路径和绘制触发
调用 arc() 本身不会在画布上显示任何图形,它只是把一段圆弧“添加进当前路径”。如果没调 beginPath()、没设 strokeStyle 或 fillStyle、也没执行 stroke() 或 fill(),那就必然空白。
- 必须在
arc()前调beginPath(),否则弧会追加到旧路径里(可能被覆盖或干扰) - 半径为
0、NaN或负数时,arc()静默失败——不报错,也不画 - 若只调
arc()+stroke()但没设strokeStyle,默认是黑色;但若 canvas 背景也是黑的,就等于“画了却看不见”
角度单位是弧度,不是度数
写 arc(100, 100, 50, 0, 90, false) 是典型错误:90 是 90 弧度(≈5157°),不是 90°。浏览器会按这个超大角度画弧,结果常是一圈多的杂乱线段,甚至看起来像没画。
- 90° →
Math.PI / 2 - 180° →
Math.PI - 360° →
2 * Math.PI - 可封装工具函数:
function deg2rad(deg) { return deg * Math.PI / 180; },然后写arc(x, y, r, deg2rad(0), deg2rad(270))
anticlockwise 参数控制方向,不改变角度含义
anticlockwise 是布尔值,默认 false(顺时针)。它只决定从 startAngle 到 endAngle 的“走法”,不影响角度数值本身的起点(始终是正 x 轴,即 3 点钟方向)。
-
arc(100, 100, 50, 0, Math.PI/2, false):从 0 弧度(3 点)顺时针画到 π/2(6 点),得 1/4 圆(右下象限) -
arc(100, 100, 50, 0, Math.PI/2, true):从 0 弧度逆时针画到 π/2,实际绕了 3/4 圆(经 12 点→9 点→6 点),终点一样但路径更长 - 当
startAngle > endAngle时,false仍会顺时针跨过 0 弧度继续走(比如arc(x,y,r,Math.PI,0,false)会画下半圆)
arc() 和 arcTo() 完全不是一回事
别因为名字带 “arc” 就以为 arcTo() 是 arc() 的变体。它俩参数逻辑、用途、依赖条件都不同,混用必出错。
-
arc()是“中心定义法”:你提供圆心、半径、起止角,它画对应圆弧 -
arcTo(x1, y1, x2, y2, radius)是“切线连接法”:它不接受圆心或角度,而是基于当前路径终点、两个切点坐标和半径,自动算出相切圆弧并追加——调用前必须有已设定的路径起点(如用过moveTo()或lineTo()) - 想画独立圆/饼图/仪表盘 → 用
arc() - 想给矩形加圆角、连两段直线成平滑拐弯 → 用
arcTo()
真正容易被忽略的是:arc() 的五个参数中,startAngle 和 endAngle 的差值决定了弧长,但这个差值在 anticlockwise = false 时,浏览器会自动取“最小正角跨度”来顺时针走;而设为 true 后,它就老老实实逆时针走完整差值——哪怕差值是负的,也会先归一化再算。这导致同样两个角度,方向一换,弧可能完全不在预期位置。
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!











