以下说明描述了软件开发人员在将内容转换为SVG语言特性所需格式时可以使用的算法和其他策略。
为了与其他路径段符号保持一致,SVG路径中的弧是根据曲线上的起始点和终止点定义的。
这种椭圆弧的参数化将被称为端点参数化。端点参数化的一个优点是它允许所有路径命令以新“当前点”的坐标结束,从而实现一致的路径语法。
然而,这并不是描述软件或数学中弧几何的唯一方法。本节描述了替代的中心参数化,以及如何从SVG的端点参数化转换到该参数化。
椭圆弧在SVG路径命令中由以下参数按顺序描述:
(x1, y1) 是路径上当前点的绝对坐标,来自上一个路径命令的最后两个参数。
rx和ry是椭圆的半径(也称为其半长轴和半短轴)。
φ是当前坐标系的x轴与椭圆的x轴之间的角度。
fA是大弧标志,如果选择的弧跨度小于或等于180度则为0,选择的弧跨度大于180度则为1。
fS是扫掠标志,如果连接中心到弧的线通过递减角度扫掠则为0,如果通过递增角度扫掠则为1。
(x2, y2)是弧的最终点的绝对坐标。
椭圆弧上的任意点(x, y)可以通过二维矩阵方程描述:
(eq. 3.1)x = rx*cos(θ)*cos(φ) - ry*sin(θ)*sin(φ) + cx y = rx*cos(θ)*sin(φ) + ry*sin(θ)*cos(φ) + cy
(cx, cy) 是椭圆中心的坐标。
rx 和 ry 是椭圆的半径(也称为其半长轴和半短轴)。
φ 是当前坐标系的x轴与椭圆的x轴之间的角度。
θ 是点 (x, y) 所在的弧的角度,范围为:
如果将椭圆视为经过拉伸和旋转的圆,则 θ1、θ2 和 Δθ 分别是弧在拉伸和旋转操作之前的起始角度、结束角度和扫掠角度。这导致了一种在图形API中常见的替代参数化,将被称为中心参数化。在接下来的章节中,将给出中心参数化和端点参数化之间双向映射的公式。
给定以下变量:
cx cy rx ry φ θ1 Δθ
任务是找到:
x1 y1 x2 y2 fA fS
这可以通过以下公式实现:
|
(eq. 4.1) |
|
(eq. 4.2) |
|
(eq. 4.3) |
|
(eq. 4.4) |
给定以下变量:
x1 y1 x2 y2 fA fS rx ry φ
任务是找到:
cx cy θ1 Δθ
方程在将原点放置在连接 (x1, y1) 和 (x2, y2) 的线段的中点之后会简化,接着进行旋转以使坐标轴与椭圆的轴对齐。所有变换后的坐标将用撇号表示。它们作为中间值被计算,以找到所需的中心参数化变量。该过程包括以下步骤:
步骤 1:计算 (x1′, y1′)
|
(eq. 5.1) |
步骤 2:计算 (cx′, cy′)
|
(eq. 5.2) |
当 fA ≠ fS 时选择 + 符号,如果 fA = fS 时选择 − 符号。
步骤 3:计算 (cx, cy) 从 (cx′, cy′)
|
(eq. 5.3) |
步骤 4:计算 θ1 和 Δθ
一般来说,两个向量 (ux, uy) 和 (vx, vy) 之间的角度可以计算为
|
(eq. 5.4) |
这里出现的 ± 符号是 ux vy − uy vx 的符号。
这个角度函数可以用来表示 θ1 和 Δθ 如下:
|
(eq. 5.5) |
|
(eq. 5.6) |
其中 Δθ 固定在范围内 −360° < Δθ < 360°,使得:
如果 fS = 0,则 Δθ < 0,
否则如果 fS = 1,则 Δθ > 0。
换句话说,如果 fS = 0 并且 (eq. 5.6) 的右侧大于 0,则减去 360°, 而如果 fS = 1 并且 (eq. 5.6) 的右侧小于 0,则加上 360°。在所有其他情况下保持不变。
本节描述了对超出范围的 rx 和 ry 进行数学调整的必要性,如路径实现说明中所述。 算法上,这些调整包括以下步骤:
步骤 1:确保半径非零
如果 rx = 0 或 ry = 0,则将其视为从 (x1, y1) 到 (x2, y2) 的直线,并停止。否则,
步骤 2:确保半径为正
取 rx 和 ry 的绝对值:
|
(eq. 6.1) |
步骤 3:确保半径足够大
使用方程 (eq. 5.1) 的带撇号的坐标值,计算
|
(eq. 6.2) |
如果上述方程的结果小于或等于 1,则无需对 rx 和 ry 进行进一步更改。如果上述方程的结果大于 1,则进行替换
|
(eq. 6.3) |
步骤 4:继续进行计算
继续进行剩余的椭圆弧计算,例如 从端点到中心参数化的转换 算法。 注意:由于本节中的半径修正,方程 (5.2) 对于椭圆的中心总是至少有一个解(即根数从不为负)。如果使用方程 (eq. 6.3) 扩大半径,则 (eq. 5.2) 的根数为零,椭圆的中心恰好有一个解。
本节为信息性内容。
SVG 的 实数精度 为单精度。 符合标准的 SVG 生成器 处理超过单精度的信息时, 如地图和技术图纸, 鼓励遵循本节中概述的过程,以确保在 符合标准的 SVG 查看器 中一致显示。
通过利用生成 CTM 时必须使用至少双精度浮点数的事实,可以获得有效精度高于单精度的表现(请参见 符合标准的 SVG 查看器 部分中的 CTM 生成处理)。 生成内容的步骤如下:
拆分前 | 拆分后 | |
---|---|---|
![]() |
![]() |
步骤 1 : 拆分内容 | 步骤 5 : 以更小的有效数字和适当的平移安排瓷砖 | |
---|---|---|
![]() |
![]() |
|
此示例使用具有七位数字的用户坐标系统,通过瓷砖提供了八位数字的有效数字。 |