如何在 Inkscape 中用精确坐标定位贝塞尔手柄
要在 Inkscape 中用精确坐标定位贝塞尔手柄,请使用 XML 编辑器修改路径 d 属性中的控制点值。对于使用大写 C 表示的三次曲线,前两组坐标指定手柄;最后一组指定端点。W3C:路径
本教程适用于正在完善角色轮廓、并且已经知道曲线手柄应位于何处的用户。示例使用一条简单的双节点曲线,然后说明如何将相同的方法应用于现有路径,同时保留其余线段。
为什么节点工具的 X/Y 字段无法定位手柄?
节点工具的坐标字段用于更改所选节点的位置。贝塞尔手柄是独立的控制点,用于调整节点旁边的曲线。因此,在工具栏中输入预期的手柄坐标,会更改几何形状中的错误部分。Inkscape 入门指南明确指出,这些字段表示所选节点的坐标。节点工具选项
使用节点工具在视觉上找到曲线:按 N,选择路径,然后选择一个节点。它的手柄会显示为小圆圈,并由细线连接到节点。你要编辑数值位置的就是这些圆圈。使用节点工具编辑路径
如何确认正确的手柄坐标?
一段三次贝塞尔曲线包含一个起始节点、两个控制点和一个终止节点。在 SVG 路径数据中,起始节点由前一条命令提供。接着,大写 C 按顺序提供两个控制点和端点。W3C:三次贝塞尔曲线命令
来看这个示例 d 属性值:
M 40 120 C 40 40 200 40 200 120
数值的含义如下:
| 部分 | 坐标 | 含义 |
|---|---|---|
M 40 120 |
(40, 120) |
起始节点 |
C 后的第一组数值 |
(40, 40) |
起始节点的出射手柄 |
C 后的第二组数值 |
(200, 40) |
终止节点的入射手柄 |
C 后的第三组数值 |
(200, 120) |
终止节点 |
实际操作时,先将 C 后的六个数值分成三组,再进行任何编辑。若要移动一个手柄,同时保留两个节点,只需更改对应的那组数值。MDN 的 SVG 教程也介绍了相同的顺序,并说明控制点如何决定曲线在各端点附近的方向。MDN:路径
如何在 XML 编辑器中输入精确坐标?
首次尝试时,可以使用这份完整的 SVG 文档。在纯文本编辑器中将其保存为 exact-curve.svg,然后用 Inkscape 打开。文档中只有一条普通路径,没有群组、变换或路径效果。
<svg xmlns="http://www.w3.org/2000/svg"
width="240" height="160"
viewBox="0 0 240 160">
<path id="curve"
d="M 40 120 C 40 40 200 40 200 120"
fill="none"
stroke="black"
stroke-width="2" />
</svg>
我使用 Python 检查了示例的 XML 结构和下方的坐标计算。未实际操作桌面应用。
- 在 Inkscape 中选择曲线。
- 按
Ctrl+Shift+X打开 XML 编辑器,这是文档中列出的默认快捷键。 - 在 XML 树中选择由
id="curve"标识的路径元素。 - 选择其
d属性并编辑属性值。 - 按
Ctrl+Enter应用该值,或点击对话框中的设置属性控件。这些命令记录在 Inkscape 自己的快捷键参考中。Inkscape 键盘和鼠标参考
例如,将第一个手柄从 (40, 40) 改为 (70, 30),请输入以下属性值:
M 40 120 C 70 30 200 40 200 120
只将路径数据字符串粘贴到值字段中,不要包含 d=、引号或完整的 <path> 元素。保持起始坐标对、第二个控制点坐标对和终止坐标对不变。这样只会编辑一个手柄,便于检查。
切换回节点工具并选择起始节点。先在视觉上检查手柄的新方向,然后再次检查 d 的值,确认数值正确。对于现有的多段轮廓,请保留周围的命令,只编辑相关的控制点坐标对;若用这个简短示例替换整个属性,就会替换整条轮廓。
这些数值使用什么坐标系?
路径数据坐标使用 SVG 用户单位。文档的 viewBox 和变换决定这些单位如何映射到可见图形。初始 SVG 坐标系的原点位于左上角,X 轴向右递增,Y 轴向下递增。W3C:坐标系、变换和单位
在给出的示例中,240 × 160 视口和 viewBox="0 0 240 160" 提供了直接的坐标映射。从 (40, 40) 移至 (70, 30),表示控制点向右移动 30 个单位、向上移动 10 个单位。这些只是示例设计坐标,并非特定角色形状的规定。
对于现有文档,在将路径的局部坐标视为页面位置之前,请检查路径及其父级群组中的 transform 属性。例如,单独的 translate(30,20) 会将局部手柄 (70,30) 映射到父坐标系中的 (100,50)。若要在该平移下到达 (100,50),需在局部坐标中输入 (70,30)。若还涉及缩放、旋转或其他祖先元素的变换,则需要考虑完整的坐标映射。W3C:坐标系和变换
如果路径使用小写 `c` 或简写 `S`,该怎么办?
小写 c 存储的是相对于线段起点的偏移量。三组坐标都以同一个起点为基准;它们不是从一个控制点到下一个控制点的连续位移。大写 C 存储的是当前用户坐标系中的绝对坐标。W3C:三次贝塞尔曲线命令
对于原始示例,从每个后续点中减去起始节点 (40,120):
| 点 | 绝对位置 | 相对偏移量 |
|---|---|---|
| 第一个手柄 | (40,40) |
(0,-80) |
| 第二个手柄 | (200,40) |
(160,-80) |
| 端点 | (200,120) |
(160,0) |
因此,对应的属性值为:
M 40 120 c 0 -80 160 -80 160 0
不要保留这些数值,只把 c 改为大写:这样会改变数值的含义。编辑较长的相对路径时,请先计算当前线段的起点。
S 线段会省略第一个控制点。若它紧跟在三次曲线之后,SVG 会通过将前一线段的末控制点围绕两段共用节点反射,来推算这个控制点。若要独立指定两个控制点,请将简写展开为明确的 C 线段,并在开始时保留计算得出的第一个控制点。MDN:路径
节点类型会如何影响后续的手柄调整?
Inkscape 的节点类型会限制后续的交互式编辑。尖角节点允许独立移动手柄。平滑节点会使两个手柄与节点保持在同一直线上。对称节点还会使两个手柄到节点的距离相等。自动平滑节点则会在移动节点时自动调整手柄长度。关于节点类型
在最终设置数值之前,先选择所需的节点行为。若要分别指定控制点,尖角节点是一个实用的选择。若要形成流畅的连接,请为共用节点两侧规划好兼容的坐标,然后在转换节点类型后检查最终数值。
例如,假设共用节点位于 (200,120),其入射控制点位于 (200,40)。位于 (200,200) 的出射控制点是该点绕共用节点的反射位置:2 × (200,120) − (200,40)。这个示例计算得出长度相等、方向相反的手柄向量,可用于具体检查对称连接的坐标。
如果编辑结果看起来不对,该如何检查?
按顺序检查以下各项:
- 确认元素。 更改属性之前,检查所选路径的 ID。
- 确认坐标对。 如有需要,在纸上标出起始节点、第一个控制点、第二个控制点和端点。
- 查看命令字母。 确认数值表示的是绝对坐标、相对坐标还是简写。
- 检查坐标映射。 检查
viewBox、路径变换和父级变换。 - 检查后续编辑。 拖动手柄或更改节点类型后,重新检查坐标。
- 保留原始值。 复制完整的
d字符串,以便在编辑误改其他线段时还原。
完成角色轮廓的精细调整后,请同时检查可见轮廓和保存的控制点坐标。明确命令类型和坐标系后,精确定位手柄就只需几个可追踪的步骤:找到线段,修改目标坐标对,然后验证结果。
