路径与曲线

Canvas路径与曲线教程,掌握路径绑制和贝塞尔曲线的使用方法。路径是Canvas绑制的核心概念。几乎所有复杂图形都需要通过路径来绑制,包括曲线、不规则形状等。

什么是路径

路径是由一系列点组成的线条集合。可以把路径想象成画笔的运动轨迹:

  • 画笔抬起移动
  • 画笔落下画线
  • 画笔画弧
  • 画笔画曲线

路径绑制流程

ctx.beginPath()    // 开始新路径
// ... 绑制操作 ...
ctx.closePath()    // 闭合路径(可选)
ctx.fill()         // 填充
// 或
ctx.stroke()       // 描边

曲线类型

Canvas支持两种贝塞尔曲线:

曲线类型方法控制点数量用途
二次贝塞尔曲线quadraticCurveTo1个简单曲线、抛物线
三次贝塞尔曲线bezierCurveTo2个复杂曲线、S形曲线

路径基础演示

路径绘制演示

使用路径绑制的折线图形

贝塞尔曲线对比

二次贝塞尔曲线

三次贝塞尔曲线

路径与形状的关系

所有复杂形状都由路径组成:

路径操作
├── 直线类:moveTo, lineTo, closePath
├── 弧线类:arc, arcTo
├── 曲线类:quadraticCurveTo, bezierCurveTo
└── 矩形:rect(作为路径)

路径状态

路径本身不会被保存,每次beginPath都会清除之前的路径:

// 错误示例
ctx.beginPath()
ctx.moveTo(50, 50)
ctx.lineTo(100, 100)
ctx.stroke()

// 这里路径已被清除
ctx.lineTo(200, 100)  // 无效,需要重新beginPath
ctx.stroke()

填充规则

fill方法可以指定填充规则:

ctx.beginPath()
ctx.arc(100, 100, 50, 0, Math.PI * 2)
ctx.arc(100, 100, 30, 0, Math.PI * 2)
ctx.fill('evenodd')  // 奇偶规则,形成圆环

两种填充规则:

规则说明效果
nonzero非零环绕规则默认,填充所有封闭区域
evenodd奇偶规则交替填充,适合镂空效果

填充规则演示

nonzero(默认)

evenodd