Закрыть путь SVG (Z) с контрольными точками?

Я рисую путь SVG следующим образом:

Начинать:

M x, y

Добавить кривую

Q x1, y1, x, y

и т. д. и т. д.... и когда я хочу закрыть путь, я просто добавляю Z

Но этот последний отрезок теперь не имеет контрольных точек.

Как я могу закрыть путь, а также иметь контрольные точки на этом последнем сегменте?

Что-то вроде: Z Q x1, y1, где Z закрывает путь (от текущей точки до первой точки), но использует x1 и y1 в качестве контрольных точек, а не только прямую линию.


person vale4674    schedule 17.04.2012    source источник


Ответы (1)


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

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

Вы можете сделать это с помощью JavaScript, например. разметка как

<path d="… Z" class="smooth-close" />

…и небольшой скрипт, который находит все smooth-close пути, определяет соответствующую контрольную точку из первых команд, генерирует команду S или T и добавляет ее к данным пути. Но поскольку вы не отметили свой вопрос тегом javascript, я предположим, такое решение вас не заинтересует.

person Phrogz    schedule 18.04.2012
comment
Я не пометил его как javascript, потому что хотел знать, поддерживает ли его SVG. Я использую FabricJS для рисования путей на холсте, и он ведет себя точно так же, как SVG. Я мог бы добавить еще одну линию от текущей точки к первой точке и визуально закрыть путь, а затем вызвать Z. Но все равно это оставило бы эту одну линию без контрольных точек. - person vale4674; 18.04.2012
comment
FWIW, если вы используете Adobe Illustrator для создания эллипса из двух точек (и четырех контрольных точек), вы получаете данные пути, такие как M0,0 c0,-50,100,-50,100,0 S0,50,0,0 z; Таким образом, он делает то, что я описал с помощью JavaScript выше, вручную закрывая кривую контрольной точкой, которая случайно отражает первую контрольную точку. И затем, как вы говорите, он все еще добавляет (лишнее) нулевое расстояние z, чтобы официально закрыть путь. - person Phrogz; 18.04.2012
comment
Я сделал, как я описал. Я просто добавил нормальную кривую, но для конца кривой я дал координаты начала пути. И тогда я закрыл путь с помощью Z. И в моей реализации я знаю, нажал ли я эту точку, а затем я контролирую начало и конец пути. (Надеюсь, вы поняли, не знаю, как объяснить лучше) - person vale4674; 18.04.2012