Превратите путь SVG в отрезки - PullRequest
1 голос
/ 02 февраля 2012

Я пытаюсь превратить путь SVG в список точек в узле. Я использую elementtree для разбора файла SVG.

d - это определение пути, getPos просто превращает «x, y» в объект с x и y, 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

В настоящее время, похоже, это работает неправильно.

Я знаю, что на моем пути никогда не будет кривых, поэтому мне не нужно об этом беспокоиться.

Я не уверен в стандарте SVG, так что если кто-нибудь сможет мне помочь, это будет большое спасибо.

Ответы [ 2 ]

4 голосов
/ 02 февраля 2012

SVG содержит собственный сегмент пути парсер , так что зачем изобретать велосипед.Попробуйте построить на этом: http://jsfiddle.net/longsonr/skWH5/

В гекконе путь анализируется, начиная с начала, читая один непробельный символ, затем используя таблицу числа ожидаемых аргументов, которые следуют знатьчитать очень много чисел (которые могут иметь до одной запятой, разделяющей их).Это продолжается до конца строки.

1 голос
/ 02 февраля 2012

Я не знаком с coffeescript, но, похоже, есть несколько проблем с вашим кодом.

  • Самое главное, кажется, что ваш i + = 1 происходит только в том случае, если слово == 'm или' M ', поэтому я бы подумал, что большую часть времени вы застреваете в цикле.

  • Во-вторых, вы, кажется, ничего не делаете, если слово == 'l' или 'L', и я хотел бы, чтобы именно тогда вы захотели добавить узел. Если у вас нет кривых, то, конечно, у вас есть линии, если только вы не используете горизонтальные или вертикальные линии. Вам также необходимо обновить текущую позицию и сделать это по-разному в зависимости от того, является ли это относительной или абсолютной командой.

  • Наконец, вам, вероятно, не следует разбивать пробел, поскольку d="M90,20L100,30L110,20z" является допустимым путем. Вы говорите, что знаете, что на вашем пути не будет кривых, поэтому, возможно, вы также знаете, что все ваши пути будут разделены пробелами. В этом случае это достаточно справедливо, но, возможно, стоит иметь в виду.

Надеюсь, это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...