Как правильно написать формулу path

214
02 июня 2018, 07:00

Встречаются разные формы записи <path>, например:

  1. <path d="M 10 210 L 110 10 L 210 210 z"/>
  2. <path d="M10,210 110,10 210,210 z"/>
  3. <path d="M 0 200 V 200 150 h 0 50 V 150 100 H 50 100 V 100 50 H 100 150 V 50 0 H 150 200 V 0 200 z"/>
  4. <path d="M 0 200 v-50 h50 v-50 h50 v-50 h50 v-50 h50 v200 z"/>
  5. <path d="M0,200v-50h50v-50h50v-50h50v-50h50v200z"/>

Возникают вопросы :

Что означают буквы в формуле патча?
Когда нужно ставить запятые, а когда разделять координаты пробелами?
Почему одни и те же буквы пишутся в одном случае заглавными, а вдругих случаях маленькими буквами?

Answer 1

Все приведенные в вопросе формы записи path правильные,- как вам удобно, так и пишите, соблюдая основное правило - положительные числа координат в формуле патча должны быть разделены пробелами или запятыми, или буквами команд патча.

Буквенные команды формулы патча

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

M – (moveto x,y) – переместить указатель в точку с абсолютными координатами (x,y)
Эти координаты считаются началом пути.

m – (relative) - относительное начало пути применяется для сложных, пересекающихся или параллельных путей. Другими словами, когда в одном патче несколько подпатчей.

L - (lineto) нарисовать линию от текущей точки к указанной с абсолютными координатами (x,y) Эту команду можно не указывать, заменив её пробелом между соседними группами координат.
z - замыкание контура. Патч будет замкнут, если координаты конечной и начальной точки пути будут совпадать. Можно не указывать координаты конечной точки и путь будет замкнут, если после координат предпоследней точки будет написана команда -z

Ниже пример кода и поясняющей графики:

<svg version="1.1" xmlns="http://www.w3.org/2000/svg"  
    xmlns:xlink="http://www.w3.org/1999/xlink" width="280" height="280" viewBox="0 10 300 300"> 
 <path d="M 10 210 L 110 10 L 210 210 z" fill="#9DE281" stroke-width="3" stroke="#FDD000"  /> 
</svg>

Красная точка - это начальная точка path - M 10 210

<path d="M 10 210 L 110 10 L 210 210 z"/>

  • M 10 210 – перемещаем перо в начальную точку точку х=”10″, y=”210″`

  • L 110 10 – рисуем линию до точки х=”110″, y=”10″

  • L 210 210 – рисуем линию до точки х=”210″, y=”210″
  • замыкаем контур – “z”

Горизонтальные (H,h) и вертикальные (V,v) линии

H (horizontal lineto) - эта команда для рисования горизонтальных линий, последующие две цифры указывают горизонтальные координаты начала и конца линии.

V (vertical lineto) - команда для рисования вертикальных линий, последующие две цифры указывают вертикальные координаты начала и конца линии.

Пример

Рисуем вертикальную линию из точки M 110 210 в точку V 110 10.

<path d="M 110 210 V 110 10" />

В формуле патча обязательно должны быть указаны координаты начальной точки M 110 210 или другой точки из которой будет нарисована вертикальная линия.

Пример совместного использования вертикальных и горизонтальных линий.

Допустим нужно нарисовать ступеньки:

<svg version="1.1" xmlns="http://www.w3.org/2000/svg"  
    xmlns:xlink="http://www.w3.org/1999/xlink" width="300" height="300" viewBox="0 0 300 300"> 
<path d="M 0 200 V 200 150 h 0 50 V 150 100 H 50 100 V 100 50 H 100 150 V 50 0 H 150 200 V 0 200 z"                         style="stroke:red; fill: greenyellow"/> 
</svg>

Использование вертикальных и горизонтальных линий с абсолютными координатами, как в примере выше, заметно увеличивает код. При использовании относительных координат код становится намного короче, так как задается только относительная длина h от последней точки пути для горизонтальных линий и высота v для вертикальных линий. Сам процесс рисования становится проще, так как не нужно высчитывать абсолютные расстояния от начала координат.
Для сравнения,- ниже код рисует те же ступеньки с использованием относительных величин h и v .

Пример рисования с помощью относительных величин h и v

<svg version="1.1" xmlns="http://www.w3.org/2000/svg"  
    xmlns:xlink="http://www.w3.org/1999/xlink" width="300" height="300" viewBox="0 0 300 300"> 
<path d="M 0 200 v-50 h50 v-50 h50 v-50 h50 v-50 h50  v200 z" style="stroke:red; fill: greenyellow"/> 
</svg>

Так как начало координат (0,0) полотна SVG находится в левом верхнем углу, то положительное направление оси “X” будет вправо, а оси “Y” – вниз. Поэтому команда v -50 соответствует перемещению вверх на 50px от текущей точки по вертикали, а команда h -60 влево на 60px по горизонтали.

Более подробно здесь и здесь

Сокращенная формула записи патча

Можно еще сократить код, убрав пробелы, между командами и цифрами. Для разделения положительных чисел применяется запятая.

<path d="M0,200v-50h50v-50h50v-50h50v-50h50v200z"

<svg version="1.1" xmlns="http://www.w3.org/2000/svg"  
    xmlns:xlink="http://www.w3.org/1999/xlink" width="300" height="300" viewBox="0 0 300 300"> 
<path d="M0,200v-50h50v-50h50v-50h50v-50h50v200z" style="stroke:red; fill: greenyellow"/> 
</svg>

READ ALSO
При выборе пункта с выпадающего списка заменить &ldquo;Выберите способ оплаты&rdquo; на выбранный!

При выборе пункта с выпадающего списка заменить “Выберите способ оплаты” на выбранный!

Не могу решить проблему с выбором пункта! Выбранный пункт не хочет отображаться в начальном окошке, посмотрите в чем может быть проблема...

158
Не выходит подключить owlCarousel в проект

Не выходит подключить owlCarousel в проект

Сайт на Laravel, фронт собирается webpack'ом

155
скрыть/показать текст с помощью jquery

скрыть/показать текст с помощью jquery

Всем привет, возможно вопрос и глупый но никак не могу понять одну вещьвот пример html

191
С# WinForms, Окно без рамки, Проблема с BorderTop

С# WinForms, Окно без рамки, Проблема с BorderTop

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

156