SVG路径规范:moveTo和implicit lineTo

时间:2015-03-25 09:05:30

标签: svg language-specifications

我正在尝试编写一个小的SVG路径解析器/规范化器,并获得了规范的最后一个问题:

据我所知,大多数命令都支持其他隐式命令,当它们这样做并且处于相对模式时,“当前点”将在最后一个隐式命令之后更新,而不是在它们之间。

但是“moveTo”命令是特殊的,允许隐式的“lineTo”命令。而“lineTo”命令自动只会在最后一个隐式命令后更新“当前点”:

  

从当前点到给定(x,y)坐标绘制一条线   成为新的当前点。 L(大写)表示绝对   坐标将遵循; l(小写)表示相对   坐标将随之而来。许多坐标对可以是   指定绘制折线。在命令的最后,新的   当前点设置为提供的最终坐标集。

我不确定带有额外“lineTo”的“moveTo”是什么。 SVG Path Spec的摘录:

  

在给定(x,y)坐标处开始新的子路径。 M(大写)   表示绝对坐标将遵循; m(小写)   表示将遵循相对坐标。如果移动是   接着是多对坐标,后续对是   被视为隐式lineto命令。因此,隐含的lineto命令   如果moveto是相对的则是相对的,如果moveto是相对的则是绝对的   是绝对的。如果相对moveto(m)作为第一个元素出现   路径,然后它被视为一对绝对坐标。在   在这种情况下,后续的坐标对被视为相对的   即使最初的移动被解释为绝对的移动。

特别是最后一句话令人困惑。

更糟糕的是,在SVGTiny Path Spec他们写了另一个描述,而几乎所有其他内容都是相同的:

  

应开始给定(x,y)坐标处的新子路径。这个   还应在给定坐标处建立新的当前点。如果一个   然后,相对'moveto'(m)作为'path'的第一个元素出现   它应被视为一对绝对坐标。如果'moveto'是   然后是多对坐标,后续对应   被视为隐含的'lineto'命令。

这是否意味着“当前点”在两者之间进行更新(这与其他所有内容不一致),还是只是在新版本中更正的模糊描述?

1 个答案:

答案 0 :(得分:2)

好吧,这一切对我来说都很清楚。

以下是用于绘制两个方形(100px×100px)框的两种模式的图示。第一个使用绝对坐标,第二个使用相对坐标。正如规范所述,当第一个坐标用小写的'm'指定时,它被视为绝对坐标,但它后面的所有坐标都被视为相对坐标。

<svg widtn="250" height="140" viewBox="0 0 250 140">
  <g fill="none" stroke-width="5">
    <!-- 1. Move with implicit LineTo (absolute) -->
    <path d="M10,10 110,10 110,110 10,110z" stroke="blue" />
    <!-- 2. Move with implicit LineTo (relative) -->
    <path d="m120,10 100,0 0,100 -100,0z" stroke="red" />
    </g>
  </svg>