Команда SVG "Move": абсолютный путь к относительному пути - PullRequest
1 голос
/ 06 июля 2011

У меня есть SVG-путь, созданный в Inkscape, который представляет собой одну команду Move ("M ... z").Прописная буква «M» в соответствии со спецификацией SVG указывает абсолютный путь, однако для моего приложения мне требуются относительные пути.

Что такое алгоритм для преобразования абсолютного пути в относительный путь?Должен ли я начинать с последних координат x и y и, соответственно, вычитать предыдущее значение, пока не доберусь до начала значений?Бонусные баллы за:

  • Преобразование пути в относительный для меня (meh)
  • Предоставление ссылки на какой-либо ресурс, который будет конвертировать между абсолютным и относительным путями SVG ИЛИ указывая накак это сделать с Inkscape (я искал список рассылки и обнаружил, что другие пользователи говорили о необходимости перекомпиляции из исходного кода, чтобы добавить опцию вручную: |)
  • Предоставление однострочника jquery, который преобразует aboslute вотносительный и наоборот

Рассматриваемый путь - это взрыв звездного взрыва:

M 9.6428572,4.8214285 17.857142,19.285714 0.89285714,22.142857 17.678572,29.285714 1.9642857,41.071429 23.75,37.678572 26.071429,49.285714 37.321428,38.75 47.5,48.392857 51.607143,37.5 61.964286,48.214286 62.321429,34.285714 78.392857,37.857143 64.107143,24.464286 81.071428,21.607143 63.928571,17.857143 70.535714,3.5714284 54.821429,12.142857 50,1.2499999 40.535714,10.714286 31.607143,0.89285704 28.035714,13.928571 z

Я искал в СЦ похожие вопросы, но нашел только вопросы оПути к ОС или относительно абсолютных путей SVG (и ни один из них специально не спрашивал об алгоритме для этого).Если это дубликат, не стесняйтесь закрыть его.

Спасибо!

1 Ответ

3 голосов
/ 06 июля 2011

РЕДАКТИРОВАТЬ: теперь у меня есть онлайн-программа, чтобы сделать это в более общем плане: http://petercollingridge.appspot.com/svg_transforms

Путь, который вы хотите:

d="m9.6428572,4.8214285 8.214285,14.464285 -16.964285,2.857143 16.785715,7.142857 -15.714286,11.785715 21.785714,-3.392857 2.321429,11.607142 11.249999,-10.535714 10.178572,9.642857 4.107143,-10.892857 10.357143,10.714286 0.357143,-13.928572 16.071428,3.571429 -14.285714,-13.392857 16.964285,-2.857143 -17.142857,-3.750000 6.607143,-14.285715 -15.714285,8.571429 -4.821429,-10.892857 -9.464286,9.464286 -8.928571,-9.821429 -3.571429,13.035714z"/>

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

Я сделал это в Python, но я уверен, что это можно сделать с помощью Javascript относительно легко.

d = "9.6428572,4.8214285 17.857142,19.285714 0.89285714,22.142857 17.678572,29.285714 1.9642857,41.071429 23.75,37.678572 26.071429,49.285714 37.321428,38.75 47.5,48.392857 51.607143,37.5 61.964286,48.214286 62.321429,34.285714 78.392857,37.857143 64.107143,24.464286 81.071428,21.607143 63.928571,17.857143 70.535714,3.5714284 54.821429,12.142857 50,1.2499999 40.535714,10.714286 31.607143,0.89285704 28.035714,13.928571"
c = [map(float,l.split(',')) for l in d.split()]
c2 = ["%.6f,%.6f" % (c[n][0] - c[n-1][0], c[n][1] - c[n-1][1]) for n in range(1, len(c))]
print "%.6f,%.6f " % (c[0][0], c[0][1]) + ' '.join(c2)
...