理解 SVG 路径命令
复现 SVG path 教程的逐步绘制方式,把 d 属性拆成可执行的移动、直线、曲线与闭合命令。
问题
SVG 图标里的 d 属性常像一段压缩咒语:字母与数字黏在一起,很难看出图形如何生成。若把它重新排成命令序列,浏览器做的事其实很朴素——维护当前画笔位置,并按顺序执行移动、画线、画曲线和闭合操作。
M 28 94L 72 34C 104 8 148 26 158 62L 204 94Z
M 28 94 L 72 34M 28 94 l 72 34大写 L 前往绝对坐标 (72,34);小写 l 从当前位置偏移 (72,34)。
0 条命令:画笔还没有移动。
直觉
命令字母像函数名,后面的数字像参数。M x y 移动画笔但不落墨,L x y 连接直线,C 用两个控制点和一个终点生成三次贝塞尔曲线,Z 回到当前子路径的起点。拖动滑块时,图形不是一次“出现”,而是命令累积的结果。
大小写决定坐标系。大写命令读取 SVG 原点下的绝对坐标;小写命令把参数视为相对当前点的位移。相同的 72 34 因此可能指向 (72,34),也可能从 (28,94) 走到 (100,128)。
形式化
画笔状态记为当前位置 与子路径起点 。绝对直线更新为 ,相对直线则为:
三次贝塞尔曲线由起点 、控制点 和终点 决定。用三次 Bernstein 基函数 可紧凑写成:
结果
逐步执行器让命令列表、当前画笔和最终轮廓保持同步。读者可先只执行 M,确认“移动不绘制”;再加入 L 和 C,观察每条命令只负责路径的一段;最后用 Z 闭合并产生可填充区域。
限制
样稿没有覆盖水平/垂直线、二次曲线、平滑曲线与椭圆弧,也没有实现完整 path parser。控制点没有拖拽编辑,坐标网格仅用于解释,不承担像素级设计工具的职责。
来源
- 结构参考:Understanding SVG Paths,NaN。
- 路径、图形与中文说明为本站重新设计,用于检验原生 SVG 在研究室叙事中的表现。