将SVGpath转换为线段

我正在尝试将SVGpath转换为Node中的点列表。 我使用elementtree来parsingSVG文件。

d是path的定义,getPos简单地将“x,y”转换为带有x和ay的对象,doLine只是简单地将该坐标添加到列表中。

d = path.get('d') words = d.split(' ') oldPos = undefined startPos = undefined for i in [0..words.length] word = words[i] if word == 'm' or word == 'M' oldPos = getPos(words[i + 1]) startPos = getPos(words[i + 1]) i += 1 else if word == 'l' or word == 'L' console.log('done nothing...') else if word == 'z' or word == 'Z' doLine(oldPos, startPos) else if word pos = getPos(word) doLine(oldPos, pos) oldPos = pos 

目前,这似乎不能正常工作。

我知道我的path永远不会有曲线,所以我不需要担心这一点。

我不确定SVG的标准,所以如果任何人都可以帮助我,那将是很多的感谢。

SVG包含自己的path段parsing器 ,为什么重新发明轮子。 尝试build立在此: http : //jsfiddle.net/longsonr/skWH5/

在gecko中,path从开头开始parsing,读取一个非空白字符,然后使用一个期望的参数数量的表格来读取这么多的数字(最多可以有一个逗号分隔它们)。 这一直持续到string的结尾。

我不熟悉coffeescript,但是你的代码似乎有一些问题。

  • 最重要的是,你的i + = 1似乎只发生在字=='m或'M'的情况下,所以我以为你大部分时间都会陷入循环。

  • 其次,如果word =='l'或'L',你似乎没有做任何事情,但是当你想添加一个节点的时候, 如果你没有曲线,那么你肯定有线条,除非你只是使用水平线或垂直线。 您还需要更新您的当前位置,并根据是相对命令还是绝对命令进行不同的更改。

  • 最后,你可能不应该用空格分割,因为d="M90,20L100,30L110,20z"是一个有效的path。 你说你知道你的道路上没有曲线,所以也许你也知道你所有的path都会被空间分割。 在这种情况下,这很公平,但值得铭记。

希望有一些帮助。