Команда SVG Move: абсолютный путь к относительному пути

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

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

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

Путь, о котором идет речь, представляет собой вспышку вроде звездообразования:

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

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

Спасибо!


person aaronsnoswell    schedule 06.07.2011    source источник
comment
На каком языке программирования должен быть написан алгоритм?   -  person Peter O.    schedule 06.07.2011
comment
Псевдокод в порядке, я просто использовал общий метод, который вы используете. С тех пор я подтвердил свои подозрения - вы начинаете с последней пары координат и продвигаетесь назад, каждый раз вычитая предыдущее местоположение. Однако один лайнер jQuery все равно будет забавным: P   -  person aaronsnoswell    schedule 06.07.2011


Ответы (1)


РЕДАКТИРОВАТЬ: теперь у меня есть онлайн-программа для этого в более общем виде: 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)
person Peter Collingridge    schedule 06.07.2011
comment
Мне нравится ваш ответ, потому что он соответствует относительному пути, который я придумал, и потому что 4-строчные Python 4 - это круто: P Спасибо за подтверждение того, что вам нужно вычесть предыдущую запись, чтобы преобразовать ее в относительный. Чтобы преобразовать относительное значение в абсолютное, вы просто добавили бы предыдущую запись, начиная с первой записи и просматривая список? - person aaronsnoswell; 07.07.2011
comment
Да, это будет совокупная сумма. Таким образом, 2-я абсолютная координата будет 1-й + 2-й относительными координатами; 3-я абсолютная координата будет 2-й абсолютной (1-я + 2-я относительная) + 3-я относительная координата и так далее. Надеюсь, это имеет смысл. - person Peter Collingridge; 07.07.2011
comment
Это точно. Спасибо @peter-collingridge - person aaronsnoswell; 07.07.2011