附录 B: 实施说明

B.1. 引言

以下说明描述了软件开发人员在将内容转换为SVG语言特性所需格式时可以使用的算法和其他策略。

B.2. 椭圆弧参数转换

为了与其他路径段符号保持一致,SVG路径中的弧是根据曲线上的起始点和终止点定义的。

这种椭圆弧的参数化将被称为端点参数化。端点参数化的一个优点是它允许所有路径命令以新“当前点”的坐标结束,从而实现一致的路径语法。

然而,这并不是描述软件或数学中弧几何的唯一方法。本节描述了替代的中心参数化,以及如何从SVG的端点参数化转换到该参数化。

B.2.1. 椭圆弧端点语法

椭圆弧在SVG路径命令中由以下参数按顺序描述:

(x1y1) 是路径上当前点的绝对坐标,来自上一个路径命令的最后两个参数。

rxry是椭圆的半径(也称为其半长轴和半短轴)。

φ是当前坐标系的x轴与椭圆的x轴之间的角度。

fA是大弧标志,如果选择的弧跨度小于或等于180度则为0,选择的弧跨度大于180度则为1。

fS是扫掠标志,如果连接中心到弧的线通过递减角度扫掠则为0,如果通过递增角度扫掠则为1。

(x2y2)是弧的最终点的绝对坐标。

B.2.2. 参数化替代方案

椭圆弧上的任意点(xy)可以通过二维矩阵方程描述:

(eq. 3.1)
( x y ) = ( cos φ - sin φ sin φ cos φ ) · ( r x cos θ r y sin θ ) + ( c x c y )
    x = rx*cos(θ)*cos(φ) - ry*sin(θ)*sin(φ) + cx
    y = rx*cos(θ)*sin(φ) + ry*sin(θ)*cos(φ) + cy
  

(cxcy) 是椭圆中心的坐标。

rxry 是椭圆的半径(也称为其半长轴和半短轴)。

φ 是当前坐标系的x轴与椭圆的x轴之间的角度。

θ 是点 (xy) 所在的弧的角度,范围为:

如果将椭圆视为经过拉伸和旋转的圆,则 θ1θ2 和 Δθ 分别是弧在拉伸和旋转操作之前的起始角度、结束角度和扫掠角度。这导致了一种在图形API中常见的替代参数化,将被称为中心参数化。在接下来的章节中,将给出中心参数化和端点参数化之间双向映射的公式。

B.2.3. 从中心到端点参数化的转换

给定以下变量:

cx cy rx ry φ θ1 Δθ

任务是找到:

x1 y1 x2 y2 fA fS

这可以通过以下公式实现:

x 1 y 1 = cos φ - sin φ sin φ cos φ r x   cos θ 1 r y   sin θ 1 + c x c y
(eq. 4.1)
x 2 y 2 = cos φ - sin φ sin φ cos φ r x   cos θ 1 + Δ θ r y   sin θ 1 + Δ θ + c x c y
(eq. 4.2)
f A = 1     if     Δ θ > 180 ° 0     if     Δ θ 180 °
(eq. 4.3)
f S = 1    if    Δ θ   >   0 ° 0    if    Δ θ   <   0 °
(eq. 4.4)

B.2.4. 从端点到中心参数化的转换

给定以下变量:

x1 y1 x2 y2 fA fS rx ry φ

任务是找到:

cx cy θ1 Δθ

方程在将原点放置在连接 (x1y1) 和 (x2y2) 的线段的中点之后会简化,接着进行旋转以使坐标轴与椭圆的轴对齐。所有变换后的坐标将用撇号表示。它们作为中间值被计算,以找到所需的中心参数化变量。该过程包括以下步骤:

B.2.5. Correction of out-of-range radii

本节描述了对超出范围的 rxry 进行数学调整的必要性,如路径实现说明中所述。 算法上,这些调整包括以下步骤:

B.3. 高精度几何生成说明

本节为信息性内容。

SVG 的 实数精度 为单精度。 符合标准的 SVG 生成器 处理超过单精度的信息时, 如地图和技术图纸, 鼓励遵循本节中概述的过程,以确保在 符合标准的 SVG 查看器 中一致显示。

通过利用生成 CTM 时必须使用至少双精度浮点数的事实,可以获得有效精度高于单精度的表现(请参见 符合标准的 SVG 查看器 部分中的 CTM 生成处理)。 生成内容的步骤如下:

  1. 将内容拆分为瓷砖,以便在瓷砖内定位和大小每个对象所需的有效数字数量在单精度浮点数范围内。此外,在本描述中,原始内容的坐标系统将称为源空间。
  2. 为每个瓷砖生成一个坐标变换矩阵,以将源空间转换为瓷砖空间,其中瓷砖空间的原点 (0,0) 位于瓷砖的左上角。变换矩阵的每个元素必须在单精度范围内。
  3. 使用生成的坐标变换矩阵,将每个瓷砖的内容从源空间转换为瓷砖空间。结果是,每个对象的参数现在可以用单精度浮点数范围内的有效数字表示。
  4. 为每个瓷砖生成一个逆变换矩阵,以便将瓷砖空间转换为源空间。这被用作下一步瓷砖元素的 transform 属性。
  5. 将每个瓷砖安排为 SVG 中的单独用户坐标系统。例如,瓷砖可以表示为 g 元素,带有由上一步生成的变换矩阵的 transform 属性。第三步生成的拆分图形将作为它的子元素放置。
拆分大于瓷砖的矢量图形示例
拆分前       拆分后
拆分前示例       拆分后示例
提高有效数字的示例
步骤 1 : 拆分内容       步骤 5 : 以更小的有效数字和适当的平移安排瓷砖
拆分内容到瓷砖示例       平移并分配拆分内容示例
此示例使用具有七位数字的用户坐标系统,通过瓷砖提供了八位数字的有效数字。