Перейти к содержимому
Поиск
Php Разработка

PHP: полный мануал с примерами, функциями и ООП

Практический мануал PHP: от переменных и читаемого кода до безопасных форм, интеграций, базы данных и ООП на примере магазина. Учебный маршрут, поиск функций, подробные примеры, разбор ошибок и исходники для скачивания.

Александр НекрасовИзменено:
Практический мануал PHP: от переменных и функций к объектной модели интернет-магазина
PHP 8.5.11468 глав6256 карточек справочника
Дерево руководства

Глава 327 · После базовых путей

ImagickDraw: квадратичные кривые, Smooth и эллиптические дуги

Восемь оставшихся path-методов: управляющие точки, отражение и fallback, относительная база, радиусы/поворот/флаги эллипса; от первой арки до значка магазина.

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

Для значка магазина нужна округлая ручка, для ярлыка — выгнутая панель, для составной схемы — плавно продолжающийся соединитель. Здесь разбираем последние восемь path-методов: квадратичные кривые, два вида Smooth и эллиптические дуги. Сначала получим короткую арку, затем поймём скрытые управляющие точки; флаги дуги разберём после кривых.

Первая форма — верхняя квадратичная арка между двумя концами
Первая форма — верхняя квадратичная арка между двумя концами Иллюстрация ImageMagick CLI; она показывает геометрию, но не подтверждает выполнение PHP Imagick.

В базовой главе путей объяснены pathStart/Finish, Move/Line, текущая точка и Absolute/Relative. Кратко: Move ставит перо без линии; каждый участок начинается в текущей позиции, после рисования ею становится конец; Relative задаёт смещение от этой позиции. Эти значения нужны здесь, поэтому повторим их на конкретных числах. Объект Draw записывает команды, объект Imagick хранит пиксели; drawImage применяет список, writeImage сохраняет PNG.

Путь данных до результата
  1. Начальная точка задаётся MoveTo
  2. Параметры кривой задают управляющие точки или свойства эллипса
  3. Последняя пара становится новым концом/текущей точкой
  4. Finish завершает список, drawImage меняет пиксели
  5. writeImage создаёт открываемый PNG; echo сообщает имя

Первая арка: начало, одна управляющая точка, конец

Сохранить первую квадратичную кривуюПример для указанного окружения
<?php
declare(strict_types=1);

$image = new Imagick();
$image->newImage(240, 180, 'white');
$image->setImageFormat('png');
$draw = new ImagickDraw();
$draw->setStrokeColor('#146c74');
$draw->setStrokeWidth(3);
$draw->setFillColor('none');
$draw->pathStart();
$draw->pathMoveToAbsolute(20, 130);
$draw->pathCurveToQuadraticBezierAbsolute(120, 20, 220, 130);
$draw->pathFinish();
$image->drawImage($draw);
$image->writeImage(__DIR__ . '/first-quadratic.png');
echo "first-quadratic.png\n";

Сохраните как first.php и выполните php first.php. При успешной записи появится first-quadratic.png 240×180 с верхней бирюзовой аркой, как выше; консоль — first-quadratic.png и перевод строки. Вводный пример намеренно короткий, без обработки записи; ниже программы проверяют writeImage.

Часть записиКонкретное значениеЧто значит
MoveTo(20,130)Начало P0=(20,130)С этого положения начнётся кривая
Первые два аргумента QC=(120,20)Управляющая точка тянет линию вверх
Последние два аргумента QP1=(220,130)Конец и новая текущая точка
Одна управляющая вместо двухЧетыре числа в QЭто квадратичная, не кубическая кривая
fill noneТолько обводкаМежду концами не рисуется закрашенная область

Буква Q здесь — короткое обозначение той же команды в SVG/MVG, не отдельная PHP-функция. $draw — переменная с объектом; -> вызывает его метод, скобки содержат параметры, ; завершает инструкцию. Смысл класса и объекта раскрыт в базовом объяснении. Координаты x растут вправо, y — вниз. Управляющая точка — ручка формы, через которую сама линия проходить не обязана.

Smooth: отражение конкретной предыдущей точки

Для квадратичной пары первая кривая приходит в P=(120,100), управляется C=(70,20). Чтобы продолжить её без новой явной управляющей, отражаем C через P: C′=P+(P−C)=(170,180). Это не зеркалирование всего рисунка; меняется только скрытая управляющая следующего участка. У кубической кривой отражается её вторая управляющая: при C2=(90,20) и том же P получается C1′=(150,180). Явная вторая управляющая новой кубической задаётся отдельно.

Q/T: прежняя C=(70,20), стык P=(120,100), отражённая C′=(170,180); оранжевые линии и точки только объясняют правило
Q/T: прежняя C=(70,20), стык P=(120,100), отражённая C′=(170,180); оранжевые линии и точки только объясняют правило Иллюстрация ImageMagick CLI; она показывает геометрию, но не подтверждает выполнение PHP Imagick.
C/S: прежняя C2=(90,20) отражается через P=(120,100) в новую C1′=(150,180)
C/S: прежняя C2=(90,20) отражается через P=(120,100) в новую C1′=(150,180) Иллюстрация ImageMagick CLI; она показывает геометрию, но не подтверждает выполнение PHP Imagick.
КомандаОткуда берётся скрытая точкаКогда отражение не применяется
Quadratic Smooth T/tПредыдущая Q/q/T/t; отражается её единственная управляющаяПосле Move, Line, cubic C/S, arc
Cubic Smooth S/sПредыдущая C/c/S/s; отражается её вторая управляющаяПосле Move, Line, quadratic Q/T, arc

В запасном случае скрытая точка совпадает с текущей. Поэтому Smooth не означает «сделай плавно после чего угодно». Между разными семействами кривых нужно явно согласовать управляющие точки. У каждой новой команды память обновляется, включая точки, вычисленные неявно.

Один и тот же Smooth после кривой и после линии

Слева предыдущая квадратичная команда дала точку для отражения; справа перед T стоит Line. У линии нет квадратичной управляющей, поэтому скрытая точка правого T совпадает с началом (360,100). Когда конец тоже лежит на y=100, участок получается прямым: название Smooth не заставляет его изгибаться.

Слева бирюзовая Q/T-пара с изгибом, справа оранжевые Line/T на одной горизонтали
Слева бирюзовая Q/T-пара с изгибом, справа оранжевые Line/T на одной горизонтали Иллюстрация ImageMagick CLI; она показывает геометрию, но не подтверждает выполнение PHP Imagick.
Увидеть разницу контекста SmoothПример для указанного окружения
<?php
declare(strict_types=1);

$image = new Imagick();
$image->newImage(480, 200, 'white');
$image->setImageFormat('png');
$draw = new ImagickDraw();
$draw->setStrokeColor('#146c74');
$draw->setStrokeWidth(3);
$draw->setFillColor('none');
$draw->pathStart();
$draw->pathMoveToAbsolute(20, 100);
$draw->pathCurveToQuadraticBezierAbsolute(70, 20, 120, 100);
$draw->pathCurveToQuadraticBezierSmoothAbsolute(220, 100);
$draw->pathFinish();
$draw->setStrokeColor('#c25732');
$draw->pathStart();
$draw->pathMoveToAbsolute(260, 100);
$draw->pathLineToAbsolute(360, 100);
$draw->pathCurveToQuadraticBezierSmoothAbsolute(460, 100);
$draw->pathFinish();
$image->drawImage($draw);
$path = __DIR__ . '/fallback-comparison.png';
if (!$image->writeImage($path)) {
    throw new RuntimeException('Не удалось сохранить PNG');
}
echo 'fallback-comparison.png', "\n";
$draw->clear();
$image->clear();

При успехе создаётся fallback-comparison.png 480×200, консоль — fallback-comparison.png. Слева две противоположные квадратичные арки; справа линия от x=260 до x=460 на y=100 без изгиба. Правая T использует управляющую (360,100), потому что предыдущая команда Line не принадлежит семейству Q/T.

Дальнейшие программы используют if (!$image->writeImage(...)): отрицание ! проверяет отказ, throw сообщает его вызывающему коду. См. исключения. foreach повторяет команды для элементов массива; порядок и номер элемента объяснены в циклах.

Относительные пары одной команды имеют общую базу

Вызов при текущей P=(20,130)Координаты после пересчёта
q(100,-110,200,0)Управляющая (120,20), конец (220,130)
s(70,80,100,0) при другой P=(120,100)Явная вторая управляющая (190,180), конец (220,100); первая отражается отдельно
a(70,50,0,false,true,80,-40) при P=(80,110)Радиусы 70/50, поворот 0°, конечная (160,70); размеры не являются смещениями

Relative не означает проценты и не заставляет каждую пару считаться от предыдущей пары. Точка отсчёта берётся до команды; обновляется после её полного завершения. Для повторения локального контура меняют первый MoveTo. Для знакомых простых фигур иногда достаточно готовой ellipse или bezier.

Дуга эллипса: радиусы, поворот, два флага и особые случаи

Arc в path задаётся началом и концом, радиусами и двумя флагами. Центр не передаётся: движок подбирает эллипс, на котором лежат эти концы. rotation поворачивает оси эллипса в градусах; это не угол начала дуги. Если rx=ry, поворот окружности не меняет её форму. На обычном изображении ось y направлена вниз: положительный sweep воспринимается по часовой стрелке; после отражений/преобразований смотрите на изменённую систему координат.

При одинаковых радиусах и концах: сверху large=false, снизу large=true; слева sweep=false, справа sweep=true
При одинаковых радиусах и концах: сверху large=false, снизу large=true; слева sweep=false, справа sweep=true Иллюстрация ImageMagick CLI; она показывает геометрию, но не подтверждает выполнение PHP Imagick.
УсловиеПравило endpoint-дуги SVG/MVG и практический выбор
large_arc=false / trueМалая / большая из подходящих дуг. Для ровно 180° по длине они не различаются
sweep=false / trueОтрицательное / положительное направление обхода; это отдельный выбор, не синоним большой дуги
Начало равно концуДуга не задаёт полный эллипс; пропускается. Сделайте две дуги с промежуточным концом или ellipse
rx=0 либо ry=0Дуга становится прямым участком к конечной точке
Отрицательный радиусSVG-пересчёт использует абсолютную величину; прикладной ввод лучше нормализовать/отклонить явно
Радиусы слишком малы для двух концовРадиусы увеличиваются с сохранением отношения, чтобы получить допустимый эллипс; не рассчитывайте на неизменный размер
Нужно заданное направление между двумя концамиПроверьте оба флага на небольшой диагностической картинке; четыре варианта ниже создаются одним примером

Это стандартные правила геометрии endpoint-дуг; отдельная версия нативного растеризатора может иметь свои пограничные дефекты. В прикладной задаче фиксируйте версии и проверяйте нужный контур. Здесь нет заявления, что PHP-расширение уже исполнило все эти случаи.

Квадратичная кривая: изгиб с одной управляющей точкой

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

Начало уже стоит в (20,130); управляющая точка (120,20) тянет линию вверх; конец (220,130) завершает участок. Через управляющую точку кривая обычно не проходит: середина нашего участка имеет y=75, а не 20.

Открыть параметры, два примера с результатами, ограничения и соседние методы

Квадратичная кривая в локальном шаблоне

Закруглённую вкладку нужно повторять в нескольких местах изображения, сохранив форму без пересчёта абсолютных управляющих координат.

От текущей (20,130) смещение (100,-110) даёт управляющую (120,20), а (200,0) — конец (220,130). Обе пары считаются от одного начала команды, не одна от другой.

Открыть параметры, два примера с результатами, ограничения и соседние методы

Продолжить квадратичную кривую отражённой точкой

Составная линия должна пройти через общий узел без ручного повторного вычисления управляющей точки следующей половины.

После Q с управляющей C=(70,20) и концом P=(120,100) команда SmoothAbsolute(220,100) использует отражённую C′=(170,180). Её вычисление: C′=2P−C. Аргументы задают только абсолютный конец новой квадратичной кривой.

Открыть параметры, два примера с результатами, ограничения и соседние методы

Цепочка квадратичных продолжений относительными концами

Для повторяемого мягкого контура удобно задать первую кривую явно, а следующие концы — одинаковыми локальными шагами.

После q(50,-80,100,0) текущая (120,100), предыдущая управляющая (70,20). t(100,0) получает конец (220,100), а отражённую управляющую (170,180) вычисляет автоматически. База смещения конца — текущая точка, не отражённая.

Открыть параметры, два примера с результатами, ограничения и соседние методы

Кубическое продолжение: первая управляющая отражается

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

Предыдущая C закончилась в P=(120,100), её вторая управляющая C2=(90,20). Новая первая управляющая автоматически C1′=(150,180); передаём только вторую (190,180) и конец (220,100).

Открыть параметры, два примера с результатами, ограничения и соседние методы

Кубическое продолжение в смещениях от текущего узла

Узор ленты или повторяющаяся плавная связь собирается из одинаковых модулей. Отражение экономит одну пару чисел, а Relative оставляет модуль локальным.

Начало второго участка P=(120,100). (70,80) даёт вторую управляющую (190,180); (100,0) даёт конец (220,100). Первая управляющая отражается из прежней C2 в (150,180), независимо от переданной второй пары.

Открыть параметры, два примера с результатами, ограничения и соседние методы

Эллиптическая дуга к абсолютной конечной точке

Нужно соединить две позиции участком настоящего эллипса: например, ручка значка пакета или овальный вырез, а не произвольная кривая Безье.

Начало (80,110) уже задано Move. Радиусы 70 и 50 определяют форму эллипса, rotation=0 — его поворот; false выбирает малую дугу, true — положительное направление. Конец задан абсолютной точкой (160,70). Центр движок вычисляет сам.

Открыть параметры, два примера с результатами, ограничения и соседние методы

Эллиптическая дуга с относительным концом

Овальный значок нужно собрать как локальный замкнутый контур из двух дуг. Радиусы и поворот остаются свойствами эллипса, а конец каждой дуги задаётся сдвигом.

Из (80,110) последняя пара (80,-40) приводит в (160,70). Первые rx=70, ry=50 и rotation=0 не прибавляются к текущей точке: относительными являются только конечные x/y.

Открыть параметры, два примера с результатами, ограничения и соседние методы

Значок магазина: корпус, ручка и плавная полоса

Соединим изученное в видимый результат, который можно использовать как PNG-значок магазина или доставки. Мятный корпус ограничен прямыми сторонами и квадратичным нижним краем. Ручка — полуокружность эллиптической командой с равными радиусами. Внутренняя полоса состоит из явной кубической части и Smooth-продолжения. Это готовая растровая иконка, не обработчик заказа и не интерактивная кнопка.

Значок пакета 400×320: мятный корпус, ручка и волнистая полоса
Значок пакета 400×320: мятный корпус, ручка и волнистая полоса Иллюстрация ImageMagick CLI; она показывает геометрию, но не подтверждает выполнение PHP Imagick.
Сохранить составной значок без внешних файловПример для указанного окружения
<?php
declare(strict_types=1);

$image = new Imagick();
$image->newImage(400, 320, 'white');
$image->setImageFormat('png');
$draw = new ImagickDraw();
$draw->setStrokeColor('#146c74');
$draw->setStrokeWidth(3);
$draw->setFillColor('none');
$draw->setFillColor('#bdebe2');
$draw->pathStart();
$draw->pathMoveToAbsolute(90, 100);
$draw->pathLineToHorizontalAbsolute(310);
$draw->pathLineToAbsolute(330, 270);
$draw->pathCurveToQuadraticBezierRelative(-130, 40, -260, 0);
$draw->pathClose();
$draw->pathFinish();
$draw->setFillColor('none');
$draw->pathStart();
$draw->pathMoveToAbsolute(145, 100);
$draw->pathEllipticArcRelative(55, 55, 0, false, true, 110, 0);
$draw->pathFinish();
$draw->pathStart();
$draw->pathMoveToAbsolute(120, 190);
$draw->pathCurveToAbsolute(140, 150, 170, 150, 190, 190);
$draw->pathCurveToSmoothRelative(50, 40, 80, 0);
$draw->pathFinish();
$image->drawImage($draw);
$path = __DIR__ . '/shop-bag.png';
if (!$image->writeImage($path)) {
    throw new RuntimeException('Не удалось сохранить PNG');
}
echo 'shop-bag.png', "\n";
$draw->clear();
$image->clear();

При успехе создаётся shop-bag.png 400×320, консоль — shop-bag.png. Корпус начинается (90,100), после стороны приходит в (330,270); относительная Q использует управляющую (200,310) и конец (70,270). Ручка идёт из (145,100) в (255,100) радиусом 55. Полоса заканчивается в (270,190), вторая её часть продолжает первую отражением.

Упражнение: сделайте ручку выше, не двигая её концы. Решение: у ручки измените радиусы с (55,55) на (55,75), оставив конец-смещение (110,0). Получится верхняя половина эллипса; одной смены rotation для окружности недостаточно. Затем измените вторую управляющую SmoothRelative с (50,40) на (50,20): нижний изгиб полосы станет слабее, конец останется прежним.

Перенести приём в свой проект

  • Не начинайте со Smooth, если не знаете предыдущий тип кривой: сначала выпишите текущую точку и обе управляющие в абсолютных координатах, проверьте форму, затем сокращайте запись.
  • Проверяйте входные размеры, числовые координаты, значения флагов и диапазоны задания. Не вставляйте пользовательский текст в MVG/SVG или командную строку.
  • Сохраняйте файлы в фиксированном каталоге с безопасными именами. Непроверенный путь пользователя не должен выходить за его границы; отдельно обрабатывайте ошибку записи.
  • В HTTP-ответ отправляют готовые байты PNG с Content-Type: image/png; диагностика echo из учебных программ не должна попадать перед бинарными данными.
  • Для длительной очереди освобождайте Draw/Imagick после работы; проверяйте нужные пограничные контуры на версии, используемой сервером. Одного синтаксического lint для этого недостаточно.

С этим дополнением разобраны все 21 path-метод из сохранённого дерева ImagickDraw: 13 базовых и эти 8. Это не объявление всего ImagickDraw или полного PHP Manual завершёнными. Другие настройки, оформление текста, заливки и композиция имеют отдельные разделы. Дальше полезны файлы, исключения и измерение времени.

Функции и методы этой темы

Откройте карточку, чтобы увидеть договор функции, примеры, ограничения и связанные инструменты.

ImagickDraw::pathCurveToQuadraticBezierAbsoluteНужна плавная верхняя грань ярлыка или простая арка между двумя позициями. Двух управляющих точек кубической кривой для этой формы не требуется. Начало уже стоит в (20,130); управляющая точка (120,20) тянет линию вверх; конец (220,130) завершает участок. Через управляющую точку кривая обычно не проходит: середина нашего участка имеет y=75, а не 20.

PECL imagick 2, PECL imagick 3 · imagick

ImagickDraw::pathCurveToQuadraticBezierAbsolute(float $x1, float $y1, float $x_end, float $y): bool

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

Начало уже стоит в (20,130); управляющая точка (120,20) тянет линию вверх; конец (220,130) завершает участок. Через управляющую точку кривая обычно не проходит: середина нашего участка имеет y=75, а не 20.

Сигнатура: ImagickDraw::pathCurveToQuadraticBezierAbsolute(float $x1, float $y1, float $x_end, float $y): bool

ПараметрТипЧто передать
$x1floatАбсолютный x управляющей точки
$y1floatАбсолютный y управляющей точки
$x_endfloatАбсолютный x конца
$yfloatАбсолютный y конца

Все параметры обязательные, без значений по умолчанию, передаются по значению. Числовые координаты/радиусы задаются в единицах холста; дробные значения допустимы. В обычном холсте без преобразований одна единица соответствует пикселю; у поворота отдельные единицы — градусы. true/false — логические значения, не строки с этими словами.

Что возвращается. Сигнатура PHP Manual объявляет bool, а текст return в снимке говорит, что значения нет. Как и в базовых path-методах, это неточность документации: binding Imagick возвращает true после записи команды. Нативный запуск здесь ещё не подтверждён; PNG не является этим bool и появляется только после drawImage/writeImage. Не стройте цепочку объектных вызовов на возвращаемом значении.

Версии и отказы. Доступность в официальном снимке: PECL imagick 2, PECL imagick 3; deprecated/removed не указаны. Страница имеет предупреждение о неполной документации. Разделы errors/changelog в снимке пусты; это не обещание отсутствия ошибок. Неверный тип может дать TypeError; неверное состояние пути — ImagickDrawException или ошибку при drawImage. writeImage может вернуть false/вызвать ImagickException. Все программы строят завершённые пути и проверяют запись; внешний обработчик должен перехватывать ошибку задания и не выдавать пустой файл за успешный PNG.

Полный сохранённый контракт PHP Manual

Снимок сохранён поле в поле, включая английские правила, версии, ссылки и хеши. Русская таблица выше поясняет смысл; исходная неточность return не скрыта.

{
  "id": "imagickdraw.pathcurvetoquadraticbezierabsolute",
  "name": "ImagickDraw::pathCurveToQuadraticBezierAbsolute",
  "purpose_en": "Draws a quadratic Bezier curve",
  "description_en": "Draws a quadratic Bezier curve from the current point to (x,y) using (x1,y1) as the control point using absolute coordinates. At the end of the command, the new current point becomes the final (x,y) coordinate pair used in the polybezier.",
  "signature": "ImagickDraw::pathCurveToQuadraticBezierAbsolute(float $x1, float $y1, float $x_end, float $y): bool",
  "modifiers": [
    "public"
  ],
  "return_type": "bool",
  "parameters": [
    {
      "name": "x1",
      "type": "float",
      "by_reference": false,
      "optional": false,
      "default": null,
      "description_en": "x coordinate of the control point"
    },
    {
      "name": "y1",
      "type": "float",
      "by_reference": false,
      "optional": false,
      "default": null,
      "description_en": "y coordinate of the control point"
    },
    {
      "name": "x_end",
      "type": "float",
      "by_reference": false,
      "optional": false,
      "default": null,
      "description_en": "x coordinate of the end point"
    },
    {
      "name": "y",
      "type": "float",
      "by_reference": false,
      "optional": false,
      "default": null,
      "description_en": "y coordinate of the end point"
    }
  ],
  "return_en": "Nothing is returned.",
  "errors_en": "",
  "changelog_en": "",
  "examples": [
    {
      "title": "ImagickDraw::pathCurveToQuadraticBezierAbsolute example",
      "language": "php",
      "code_sha256": "f4ecca82d68901fa89c20a5be9de4b643e888008a420cf6bd1dc2c1f8efade65"
    }
  ],
  "see_also": [],
  "availability": {
    "from": "PECL imagick 2, PECL imagick 3",
    "deprecated": null,
    "removed": null
  },
  "official_url": "https://www.php.net/manual/en/imagickdraw.pathcurvetoquadraticbezierabsolute.php",
  "official_page_sha256": "64e7b4338df2c5a48f6a9f536384bc64456e56c04e8043b0114e12094ac923b7",
  "xml_path": "evidence/imagick-sources/doc-en/reference/imagick/imagickdraw/pathcurvetoquadraticbezierabsolute.xml",
  "xml_sha256": "d35e1b736fa055e18f91589f15a9c4753afc079a585e7d2243a7bcc47d34be29",
  "official_undocumented_marker": true,
  "owner": "imagick_reference_draw_paths.py"
}
Одна симметричная верхняя арка из (20,130) в (220,130)
Одна симметричная верхняя арка из (20,130) в (220,130) Иллюстрация ImageMagick CLI; она показывает геометрию, но не подтверждает выполнение PHP Imagick.
Минимальное применение: Одна симметричная верхняя арка из (20,130) в (220,130)Пример для указанного окружения
<?php
declare(strict_types=1);

$image = new Imagick();
$image->newImage(240, 180, 'white');
$image->setImageFormat('png');
$draw = new ImagickDraw();
$draw->setStrokeColor('#146c74');
$draw->setStrokeWidth(3);
$draw->setFillColor('none');
$draw->pathStart();
$draw->pathMoveToAbsolute(20, 130);
$draw->pathCurveToQuadraticBezierAbsolute(120, 20, 220, 130);
$draw->pathFinish();
$image->drawImage($draw);
$path = __DIR__ . '/pathcurvetoquadraticbezierabsolute-basic.png';
if (!$image->writeImage($path)) {
    throw new RuntimeException('Не удалось сохранить PNG');
}
echo 'pathcurvetoquadraticbezierabsolute-basic.png', "\n";
$draw->clear();
$image->clear();

При успешном выполнении создаётся pathcurvetoquadraticbezierabsolute-basic.png 240×180. Одна симметричная верхняя арка из (20,130) в (220,130). Консоль — pathcurvetoquadraticbezierabsolute-basic.png и перевод строки. Весь холст и все координаты создаются кодом; внешнее изображение не требуется. Start/Move/Finish — обязательное окружение path-команды. Сглаживание может немного различаться между сборками.

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

Закрываем область для цветной подложки: верхний край изгибается, остальные стороны прямые. Это самостоятельный фон ярлыка, к которому позже можно добавить текст.

Панель ярлыка с выпуклым верхомПример для указанного окружения
<?php
declare(strict_types=1);

$image = new Imagick();
$image->newImage(320, 180, 'white');
$image->setImageFormat('png');
$draw = new ImagickDraw();
$draw->setStrokeColor('#146c74');
$draw->setStrokeWidth(3);
$draw->setFillColor('none');
$draw->setFillColor('#bdebe2');
$draw->pathStart();
$draw->pathMoveToAbsolute(30, 150);
$draw->pathLineToAbsolute(30, 50);
$draw->pathCurveToQuadraticBezierAbsolute(160, 10, 290, 50);
$draw->pathLineToAbsolute(290, 150);
$draw->pathClose();
$draw->pathFinish();
$image->drawImage($draw);
$path = __DIR__ . '/arched-label.png';
if (!$image->writeImage($path)) {
    throw new RuntimeException('Не удалось сохранить PNG');
}
echo 'arched-label.png', "\n";
$draw->clear();
$image->clear();

Результат: arched-label.png 320×180; консоль — arched-label.png. Мятная панель с прямыми боками и нижней гранью; верхний изгиб проходит через (30,50) и (290,50), достигает y=30 в середине. Управляющая (160,10) лежит выше самой кривой.

Что проверить и чем заменить

Управляющая точка задаёт форму, а не дополнительную обязательную вершину. После команды текущая точка становится (220,130). Если нужна раздельная настройка касательной в обоих концах, используйте кубическую CurveTo из базовой главы.

Стоимость. Запись команды в Draw не равна растеризации: основная работа с пикселями будет в drawImage, затем отдельная запись PNG. Ограничивайте площадь холста, число сегментов и объём внешних данных; память зависит от каналов и внутренних буферов. Для статичного значка сохраните PNG и используйте кэш, для изменяемой схемы браузера рассмотрите SVG/canvas. Сравнивайте время полного задания, не только одного вызова path-метода.

Рядом: ImagickDraw::pathCurveToQuadraticBezierRelative, ImagickDraw::pathCurveToQuadraticBezierSmoothAbsolute. Устройство текущей точки: базовые пути.

ImagickDraw::pathCurveToQuadraticBezierRelativeЗакруглённую вкладку нужно повторять в нескольких местах изображения, сохранив форму без пересчёта абсолютных управляющих координат. От текущей (20,130) смещение (100,-110) даёт управляющую (120,20), а (200,0) — конец (220,130). Обе пары считаются от одного начала команды, не одна от другой.

PECL imagick 2, PECL imagick 3 · imagick

ImagickDraw::pathCurveToQuadraticBezierRelative(float $x1, float $y1, float $x_end, float $y): bool

Закруглённую вкладку нужно повторять в нескольких местах изображения, сохранив форму без пересчёта абсолютных управляющих координат.

От текущей (20,130) смещение (100,-110) даёт управляющую (120,20), а (200,0) — конец (220,130). Обе пары считаются от одного начала команды, не одна от другой.

Сигнатура: ImagickDraw::pathCurveToQuadraticBezierRelative(float $x1, float $y1, float $x_end, float $y): bool

ПараметрТипЧто передать
$x1floatdx управляющей точки от текущего начала команды
$y1floatdy управляющей точки от того же начала
$x_endfloatdx конца от того же начала
$yfloatdy конца от того же начала

Все параметры обязательные, без значений по умолчанию, передаются по значению. Числовые координаты/радиусы задаются в единицах холста; дробные значения допустимы. В обычном холсте без преобразований одна единица соответствует пикселю; у поворота отдельные единицы — градусы. true/false — логические значения, не строки с этими словами.

Что возвращается. Сигнатура PHP Manual объявляет bool, а текст return в снимке говорит, что значения нет. Как и в базовых path-методах, это неточность документации: binding Imagick возвращает true после записи команды. Нативный запуск здесь ещё не подтверждён; PNG не является этим bool и появляется только после drawImage/writeImage. Не стройте цепочку объектных вызовов на возвращаемом значении.

Версии и отказы. Доступность в официальном снимке: PECL imagick 2, PECL imagick 3; deprecated/removed не указаны. Страница имеет предупреждение о неполной документации. Разделы errors/changelog в снимке пусты; это не обещание отсутствия ошибок. Неверный тип может дать TypeError; неверное состояние пути — ImagickDrawException или ошибку при drawImage. writeImage может вернуть false/вызвать ImagickException. Все программы строят завершённые пути и проверяют запись; внешний обработчик должен перехватывать ошибку задания и не выдавать пустой файл за успешный PNG.

Полный сохранённый контракт PHP Manual

Снимок сохранён поле в поле, включая английские правила, версии, ссылки и хеши. Русская таблица выше поясняет смысл; исходная неточность return не скрыта.

{
  "id": "imagickdraw.pathcurvetoquadraticbezierrelative",
  "name": "ImagickDraw::pathCurveToQuadraticBezierRelative",
  "purpose_en": "Draws a quadratic Bezier curve",
  "description_en": "Draws a quadratic Bezier curve from the current point to (x,y) using (x1,y1) as the control point using relative coordinates. At the end of the command, the new current point becomes the final (x,y) coordinate pair used in the polybezier.",
  "signature": "ImagickDraw::pathCurveToQuadraticBezierRelative(float $x1, float $y1, float $x_end, float $y): bool",
  "modifiers": [
    "public"
  ],
  "return_type": "bool",
  "parameters": [
    {
      "name": "x1",
      "type": "float",
      "by_reference": false,
      "optional": false,
      "default": null,
      "description_en": "starting x coordinate"
    },
    {
      "name": "y1",
      "type": "float",
      "by_reference": false,
      "optional": false,
      "default": null,
      "description_en": "starting y coordinate"
    },
    {
      "name": "x_end",
      "type": "float",
      "by_reference": false,
      "optional": false,
      "default": null,
      "description_en": "ending x coordinate"
    },
    {
      "name": "y",
      "type": "float",
      "by_reference": false,
      "optional": false,
      "default": null,
      "description_en": "ending y coordinate"
    }
  ],
  "return_en": "Nothing is returned.",
  "errors_en": "",
  "changelog_en": "",
  "examples": [],
  "see_also": [],
  "availability": {
    "from": "PECL imagick 2, PECL imagick 3",
    "deprecated": null,
    "removed": null
  },
  "official_url": "https://www.php.net/manual/en/imagickdraw.pathcurvetoquadraticbezierrelative.php",
  "official_page_sha256": "05b9f59675de4dd2348628eeb92d68988f0f41aa72f90ec1f210a45e72ecf713",
  "xml_path": "evidence/imagick-sources/doc-en/reference/imagick/imagickdraw/pathcurvetoquadraticbezierrelative.xml",
  "xml_sha256": "500e554c52c4526e85348ea254b24cdda49cf745ee57eb14f5b89240c5ffc08e",
  "official_undocumented_marker": true,
  "owner": "imagick_reference_draw_paths.py"
}
Та же верхняя арка, записанная относительными смещениями
Та же верхняя арка, записанная относительными смещениями Иллюстрация ImageMagick CLI; она показывает геометрию, но не подтверждает выполнение PHP Imagick.
Минимальное применение: Та же верхняя арка, записанная относительными смещениямиПример для указанного окружения
<?php
declare(strict_types=1);

$image = new Imagick();
$image->newImage(240, 180, 'white');
$image->setImageFormat('png');
$draw = new ImagickDraw();
$draw->setStrokeColor('#146c74');
$draw->setStrokeWidth(3);
$draw->setFillColor('none');
$draw->pathStart();
$draw->pathMoveToAbsolute(20, 130);
$draw->pathCurveToQuadraticBezierRelative(100, -110, 200, 0);
$draw->pathFinish();
$image->drawImage($draw);
$path = __DIR__ . '/pathcurvetoquadraticbezierrelative-basic.png';
if (!$image->writeImage($path)) {
    throw new RuntimeException('Не удалось сохранить PNG');
}
echo 'pathcurvetoquadraticbezierrelative-basic.png', "\n";
$draw->clear();
$image->clear();

При успешном выполнении создаётся pathcurvetoquadraticbezierrelative-basic.png 240×180. Та же верхняя арка, записанная относительными смещениями. Консоль — pathcurvetoquadraticbezierrelative-basic.png и перевод строки. Весь холст и все координаты создаются кодом; внешнее изображение не требуется. Start/Move/Finish — обязательное окружение path-команды. Сглаживание может немного различаться между сборками.

Практическая задача: Три одинаковые вкладки из локального контура

На печатной инструкции нужно показать три места под ярлыки. Меняем только начальные x-позиции, а форму каждой вкладки описываем смещениями.

Три одинаковые вкладки из локального контураПример для указанного окружения
<?php
declare(strict_types=1);

$image = new Imagick();
$image->newImage(320, 180, 'white');
$image->setImageFormat('png');
$draw = new ImagickDraw();
$draw->setStrokeColor('#146c74');
$draw->setStrokeWidth(3);
$draw->setFillColor('none');
$draw->setFillColor('#bdebe2');
$draw->pathStart();
foreach ([20, 120, 220] as $x) {
    $draw->pathMoveToAbsolute($x, 130);
    $draw->pathLineToRelative(0, -70);
    $draw->pathCurveToQuadraticBezierRelative(35, -40, 70, 0);
    $draw->pathLineToRelative(0, 70);
    $draw->pathClose();
}
$draw->pathFinish();
$image->drawImage($draw);
$path = __DIR__ . '/repeated-tabs.png';
if (!$image->writeImage($path)) {
    throw new RuntimeException('Не удалось сохранить PNG');
}
echo 'repeated-tabs.png', "\n";
$draw->clear();
$image->clear();

Результат: repeated-tabs.png 320×180; консоль — repeated-tabs.png. Три мятные вкладки шириной 70 с нижней гранью y=130 и выпуклым верхом: кривая начинается на y=60, её середина y=40. Независимые Move отделяют контуры, чтобы между вкладками не возникла линия.

Что проверить и чем заменить

Последняя пара не прибавляется к управляющей точке. Relative меняет только смысл координат, не степень кривой. Текущая точка обновится до конца после всей команды; следующая Relative получит новую базу.

Стоимость. Запись команды в Draw не равна растеризации: основная работа с пикселями будет в drawImage, затем отдельная запись PNG. Ограничивайте площадь холста, число сегментов и объём внешних данных; память зависит от каналов и внутренних буферов. Для статичного значка сохраните PNG и используйте кэш, для изменяемой схемы браузера рассмотрите SVG/canvas. Сравнивайте время полного задания, не только одного вызова path-метода.

Рядом: ImagickDraw::pathCurveToQuadraticBezierAbsolute, ImagickDraw::pathCurveToQuadraticBezierSmoothRelative. Устройство текущей точки: базовые пути.

ImagickDraw::pathCurveToQuadraticBezierSmoothAbsoluteСоставная линия должна пройти через общий узел без ручного повторного вычисления управляющей точки следующей половины. После Q с управляющей C=(70,20) и концом P=(120,100) команда SmoothAbsolute(220,100) использует отражённую C′=(170,180). Её вычисление: C′=2P−C. Аргументы задают только абсолютный конец новой квадратичной кривой.

PECL imagick 2, PECL imagick 3 · imagick

ImagickDraw::pathCurveToQuadraticBezierSmoothAbsolute(float $x, float $y): bool

Составная линия должна пройти через общий узел без ручного повторного вычисления управляющей точки следующей половины.

После Q с управляющей C=(70,20) и концом P=(120,100) команда SmoothAbsolute(220,100) использует отражённую C′=(170,180). Её вычисление: C′=2P−C. Аргументы задают только абсолютный конец новой квадратичной кривой.

Сигнатура: ImagickDraw::pathCurveToQuadraticBezierSmoothAbsolute(float $x, float $y): bool

ПараметрТипЧто передать
$xfloatАбсолютный x конца; управляющая вычисляется отражением
$yfloatАбсолютный y конца

Все параметры обязательные, без значений по умолчанию, передаются по значению. Числовые координаты/радиусы задаются в единицах холста; дробные значения допустимы. В обычном холсте без преобразований одна единица соответствует пикселю; у поворота отдельные единицы — градусы. true/false — логические значения, не строки с этими словами.

Что возвращается. Сигнатура PHP Manual объявляет bool, а текст return в снимке говорит, что значения нет. Как и в базовых path-методах, это неточность документации: binding Imagick возвращает true после записи команды. Нативный запуск здесь ещё не подтверждён; PNG не является этим bool и появляется только после drawImage/writeImage. Не стройте цепочку объектных вызовов на возвращаемом значении.

Версии и отказы. Доступность в официальном снимке: PECL imagick 2, PECL imagick 3; deprecated/removed не указаны. Эта страница содержит развёрнутое описание правила отражения. Разделы errors/changelog в снимке пусты; это не обещание отсутствия ошибок. Неверный тип может дать TypeError; неверное состояние пути — ImagickDrawException или ошибку при drawImage. writeImage может вернуть false/вызвать ImagickException. Все программы строят завершённые пути и проверяют запись; внешний обработчик должен перехватывать ошибку задания и не выдавать пустой файл за успешный PNG.

Полный сохранённый контракт PHP Manual

Снимок сохранён поле в поле, включая английские правила, версии, ссылки и хеши. Русская таблица выше поясняет смысл; исходная неточность return не скрыта.

{
  "id": "imagickdraw.pathcurvetoquadraticbeziersmoothabsolute",
  "name": "ImagickDraw::pathCurveToQuadraticBezierSmoothAbsolute",
  "purpose_en": "Draws a quadratic Bezier curve",
  "description_en": "Draws a quadratic Bezier curve (using absolute coordinates) from the current point to (x,y). The control point is assumed to be the reflection of the control point on the previous command relative to the current point. (If there is no previous command or if the previous command was not a DrawPathCurveToQuadraticBezierAbsolute, DrawPathCurveToQuadraticBezierRelative, DrawPathCurveToQuadraticBezierSmoothAbsolut or DrawPathCurveToQuadraticBezierSmoothRelative, assume the control point is coincident with the current point.). At the end of the command, the new current point becomes the final (x,y) coordinate pair used in the polybezier. This function cannot be used to continue a cubic Bezier curve smoothly. It can only continue from a quadratic curve smoothly.",
  "signature": "ImagickDraw::pathCurveToQuadraticBezierSmoothAbsolute(float $x, float $y): bool",
  "modifiers": [
    "public"
  ],
  "return_type": "bool",
  "parameters": [
    {
      "name": "x",
      "type": "float",
      "by_reference": false,
      "optional": false,
      "default": null,
      "description_en": "ending x coordinate"
    },
    {
      "name": "y",
      "type": "float",
      "by_reference": false,
      "optional": false,
      "default": null,
      "description_en": "ending y coordinate"
    }
  ],
  "return_en": "Nothing is returned.",
  "errors_en": "",
  "changelog_en": "",
  "examples": [
    {
      "title": "ImagickDraw::pathCurveToQuadraticBezierSmoothAbsolute example",
      "language": "php",
      "code_sha256": "be358c65e33c861bf4ed630774eeda05d3a7fc7d805155402ac85e8f9c39023d"
    }
  ],
  "see_also": [],
  "availability": {
    "from": "PECL imagick 2, PECL imagick 3",
    "deprecated": null,
    "removed": null
  },
  "official_url": "https://www.php.net/manual/en/imagickdraw.pathcurvetoquadraticbeziersmoothabsolute.php",
  "official_page_sha256": "c53198b666dbb3538e24215e33fb9994b305f70f681fedbbd62286ad69ddedca",
  "xml_path": "evidence/imagick-sources/doc-en/reference/imagick/imagickdraw/pathcurvetoquadraticbeziersmoothabsolute.xml",
  "xml_sha256": "c915d16796d0544cd04865e957f3b4a2c3d0d5d0272f88fcb37102a16216cbab",
  "official_undocumented_marker": false,
  "owner": "imagick_reference_draw_paths.py"
}
Две квадратичные половины: первая вверх, вторая вниз через общий узел (120,100)
Две квадратичные половины: первая вверх, вторая вниз через общий узел (120,100) Иллюстрация ImageMagick CLI; она показывает геометрию, но не подтверждает выполнение PHP Imagick.
Минимальное применение: Две квадратичные половины: первая вверх, вторая вниз через общий узел (120,100)Пример для указанного окружения
<?php
declare(strict_types=1);

$image = new Imagick();
$image->newImage(240, 180, 'white');
$image->setImageFormat('png');
$draw = new ImagickDraw();
$draw->setStrokeColor('#146c74');
$draw->setStrokeWidth(3);
$draw->setFillColor('none');
$draw->pathStart();
$draw->pathMoveToAbsolute(20, 100);
$draw->pathCurveToQuadraticBezierAbsolute(70, 20, 120, 100);
$draw->pathCurveToQuadraticBezierSmoothAbsolute(220, 100);
$draw->pathFinish();
$image->drawImage($draw);
$path = __DIR__ . '/pathcurvetoquadraticbeziersmoothabsolute-basic.png';
if (!$image->writeImage($path)) {
    throw new RuntimeException('Не удалось сохранить PNG');
}
echo 'pathcurvetoquadraticbeziersmoothabsolute-basic.png', "\n";
$draw->clear();
$image->clear();

При успешном выполнении создаётся pathcurvetoquadraticbeziersmoothabsolute-basic.png 240×180. Две квадратичные половины: первая вверх, вторая вниз через общий узел (120,100). Консоль — pathcurvetoquadraticbeziersmoothabsolute-basic.png и перевод строки. Весь холст и все координаты создаются кодом; внешнее изображение не требуется. Start/Move/Finish — обязательное окружение path-команды. Сглаживание может немного различаться между сборками.

Практическая задача: Продолжение после линии: увидеть запасное правило

В соединителе перед кривой стоит прямой участок. Проверяем реальное поведение Smooth, чтобы не ожидать отражения несуществующей управляющей точки линии.

Продолжение после линии: увидеть запасное правилоПример для указанного окружения
<?php
declare(strict_types=1);

$image = new Imagick();
$image->newImage(320, 220, 'white');
$image->setImageFormat('png');
$draw = new ImagickDraw();
$draw->setStrokeColor('#146c74');
$draw->setStrokeWidth(3);
$draw->setFillColor('none');
$draw->pathStart();
$draw->pathMoveToAbsolute(30, 80);
$draw->pathLineToAbsolute(100, 80);
$draw->pathCurveToQuadraticBezierSmoothAbsolute(200, 140);
$draw->pathCurveToQuadraticBezierSmoothAbsolute(290, 80);
$draw->pathFinish();
$image->drawImage($draw);
$path = __DIR__ . '/line-then-quadratic.png';
if (!$image->writeImage($path)) {
    throw new RuntimeException('Не удалось сохранить PNG');
}
echo 'line-then-quadratic.png', "\n";
$draw->clear();
$image->clear();

Результат: line-then-quadratic.png 320×220; консоль — line-then-quadratic.png. Отрезок до (100,80), затем квадратичный участок с управляющей в самой (100,80) до (200,140), затем участок с отражённой управляющей (300,200) к (290,80). Первый T не получил точку от линии; второй уже отражает управляющую предыдущего T.

Что проверить и чем заменить

Отражение используется только после quadratic Q/q/T/t. После Move, Line, cubic C/S или дуги подходящей предыдущей квадратичной точки нет — управляющая совпадёт с текущей. Эта команда не продолжает кубическую кривую по её последней управляющей точке.

Стоимость. Запись команды в Draw не равна растеризации: основная работа с пикселями будет в drawImage, затем отдельная запись PNG. Ограничивайте площадь холста, число сегментов и объём внешних данных; память зависит от каналов и внутренних буферов. Для статичного значка сохраните PNG и используйте кэш, для изменяемой схемы браузера рассмотрите SVG/canvas. Сравнивайте время полного задания, не только одного вызова path-метода.

Рядом: ImagickDraw::pathCurveToQuadraticBezierSmoothRelative, ImagickDraw::pathCurveToQuadraticBezierAbsolute, ImagickDraw::pathCurveToSmoothAbsolute. Устройство текущей точки: базовые пути.

ImagickDraw::pathCurveToQuadraticBezierSmoothRelativeДля повторяемого мягкого контура удобно задать первую кривую явно, а следующие концы — одинаковыми локальными шагами. После q(50,-80,100,0) текущая (120,100), предыдущая управляющая (70,20). t(100,0) получает конец (220,100), а отражённую управляющую (170,180) вычисляет автоматически. База смещения конца — текущая точка, не отражённая.

PECL imagick 2, PECL imagick 3 · imagick

ImagickDraw::pathCurveToQuadraticBezierSmoothRelative(float $x, float $y): bool

Для повторяемого мягкого контура удобно задать первую кривую явно, а следующие концы — одинаковыми локальными шагами.

После q(50,-80,100,0) текущая (120,100), предыдущая управляющая (70,20). t(100,0) получает конец (220,100), а отражённую управляющую (170,180) вычисляет автоматически. База смещения конца — текущая точка, не отражённая.

Сигнатура: ImagickDraw::pathCurveToQuadraticBezierSmoothRelative(float $x, float $y): bool

ПараметрТипЧто передать
$xfloatdx конца от текущей точки; управляющая вычисляется отдельно
$yfloatdy конца от текущей точки

Все параметры обязательные, без значений по умолчанию, передаются по значению. Числовые координаты/радиусы задаются в единицах холста; дробные значения допустимы. В обычном холсте без преобразований одна единица соответствует пикселю; у поворота отдельные единицы — градусы. true/false — логические значения, не строки с этими словами.

Что возвращается. Сигнатура PHP Manual объявляет bool, а текст return в снимке говорит, что значения нет. Как и в базовых path-методах, это неточность документации: binding Imagick возвращает true после записи команды. Нативный запуск здесь ещё не подтверждён; PNG не является этим bool и появляется только после drawImage/writeImage. Не стройте цепочку объектных вызовов на возвращаемом значении.

Версии и отказы. Доступность в официальном снимке: PECL imagick 2, PECL imagick 3; deprecated/removed не указаны. Страница имеет предупреждение о неполной документации. Разделы errors/changelog в снимке пусты; это не обещание отсутствия ошибок. Неверный тип может дать TypeError; неверное состояние пути — ImagickDrawException или ошибку при drawImage. writeImage может вернуть false/вызвать ImagickException. Все программы строят завершённые пути и проверяют запись; внешний обработчик должен перехватывать ошибку задания и не выдавать пустой файл за успешный PNG.

Полный сохранённый контракт PHP Manual

Снимок сохранён поле в поле, включая английские правила, версии, ссылки и хеши. Русская таблица выше поясняет смысл; исходная неточность return не скрыта.

{
  "id": "imagickdraw.pathcurvetoquadraticbeziersmoothrelative",
  "name": "ImagickDraw::pathCurveToQuadraticBezierSmoothRelative",
  "purpose_en": "Draws a quadratic Bezier curve",
  "description_en": "Draws a quadratic Bezier curve (using relative coordinates) from the current point to (x, y). The control point is assumed to be the reflection of the control point on the previous command relative to the current point. (If there is no previous command or if the previous command was not a DrawPathCurveToQuadraticBezierAbsolute, DrawPathCurveToQuadraticBezierRelative, DrawPathCurveToQuadraticBezierSmoothAbsolut or DrawPathCurveToQuadraticBezierSmoothRelative, assume the control point is coincident with the current point). At the end of the command, the new current point becomes the final (x, y) coordinate pair used in the polybezier. This function cannot be used to continue a cubic Bezier curve smoothly. It can only continue from a quadratic curve smoothly.",
  "signature": "ImagickDraw::pathCurveToQuadraticBezierSmoothRelative(float $x, float $y): bool",
  "modifiers": [
    "public"
  ],
  "return_type": "bool",
  "parameters": [
    {
      "name": "x",
      "type": "float",
      "by_reference": false,
      "optional": false,
      "default": null,
      "description_en": "ending x coordinate"
    },
    {
      "name": "y",
      "type": "float",
      "by_reference": false,
      "optional": false,
      "default": null,
      "description_en": "ending y coordinate"
    }
  ],
  "return_en": "Nothing is returned.",
  "errors_en": "",
  "changelog_en": "",
  "examples": [
    {
      "title": "ImagickDraw::pathCurveToQuadraticBezierSmoothRelative example",
      "language": "php",
      "code_sha256": "be358c65e33c861bf4ed630774eeda05d3a7fc7d805155402ac85e8f9c39023d"
    }
  ],
  "see_also": [],
  "availability": {
    "from": "PECL imagick 2, PECL imagick 3",
    "deprecated": null,
    "removed": null
  },
  "official_url": "https://www.php.net/manual/en/imagickdraw.pathcurvetoquadraticbeziersmoothrelative.php",
  "official_page_sha256": "871a3f73d6ddfff01d34aef3c0b52f3cab13bcd3bc531b37894818b23f036d79",
  "xml_path": "evidence/imagick-sources/doc-en/reference/imagick/imagickdraw/pathcurvetoquadraticbeziersmoothrelative.xml",
  "xml_sha256": "56298a60928f9c9e64576b9adeed2762ca67d58355c11175511ccfb4b1d5049c",
  "official_undocumented_marker": true,
  "owner": "imagick_reference_draw_paths.py"
}
Та же гладкая пара квадратичных участков, записанная относительными координатами
Та же гладкая пара квадратичных участков, записанная относительными координатами Иллюстрация ImageMagick CLI; она показывает геометрию, но не подтверждает выполнение PHP Imagick.
Минимальное применение: Та же гладкая пара квадратичных участков, записанная относительными координатамиПример для указанного окружения
<?php
declare(strict_types=1);

$image = new Imagick();
$image->newImage(240, 180, 'white');
$image->setImageFormat('png');
$draw = new ImagickDraw();
$draw->setStrokeColor('#146c74');
$draw->setStrokeWidth(3);
$draw->setFillColor('none');
$draw->pathStart();
$draw->pathMoveToAbsolute(20, 100);
$draw->pathCurveToQuadraticBezierRelative(50, -80, 100, 0);
$draw->pathCurveToQuadraticBezierSmoothRelative(100, 0);
$draw->pathFinish();
$image->drawImage($draw);
$path = __DIR__ . '/pathcurvetoquadraticbeziersmoothrelative-basic.png';
if (!$image->writeImage($path)) {
    throw new RuntimeException('Не удалось сохранить PNG');
}
echo 'pathcurvetoquadraticbeziersmoothrelative-basic.png', "\n";
$draw->clear();
$image->clear();

При успешном выполнении создаётся pathcurvetoquadraticbeziersmoothrelative-basic.png 240×180. Та же гладкая пара квадратичных участков, записанная относительными координатами. Консоль — pathcurvetoquadraticbeziersmoothrelative-basic.png и перевод строки. Весь холст и все координаты создаются кодом; внешнее изображение не требуется. Start/Move/Finish — обязательное окружение path-команды. Сглаживание может немного различаться между сборками.

Практическая задача: Мягкая волнистая граница инструкции

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

Мягкая волнистая граница инструкцииПример для указанного окружения
<?php
declare(strict_types=1);

$image = new Imagick();
$image->newImage(380, 160, 'white');
$image->setImageFormat('png');
$draw = new ImagickDraw();
$draw->setStrokeColor('#146c74');
$draw->setStrokeWidth(3);
$draw->setFillColor('none');
$draw->pathStart();
$draw->pathMoveToAbsolute(20, 80);
$draw->pathCurveToQuadraticBezierRelative(40, -50, 80, 0);
foreach ([1, 2, 3] as $section) {
    $draw->pathCurveToQuadraticBezierSmoothRelative(80, 0);
}
$draw->pathFinish();
$image->drawImage($draw);
$path = __DIR__ . '/quadratic-border.png';
if (!$image->writeImage($path)) {
    throw new RuntimeException('Не удалось сохранить PNG');
}
echo 'quadratic-border.png', "\n";
$draw->clear();
$image->clear();

Результат: quadratic-border.png 380×160; консоль — quadratic-border.png. Четыре чередующихся верхних/нижних изгиба по 80 единиц: от (20,80) до (340,80). Вершины кривых находятся на y=55 и y=105. Каждое продолжение отражает управляющую предыдущего участка. Это декоративный контур, не сглаживание измеренного сигнала.

Что проверить и чем заменить

После каждого T/t отражается управляющая предыдущего участка, в том числе вычисленная неявно. Если вставить Move/Line или кубическую команду, цепочка квадратичной памяти прервётся и сработает запасное правило с управляющей в текущей точке.

Стоимость. Запись команды в Draw не равна растеризации: основная работа с пикселями будет в drawImage, затем отдельная запись PNG. Ограничивайте площадь холста, число сегментов и объём внешних данных; память зависит от каналов и внутренних буферов. Для статичного значка сохраните PNG и используйте кэш, для изменяемой схемы браузера рассмотрите SVG/canvas. Сравнивайте время полного задания, не только одного вызова path-метода.

Рядом: ImagickDraw::pathCurveToQuadraticBezierSmoothAbsolute, ImagickDraw::pathCurveToQuadraticBezierRelative. Устройство текущей точки: базовые пути.

ImagickDraw::pathCurveToSmoothAbsoluteНужен S-образный соединитель: первая половина задана двумя управляющими точками, следующую хочется продолжить с согласованным направлением. Предыдущая C закончилась в P=(120,100), её вторая управляющая C2=(90,20). Новая первая управляющая автоматически C1′=(150,180); передаём только вторую (190,180) и конец (220,100).

PECL imagick 2, PECL imagick 3 · imagick

ImagickDraw::pathCurveToSmoothAbsolute(float $x2, float $y2, float $x, float $y): bool

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

Предыдущая C закончилась в P=(120,100), её вторая управляющая C2=(90,20). Новая первая управляющая автоматически C1′=(150,180); передаём только вторую (190,180) и конец (220,100).

Сигнатура: ImagickDraw::pathCurveToSmoothAbsolute(float $x2, float $y2, float $x, float $y): bool

ПараметрТипЧто передать
$x2floatАбсолютный x второй управляющей новой кривой
$y2floatАбсолютный y второй управляющей
$xfloatАбсолютный x конца
$yfloatАбсолютный y конца

Все параметры обязательные, без значений по умолчанию, передаются по значению. Числовые координаты/радиусы задаются в единицах холста; дробные значения допустимы. В обычном холсте без преобразований одна единица соответствует пикселю; у поворота отдельные единицы — градусы. true/false — логические значения, не строки с этими словами.

Что возвращается. Сигнатура PHP Manual объявляет bool, а текст return в снимке говорит, что значения нет. Как и в базовых path-методах, это неточность документации: binding Imagick возвращает true после записи команды. Нативный запуск здесь ещё не подтверждён; PNG не является этим bool и появляется только после drawImage/writeImage. Не стройте цепочку объектных вызовов на возвращаемом значении.

Версии и отказы. Доступность в официальном снимке: PECL imagick 2, PECL imagick 3; deprecated/removed не указаны. Страница имеет предупреждение о неполной документации. Разделы errors/changelog в снимке пусты; это не обещание отсутствия ошибок. Неверный тип может дать TypeError; неверное состояние пути — ImagickDrawException или ошибку при drawImage. writeImage может вернуть false/вызвать ImagickException. Все программы строят завершённые пути и проверяют запись; внешний обработчик должен перехватывать ошибку задания и не выдавать пустой файл за успешный PNG.

Полный сохранённый контракт PHP Manual

Снимок сохранён поле в поле, включая английские правила, версии, ссылки и хеши. Русская таблица выше поясняет смысл; исходная неточность return не скрыта.

{
  "id": "imagickdraw.pathcurvetosmoothabsolute",
  "name": "ImagickDraw::pathCurveToSmoothAbsolute",
  "purpose_en": "Draws a cubic Bezier curve",
  "description_en": "Draws a cubic Bezier curve from the current point to (x,y) using absolute coordinates. The first control point is assumed to be the reflection of the second control point on the previous command relative to the current point. (If there is no previous command or if the previous command was not an DrawPathCurveToAbsolute, DrawPathCurveToRelative, DrawPathCurveToSmoothAbsolute or DrawPathCurveToSmoothRelative, assume the first control point is coincident with the current point.) (x2,y2) is the second control point (i.e., the control point at the end of the curve). At the end of the command, the new current point becomes the final (x,y) coordinate pair used in the polybezier.",
  "signature": "ImagickDraw::pathCurveToSmoothAbsolute(float $x2, float $y2, float $x, float $y): bool",
  "modifiers": [
    "public"
  ],
  "return_type": "bool",
  "parameters": [
    {
      "name": "x2",
      "type": "float",
      "by_reference": false,
      "optional": false,
      "default": null,
      "description_en": "x coordinate of the second control point"
    },
    {
      "name": "y2",
      "type": "float",
      "by_reference": false,
      "optional": false,
      "default": null,
      "description_en": "y coordinate of the second control point"
    },
    {
      "name": "x",
      "type": "float",
      "by_reference": false,
      "optional": false,
      "default": null,
      "description_en": "x coordinate of the ending point"
    },
    {
      "name": "y",
      "type": "float",
      "by_reference": false,
      "optional": false,
      "default": null,
      "description_en": "y coordinate of the ending point"
    }
  ],
  "return_en": "Nothing is returned.",
  "errors_en": "",
  "changelog_en": "",
  "examples": [],
  "see_also": [],
  "availability": {
    "from": "PECL imagick 2, PECL imagick 3",
    "deprecated": null,
    "removed": null
  },
  "official_url": "https://www.php.net/manual/en/imagickdraw.pathcurvetosmoothabsolute.php",
  "official_page_sha256": "756341dea9211309b65f36b812eb073d42424b778c34bf3bc4ba5bf43c0165d3",
  "xml_path": "evidence/imagick-sources/doc-en/reference/imagick/imagickdraw/pathcurvetosmoothabsolute.xml",
  "xml_sha256": "40e6d335c0cca9bd9309dda9d633b966e4a1f7387e8e98caab34833e5bf24f2f",
  "official_undocumented_marker": true,
  "owner": "imagick_reference_draw_paths.py"
}
Кубическая S-образная связь с верхней и нижней половинами
Кубическая S-образная связь с верхней и нижней половинами Иллюстрация ImageMagick CLI; она показывает геометрию, но не подтверждает выполнение PHP Imagick.
Минимальное применение: Кубическая S-образная связь с верхней и нижней половинамиПример для указанного окружения
<?php
declare(strict_types=1);

$image = new Imagick();
$image->newImage(240, 180, 'white');
$image->setImageFormat('png');
$draw = new ImagickDraw();
$draw->setStrokeColor('#146c74');
$draw->setStrokeWidth(3);
$draw->setFillColor('none');
$draw->pathStart();
$draw->pathMoveToAbsolute(20, 100);
$draw->pathCurveToAbsolute(50, 20, 90, 20, 120, 100);
$draw->pathCurveToSmoothAbsolute(190, 180, 220, 100);
$draw->pathFinish();
$image->drawImage($draw);
$path = __DIR__ . '/pathcurvetosmoothabsolute-basic.png';
if (!$image->writeImage($path)) {
    throw new RuntimeException('Не удалось сохранить PNG');
}
echo 'pathcurvetosmoothabsolute-basic.png', "\n";
$draw->clear();
$image->clear();

При успешном выполнении создаётся pathcurvetosmoothabsolute-basic.png 240×180. Кубическая S-образная связь с верхней и нижней половинами. Консоль — pathcurvetosmoothabsolute-basic.png и перевод строки. Весь холст и все координаты создаются кодом; внешнее изображение не требуется. Start/Move/Finish — обязательное окружение path-команды. Сглаживание может немного различаться между сборками.

Практическая задача: Исправить ожидание плавного выхода из прямого блока

Сравниваем соединение после Line: сверху Smooth с автоматической первой точкой, снизу явная кубическая CurveTo с нужной горизонтальной касательной.

Исправить ожидание плавного выхода из прямого блокаПример для указанного окружения
<?php
declare(strict_types=1);

$image = new Imagick();
$image->newImage(280, 260, 'white');
$image->setImageFormat('png');
$draw = new ImagickDraw();
$draw->setStrokeColor('#146c74');
$draw->setStrokeWidth(3);
$draw->setFillColor('none');
$draw->pathStart();
$draw->pathMoveToAbsolute(20, 50);
$draw->pathLineToAbsolute(70, 50);
$draw->pathCurveToSmoothAbsolute(150, 150, 250, 80);
$draw->pathFinish();
$draw->setStrokeColor('#c25732');
$draw->pathStart();
$draw->pathMoveToAbsolute(20, 150);
$draw->pathLineToAbsolute(70, 150);
$draw->pathCurveToAbsolute(120, 150, 150, 250, 250, 180);
$draw->pathFinish();
$image->drawImage($draw);
$path = __DIR__ . '/explicit-cubic-exit.png';
if (!$image->writeImage($path)) {
    throw new RuntimeException('Не удалось сохранить PNG');
}
echo 'explicit-cubic-exit.png', "\n";
$draw->clear();
$image->clear();

Результат: explicit-cubic-exit.png 280×260; консоль — explicit-cubic-exit.png. Сверху бирюзовый соединитель: S после линии берёт первую управляющую в (70,50), не отражает направление прямого участка. Снизу оранжевый: первая явная управляющая (120,150) задаёт горизонтальный выход. Если важна конкретная касательная, используйте явную C, а не название Smooth.

Что проверить и чем заменить

Подходящий предшественник — только cubic C/c/S/s. После quadratic или Line первая управляющая приравнивается текущей; название Smooth не обещает визуальную плавность с любой предыдущей фигурой. Для намеренного угла или особой касательной задайте обе точки явно в CurveTo.

Стоимость. Запись команды в Draw не равна растеризации: основная работа с пикселями будет в drawImage, затем отдельная запись PNG. Ограничивайте площадь холста, число сегментов и объём внешних данных; память зависит от каналов и внутренних буферов. Для статичного значка сохраните PNG и используйте кэш, для изменяемой схемы браузера рассмотрите SVG/canvas. Сравнивайте время полного задания, не только одного вызова path-метода.

Рядом: ImagickDraw::pathCurveToSmoothRelative, ImagickDraw::pathCurveToQuadraticBezierSmoothAbsolute. Устройство текущей точки: базовые пути.

ImagickDraw::pathCurveToSmoothRelativeУзор ленты или повторяющаяся плавная связь собирается из одинаковых модулей. Отражение экономит одну пару чисел, а Relative оставляет модуль локальным. Начало второго участка P=(120,100). (70,80) даёт вторую управляющую (190,180); (100,0) даёт конец (220,100). Первая управляющая отражается из прежней C2 в (150,180), независимо от переданной второй пары.

PECL imagick 2, PECL imagick 3 · imagick

ImagickDraw::pathCurveToSmoothRelative(float $x2, float $y2, float $x, float $y): bool

Узор ленты или повторяющаяся плавная связь собирается из одинаковых модулей. Отражение экономит одну пару чисел, а Relative оставляет модуль локальным.

Начало второго участка P=(120,100). (70,80) даёт вторую управляющую (190,180); (100,0) даёт конец (220,100). Первая управляющая отражается из прежней C2 в (150,180), независимо от переданной второй пары.

Сигнатура: ImagickDraw::pathCurveToSmoothRelative(float $x2, float $y2, float $x, float $y): bool

ПараметрТипЧто передать
$x2floatdx второй управляющей от текущей точки до вызова
$y2floatdy второй управляющей от той же базы
$xfloatdx конца от той же базы
$yfloatdy конца от той же базы

Все параметры обязательные, без значений по умолчанию, передаются по значению. Числовые координаты/радиусы задаются в единицах холста; дробные значения допустимы. В обычном холсте без преобразований одна единица соответствует пикселю; у поворота отдельные единицы — градусы. true/false — логические значения, не строки с этими словами.

Что возвращается. Сигнатура PHP Manual объявляет bool, а текст return в снимке говорит, что значения нет. Как и в базовых path-методах, это неточность документации: binding Imagick возвращает true после записи команды. Нативный запуск здесь ещё не подтверждён; PNG не является этим bool и появляется только после drawImage/writeImage. Не стройте цепочку объектных вызовов на возвращаемом значении.

Версии и отказы. Доступность в официальном снимке: PECL imagick 2, PECL imagick 3; deprecated/removed не указаны. Страница имеет предупреждение о неполной документации. Разделы errors/changelog в снимке пусты; это не обещание отсутствия ошибок. Неверный тип может дать TypeError; неверное состояние пути — ImagickDrawException или ошибку при drawImage. writeImage может вернуть false/вызвать ImagickException. Все программы строят завершённые пути и проверяют запись; внешний обработчик должен перехватывать ошибку задания и не выдавать пустой файл за успешный PNG.

Полный сохранённый контракт PHP Manual

Снимок сохранён поле в поле, включая английские правила, версии, ссылки и хеши. Русская таблица выше поясняет смысл; исходная неточность return не скрыта.

{
  "id": "imagickdraw.pathcurvetosmoothrelative",
  "name": "ImagickDraw::pathCurveToSmoothRelative",
  "purpose_en": "Draws a cubic Bezier curve",
  "description_en": "Draws a cubic Bezier curve from the current point to (x,y) using relative coordinates. The first control point is assumed to be the reflection of the second control point on the previous command relative to the current point. (If there is no previous command or if the previous command was not an DrawPathCurveToAbsolute, DrawPathCurveToRelative, DrawPathCurveToSmoothAbsolute or DrawPathCurveToSmoothRelative, assume the first control point is coincident with the current point.) (x2,y2) is the second control point (i.e., the control point at the end of the curve). At the end of the command, the new current point becomes the final (x,y) coordinate pair used in the polybezier.",
  "signature": "ImagickDraw::pathCurveToSmoothRelative(float $x2, float $y2, float $x, float $y): bool",
  "modifiers": [
    "public"
  ],
  "return_type": "bool",
  "parameters": [
    {
      "name": "x2",
      "type": "float",
      "by_reference": false,
      "optional": false,
      "default": null,
      "description_en": "x coordinate of the second control point"
    },
    {
      "name": "y2",
      "type": "float",
      "by_reference": false,
      "optional": false,
      "default": null,
      "description_en": "y coordinate of the second control point"
    },
    {
      "name": "x",
      "type": "float",
      "by_reference": false,
      "optional": false,
      "default": null,
      "description_en": "x coordinate of the ending point"
    },
    {
      "name": "y",
      "type": "float",
      "by_reference": false,
      "optional": false,
      "default": null,
      "description_en": "y coordinate of the ending point"
    }
  ],
  "return_en": "Nothing is returned.",
  "errors_en": "",
  "changelog_en": "",
  "examples": [],
  "see_also": [],
  "availability": {
    "from": "PECL imagick 2, PECL imagick 3",
    "deprecated": null,
    "removed": null
  },
  "official_url": "https://www.php.net/manual/en/imagickdraw.pathcurvetosmoothrelative.php",
  "official_page_sha256": "3e5fa0f4a12b87bbcfae20e0621298d35ab468a870120c1f26825b7d4feec551",
  "xml_path": "evidence/imagick-sources/doc-en/reference/imagick/imagickdraw/pathcurvetosmoothrelative.xml",
  "xml_sha256": "ba6e1311d3600bcf82e0daf07e286da0be4202973588b8b1b92041b9203cce98",
  "official_undocumented_marker": true,
  "owner": "imagick_reference_draw_paths.py"
}
Тот же кубический S-переход, заданный локальными смещениями
Тот же кубический S-переход, заданный локальными смещениями Иллюстрация ImageMagick CLI; она показывает геометрию, но не подтверждает выполнение PHP Imagick.
Минимальное применение: Тот же кубический S-переход, заданный локальными смещениямиПример для указанного окружения
<?php
declare(strict_types=1);

$image = new Imagick();
$image->newImage(240, 180, 'white');
$image->setImageFormat('png');
$draw = new ImagickDraw();
$draw->setStrokeColor('#146c74');
$draw->setStrokeWidth(3);
$draw->setFillColor('none');
$draw->pathStart();
$draw->pathMoveToAbsolute(20, 100);
$draw->pathCurveToRelative(30, -80, 70, -80, 100, 0);
$draw->pathCurveToSmoothRelative(70, 80, 100, 0);
$draw->pathFinish();
$image->drawImage($draw);
$path = __DIR__ . '/pathcurvetosmoothrelative-basic.png';
if (!$image->writeImage($path)) {
    throw new RuntimeException('Не удалось сохранить PNG');
}
echo 'pathcurvetosmoothrelative-basic.png', "\n";
$draw->clear();
$image->clear();

При успешном выполнении создаётся pathcurvetosmoothrelative-basic.png 240×180. Тот же кубический S-переход, заданный локальными смещениями. Консоль — pathcurvetosmoothrelative-basic.png и перевод строки. Весь холст и все координаты создаются кодом; внешнее изображение не требуется. Start/Move/Finish — обязательное окружение path-команды. Сглаживание может немного различаться между сборками.

Практическая задача: Полоса повторяемого кубического узора

Для маркировки отчёта нужна последовательность крупных плавных изгибов. Задаём начальную кривую и поочерёдно вторые управляющие вверх/вниз; первая отражается из предыдущего участка.

Полоса повторяемого кубического узораПример для указанного окружения
<?php
declare(strict_types=1);

$image = new Imagick();
$image->newImage(460, 200, 'white');
$image->setImageFormat('png');
$draw = new ImagickDraw();
$draw->setStrokeColor('#146c74');
$draw->setStrokeWidth(3);
$draw->setFillColor('none');
$draw->pathStart();
$draw->pathMoveToAbsolute(20, 100);
$draw->pathCurveToRelative(30, -80, 70, -80, 100, 0);
foreach ([80, -80, 80] as $controlY) {
    $draw->pathCurveToSmoothRelative(70, $controlY, 100, 0);
}
$draw->pathFinish();
$image->drawImage($draw);
$path = __DIR__ . '/cubic-ribbon.png';
if (!$image->writeImage($path)) {
    throw new RuntimeException('Не удалось сохранить PNG');
}
echo 'cubic-ribbon.png', "\n";
$draw->clear();
$image->clear();

Результат: cubic-ribbon.png 460×200; консоль — cubic-ribbon.png. Четыре кубических полуволны от (20,100) до (420,100), чередующиеся вверх и вниз. После каждого S текущая точка сдвигается на 100 вправо; отражение берёт новую предыдущую вторую управляющую, не одну исходную точку для всего цикла.

Что проверить и чем заменить

Обе явные пары считаются от P до команды. Нельзя конец прибавлять к новой второй управляющей точке. После каждого S/s текущий конец и вторая управляющая запоминаются для следующего отражения; после команды другого семейства отражение сбрасывается.

Стоимость. Запись команды в Draw не равна растеризации: основная работа с пикселями будет в drawImage, затем отдельная запись PNG. Ограничивайте площадь холста, число сегментов и объём внешних данных; память зависит от каналов и внутренних буферов. Для статичного значка сохраните PNG и используйте кэш, для изменяемой схемы браузера рассмотрите SVG/canvas. Сравнивайте время полного задания, не только одного вызова path-метода.

Рядом: ImagickDraw::pathCurveToSmoothAbsolute, ImagickDraw::pathCurveToQuadraticBezierSmoothRelative. Устройство текущей точки: базовые пути.

ImagickDraw::pathEllipticArcAbsoluteНужно соединить две позиции участком настоящего эллипса: например, ручка значка пакета или овальный вырез, а не произвольная кривая Безье. Начало (80,110) уже задано Move. Радиусы 70 и 50 определяют форму эллипса, rotation=0 — его поворот; false выбирает малую дугу, true — положительное направление. Конец задан абсолютной точкой (160,70). Центр движок вычисляет сам.

PECL imagick 2, PECL imagick 3 · imagick

ImagickDraw::pathEllipticArcAbsolute(float $rx, float $ry, float $x_axis_rotation, bool $large_arc, bool $sweep, float $x, float $y): bool

Нужно соединить две позиции участком настоящего эллипса: например, ручка значка пакета или овальный вырез, а не произвольная кривая Безье.

Начало (80,110) уже задано Move. Радиусы 70 и 50 определяют форму эллипса, rotation=0 — его поворот; false выбирает малую дугу, true — положительное направление. Конец задан абсолютной точкой (160,70). Центр движок вычисляет сам.

Сигнатура: ImagickDraw::pathEllipticArcAbsolute(float $rx, float $ry, float $x_axis_rotation, bool $large_arc, bool $sweep, float $x, float $y): bool

ПараметрТипЧто передать
$rxfloatГоризонтальный радиус эллипса в его локальных осях
$ryfloatВертикальный радиус эллипса в его локальных осях
$x_axis_rotationfloatПоворот осей эллипса в градусах, не радианах
$large_arcboolfalse: малая дуга, true: большая; при 180° выбор не различает длину
$sweepboolНаправление обхода; true — положительное угловое направление
$xfloatАбсолютный x конца дуги
$yfloatАбсолютный y конца дуги

Все параметры обязательные, без значений по умолчанию, передаются по значению. Числовые координаты/радиусы задаются в единицах холста; дробные значения допустимы. В обычном холсте без преобразований одна единица соответствует пикселю; у поворота отдельные единицы — градусы. true/false — логические значения, не строки с этими словами.

Что возвращается. Сигнатура PHP Manual объявляет bool, а текст return в снимке говорит, что значения нет. Как и в базовых path-методах, это неточность документации: binding Imagick возвращает true после записи команды. Нативный запуск здесь ещё не подтверждён; PNG не является этим bool и появляется только после drawImage/writeImage. Не стройте цепочку объектных вызовов на возвращаемом значении.

Версии и отказы. Доступность в официальном снимке: PECL imagick 2, PECL imagick 3; deprecated/removed не указаны. Страница имеет предупреждение о неполной документации. Разделы errors/changelog в снимке пусты; это не обещание отсутствия ошибок. Неверный тип может дать TypeError; неверное состояние пути — ImagickDrawException или ошибку при drawImage. writeImage может вернуть false/вызвать ImagickException. Все программы строят завершённые пути и проверяют запись; внешний обработчик должен перехватывать ошибку задания и не выдавать пустой файл за успешный PNG.

Полный сохранённый контракт PHP Manual

Снимок сохранён поле в поле, включая английские правила, версии, ссылки и хеши. Русская таблица выше поясняет смысл; исходная неточность return не скрыта.

{
  "id": "imagickdraw.pathellipticarcabsolute",
  "name": "ImagickDraw::pathEllipticArcAbsolute",
  "purpose_en": "Draws an elliptical arc",
  "description_en": "Draws an elliptical arc from the current point to (x, y) using absolute coordinates. The size and orientation of the ellipse are defined by two radii (rx, ry) and an xAxisRotation, which indicates how the ellipse as a whole is rotated relative to the current coordinate system. The center (cx, cy) of the ellipse is calculated automatically to satisfy the constraints imposed by the other parameters. largeArcFlag and sweepFlag contribute to the automatic calculations and help determine how the arc is drawn. If large_arc is true then draw the larger of the available arcs. If sweep is true, then draw the arc matching a clock-wise rotation.",
  "signature": "ImagickDraw::pathEllipticArcAbsolute(float $rx, float $ry, float $x_axis_rotation, bool $large_arc, bool $sweep, float $x, float $y): bool",
  "modifiers": [
    "public"
  ],
  "return_type": "bool",
  "parameters": [
    {
      "name": "rx",
      "type": "float",
      "by_reference": false,
      "optional": false,
      "default": null,
      "description_en": "x radius"
    },
    {
      "name": "ry",
      "type": "float",
      "by_reference": false,
      "optional": false,
      "default": null,
      "description_en": "y radius"
    },
    {
      "name": "x_axis_rotation",
      "type": "float",
      "by_reference": false,
      "optional": false,
      "default": null,
      "description_en": "x axis rotation"
    },
    {
      "name": "large_arc",
      "type": "bool",
      "by_reference": false,
      "optional": false,
      "default": null,
      "description_en": "large arc flag"
    },
    {
      "name": "sweep",
      "type": "bool",
      "by_reference": false,
      "optional": false,
      "default": null,
      "description_en": "sweep flag"
    },
    {
      "name": "x",
      "type": "float",
      "by_reference": false,
      "optional": false,
      "default": null,
      "description_en": "x coordinate"
    },
    {
      "name": "y",
      "type": "float",
      "by_reference": false,
      "optional": false,
      "default": null,
      "description_en": "y coordinate"
    }
  ],
  "return_en": "Nothing is returned.",
  "errors_en": "",
  "changelog_en": "",
  "examples": [],
  "see_also": [],
  "availability": {
    "from": "PECL imagick 2, PECL imagick 3",
    "deprecated": null,
    "removed": null
  },
  "official_url": "https://www.php.net/manual/en/imagickdraw.pathellipticarcabsolute.php",
  "official_page_sha256": "c98e5e110b6e463b3550800ceccfe0b00193d5d7df1f7ea431a7fe5b9eeed4b3",
  "xml_path": "evidence/imagick-sources/doc-en/reference/imagick/imagickdraw/pathellipticarcabsolute.xml",
  "xml_sha256": "b9a52a71f11512e78da3aa390e632ea5bad6e623842c7b7a58b4fd93a58f4136",
  "official_undocumented_marker": true,
  "owner": "imagick_reference_draw_paths.py"
}
Малая эллиптическая дуга между (80,110) и (160,70)
Малая эллиптическая дуга между (80,110) и (160,70) Иллюстрация ImageMagick CLI; она показывает геометрию, но не подтверждает выполнение PHP Imagick.
Минимальное применение: Малая эллиптическая дуга между (80,110) и (160,70)Пример для указанного окружения
<?php
declare(strict_types=1);

$image = new Imagick();
$image->newImage(240, 180, 'white');
$image->setImageFormat('png');
$draw = new ImagickDraw();
$draw->setStrokeColor('#146c74');
$draw->setStrokeWidth(3);
$draw->setFillColor('none');
$draw->pathStart();
$draw->pathMoveToAbsolute(80, 110);
$draw->pathEllipticArcAbsolute(70, 50, 0, false, true, 160, 70);
$draw->pathFinish();
$image->drawImage($draw);
$path = __DIR__ . '/pathellipticarcabsolute-basic.png';
if (!$image->writeImage($path)) {
    throw new RuntimeException('Не удалось сохранить PNG');
}
echo 'pathellipticarcabsolute-basic.png', "\n";
$draw->clear();
$image->clear();

При успешном выполнении создаётся pathellipticarcabsolute-basic.png 240×180. Малая эллиптическая дуга между (80,110) и (160,70). Консоль — pathellipticarcabsolute-basic.png и перевод строки. Весь холст и все координаты создаются кодом; внешнее изображение не требуется. Start/Move/Finish — обязательное окружение path-команды. Сглаживание может немного различаться между сборками.

Практическая задача: Четыре варианта дуги по двум независимым флагам

Прежде чем делать овальную выемку, сравним все допустимые пути между одинаковыми относительными позициями. Меняется только large/sweep, а геометрия концов и радиусы одинаковы.

Четыре варианта дуги по двум независимым флагамПример для указанного окружения
<?php
declare(strict_types=1);

$image = new Imagick();
$image->newImage(480, 360, 'white');
$image->setImageFormat('png');
$draw = new ImagickDraw();
$draw->setStrokeColor('#146c74');
$draw->setStrokeWidth(3);
$draw->setFillColor('none');
$variants = [
    ['large' => false, 'sweep' => false, 'x' => 0, 'y' => 0],
    ['large' => false, 'sweep' => true, 'x' => 240, 'y' => 0],
    ['large' => true, 'sweep' => false, 'x' => 0, 'y' => 180],
    ['large' => true, 'sweep' => true, 'x' => 240, 'y' => 180],
];
foreach ($variants as $variant) {
    $ox = $variant['x']; $oy = $variant['y'];
    $draw->pathStart();
    $draw->pathMoveToAbsolute(80 + $ox, 110 + $oy);
    $draw->pathEllipticArcAbsolute(
        70, 50, 0, $variant['large'], $variant['sweep'], 160 + $ox, 70 + $oy
    );
    $draw->pathFinish();
}
$image->drawImage($draw);
$path = __DIR__ . '/arc-flags.png';
if (!$image->writeImage($path)) {
    throw new RuntimeException('Не удалось сохранить PNG');
}
echo 'arc-flags.png', "\n";
$draw->clear();
$image->clear();

Результат: arc-flags.png 480×360; консоль — arc-flags.png. Сетка 2×2 без заливки: слева сверху false/false, справа сверху false/true, слева снизу true/false, справа снизу true/true. Верхний ряд — малые дуги, нижний — большие. Смена sweep выбирает другую сторону обхода. Начало каждой ячейки локально (80,110), конец (160,70).

Что проверить и чем заменить

rx/ry — радиусы эллипса, не координаты конца и не размеры рамки. Флаги large_arc и sweep независимы. При обычных осях x вправо/y вниз sweep=true соответствует ходу по часовой стрелке; отражение или иная трансформация системы меняет экранное восприятие направления.

Нулевые/отрицательные/слишком маленькие радиусы и совпадающие концы подробно разобраны в таблице пограничных случаев. Если нужен полный овал без смешанного контура, ellipse проще двух дуг.

Стоимость. Запись команды в Draw не равна растеризации: основная работа с пикселями будет в drawImage, затем отдельная запись PNG. Ограничивайте площадь холста, число сегментов и объём внешних данных; память зависит от каналов и внутренних буферов. Для статичного значка сохраните PNG и используйте кэш, для изменяемой схемы браузера рассмотрите SVG/canvas. Сравнивайте время полного задания, не только одного вызова path-метода.

Рядом: ImagickDraw::pathEllipticArcRelative, ImagickDraw::pathCurveToQuadraticBezierAbsolute. Устройство текущей точки: базовые пути.

ImagickDraw::pathEllipticArcRelativeОвальный значок нужно собрать как локальный замкнутый контур из двух дуг. Радиусы и поворот остаются свойствами эллипса, а конец каждой дуги задаётся сдвигом. Из (80,110) последняя пара (80,-40) приводит в (160,70). Первые rx=70, ry=50 и rotation=0 не прибавляются к текущей точке: относительными являются только конечные x/y.

PECL imagick 2, PECL imagick 3 · imagick

ImagickDraw::pathEllipticArcRelative(float $rx, float $ry, float $x_axis_rotation, bool $large_arc, bool $sweep, float $x, float $y): bool

Овальный значок нужно собрать как локальный замкнутый контур из двух дуг. Радиусы и поворот остаются свойствами эллипса, а конец каждой дуги задаётся сдвигом.

Из (80,110) последняя пара (80,-40) приводит в (160,70). Первые rx=70, ry=50 и rotation=0 не прибавляются к текущей точке: относительными являются только конечные x/y.

Сигнатура: ImagickDraw::pathEllipticArcRelative(float $rx, float $ry, float $x_axis_rotation, bool $large_arc, bool $sweep, float $x, float $y): bool

ПараметрТипЧто передать
$rxfloatРадиус rx; это размер, не dx
$ryfloatРадиус ry; это размер, не dy
$x_axis_rotationfloatПоворот осей эллипса в градусах; это не начальный угол
$large_arcboolВыбор малой/большой дуги
$sweepboolВыбор направления обхода
$xfloatdx конца от текущего начала
$yfloatdy конца от текущего начала

Все параметры обязательные, без значений по умолчанию, передаются по значению. Числовые координаты/радиусы задаются в единицах холста; дробные значения допустимы. В обычном холсте без преобразований одна единица соответствует пикселю; у поворота отдельные единицы — градусы. true/false — логические значения, не строки с этими словами.

Что возвращается. Сигнатура PHP Manual объявляет bool, а текст return в снимке говорит, что значения нет. Как и в базовых path-методах, это неточность документации: binding Imagick возвращает true после записи команды. Нативный запуск здесь ещё не подтверждён; PNG не является этим bool и появляется только после drawImage/writeImage. Не стройте цепочку объектных вызовов на возвращаемом значении.

Версии и отказы. Доступность в официальном снимке: PECL imagick 2, PECL imagick 3; deprecated/removed не указаны. Страница имеет предупреждение о неполной документации. Разделы errors/changelog в снимке пусты; это не обещание отсутствия ошибок. Неверный тип может дать TypeError; неверное состояние пути — ImagickDrawException или ошибку при drawImage. writeImage может вернуть false/вызвать ImagickException. Все программы строят завершённые пути и проверяют запись; внешний обработчик должен перехватывать ошибку задания и не выдавать пустой файл за успешный PNG.

Полный сохранённый контракт PHP Manual

Снимок сохранён поле в поле, включая английские правила, версии, ссылки и хеши. Русская таблица выше поясняет смысл; исходная неточность return не скрыта.

{
  "id": "imagickdraw.pathellipticarcrelative",
  "name": "ImagickDraw::pathEllipticArcRelative",
  "purpose_en": "Draws an elliptical arc",
  "description_en": "Draws an elliptical arc from the current point to (x, y) using relative coordinates. The size and orientation of the ellipse are defined by two radii (rx, ry) and an xAxisRotation, which indicates how the ellipse as a whole is rotated relative to the current coordinate system. The center (cx, cy) of the ellipse is calculated automatically to satisfy the constraints imposed by the other parameters. largeArcFlag and sweepFlag contribute to the automatic calculations and help determine how the arc is drawn. If large_arc is true then draw the larger of the available arcs. If sweep is true, then draw the arc matching a clock-wise rotation.",
  "signature": "ImagickDraw::pathEllipticArcRelative(float $rx, float $ry, float $x_axis_rotation, bool $large_arc, bool $sweep, float $x, float $y): bool",
  "modifiers": [
    "public"
  ],
  "return_type": "bool",
  "parameters": [
    {
      "name": "rx",
      "type": "float",
      "by_reference": false,
      "optional": false,
      "default": null,
      "description_en": "x radius"
    },
    {
      "name": "ry",
      "type": "float",
      "by_reference": false,
      "optional": false,
      "default": null,
      "description_en": "y radius"
    },
    {
      "name": "x_axis_rotation",
      "type": "float",
      "by_reference": false,
      "optional": false,
      "default": null,
      "description_en": "x axis rotation"
    },
    {
      "name": "large_arc",
      "type": "bool",
      "by_reference": false,
      "optional": false,
      "default": null,
      "description_en": "large arc flag"
    },
    {
      "name": "sweep",
      "type": "bool",
      "by_reference": false,
      "optional": false,
      "default": null,
      "description_en": "sweep flag"
    },
    {
      "name": "x",
      "type": "float",
      "by_reference": false,
      "optional": false,
      "default": null,
      "description_en": "x coordinate"
    },
    {
      "name": "y",
      "type": "float",
      "by_reference": false,
      "optional": false,
      "default": null,
      "description_en": "y coordinate"
    }
  ],
  "return_en": "Nothing is returned.",
  "errors_en": "",
  "changelog_en": "",
  "examples": [],
  "see_also": [],
  "availability": {
    "from": "PECL imagick 2, PECL imagick 3",
    "deprecated": null,
    "removed": null
  },
  "official_url": "https://www.php.net/manual/en/imagickdraw.pathellipticarcrelative.php",
  "official_page_sha256": "3fb40c7dd675ca11a5bf6fc455d063327ec8b8ef0c0ea3efedce642d195875ec",
  "xml_path": "evidence/imagick-sources/doc-en/reference/imagick/imagickdraw/pathellipticarcrelative.xml",
  "xml_sha256": "c516eaa388057ce038889c74e07d9dfbf6d7f548d4dfdb8e891c03665ff6c3f4",
  "official_undocumented_marker": true,
  "owner": "imagick_reference_draw_paths.py"
}
Та же малая дуга с относительным концом (80,-40)
Та же малая дуга с относительным концом (80,-40) Иллюстрация ImageMagick CLI; она показывает геометрию, но не подтверждает выполнение PHP Imagick.
Минимальное применение: Та же малая дуга с относительным концом (80,-40)Пример для указанного окружения
<?php
declare(strict_types=1);

$image = new Imagick();
$image->newImage(240, 180, 'white');
$image->setImageFormat('png');
$draw = new ImagickDraw();
$draw->setStrokeColor('#146c74');
$draw->setStrokeWidth(3);
$draw->setFillColor('none');
$draw->pathStart();
$draw->pathMoveToAbsolute(80, 110);
$draw->pathEllipticArcRelative(70, 50, 0, false, true, 80, -40);
$draw->pathFinish();
$image->drawImage($draw);
$path = __DIR__ . '/pathellipticarcrelative-basic.png';
if (!$image->writeImage($path)) {
    throw new RuntimeException('Не удалось сохранить PNG');
}
echo 'pathellipticarcrelative-basic.png', "\n";
$draw->clear();
$image->clear();

При успешном выполнении создаётся pathellipticarcrelative-basic.png 240×180. Та же малая дуга с относительным концом (80,-40). Консоль — pathellipticarcrelative-basic.png и перевод строки. Весь холст и все координаты создаются кодом; внешнее изображение не требуется. Start/Move/Finish — обязательное окружение path-команды. Сглаживание может немного различаться между сборками.

Практическая задача: Замкнутый наклонный овальный стикер из двух дуг

Одной дугой с одинаковыми началом и концом овал не получится. Используем промежуточную противоположную точку, вторую дугу обратно и общий поворот 30°.

Замкнутый наклонный овальный стикер из двух дугПример для указанного окружения
<?php
declare(strict_types=1);

$image = new Imagick();
$image->newImage(280, 240, 'white');
$image->setImageFormat('png');
$draw = new ImagickDraw();
$draw->setStrokeColor('#146c74');
$draw->setStrokeWidth(3);
$draw->setFillColor('none');
$draw->setFillColor('#bdebe2');
$draw->pathStart();
$rotation = 30;
$angle = deg2rad($rotation);
$dx = 2 * 70 * cos($angle);
$dy = 2 * 70 * sin($angle);
$draw->pathMoveToAbsolute(140 - $dx / 2, 120 - $dy / 2);
$draw->pathEllipticArcRelative(70, 35, $rotation, false, true, $dx, $dy);
$draw->pathEllipticArcRelative(70, 35, $rotation, false, true, -$dx, -$dy);
$draw->pathClose();
$draw->pathFinish();
$image->drawImage($draw);
$path = __DIR__ . '/tilted-sticker.png';
if (!$image->writeImage($path)) {
    throw new RuntimeException('Не удалось сохранить PNG');
}
echo 'tilted-sticker.png', "\n";
$draw->clear();
$image->clear();

Результат: tilted-sticker.png 280×240; консоль — tilted-sticker.png. Мятный полный эллипс радиусами 70/35 с центром (140,120), наклонённый на 30°. Концы диаметра примерно (79.378,85) и (200.622,155), вторая дуга идёт обратно. deg2rad переводит градусы в радианы для cos/sin; эти функции дают горизонтальную/вертикальную составляющую повёрнутого диаметра. Сам Arc по-прежнему получает поворот в градусах. Такая конструкция согласует концы с общим эллипсом, а не рисует линзу из двух произвольных коротких дуг.

Что проверить и чем заменить

При совпадении начала и конца одна A/a-команда не задаёт полный эллипс. Разделите его на две дуги с разными промежуточными концами или используйте готовую ellipse. При нулевом радиусе по SVG-модели получится прямой участок, а не аварийное обещание рисовать окружность.

Нулевые/отрицательные/слишком маленькие радиусы и совпадающие концы подробно разобраны в таблице пограничных случаев. Если нужен полный овал без смешанного контура, ellipse проще двух дуг.

Стоимость. Запись команды в Draw не равна растеризации: основная работа с пикселями будет в drawImage, затем отдельная запись PNG. Ограничивайте площадь холста, число сегментов и объём внешних данных; память зависит от каналов и внутренних буферов. Для статичного значка сохраните PNG и используйте кэш, для изменяемой схемы браузера рассмотрите SVG/canvas. Сравнивайте время полного задания, не только одного вызова path-метода.

Рядом: ImagickDraw::pathEllipticArcAbsolute, ImagickDraw::pathCurveToQuadraticBezierRelative. Устройство текущей точки: базовые пути.

Источники и обсуждения

Код и руководство с собой

Скачайте самостоятельные примеры с исходными данными, инструкциями и ожидаемыми результатами. Примеры HTTP и фрагменты для проекта помечены отдельно: им нужно указанное окружение.

Код не исполняется на сайте. Скачайте нужный пример и запускайте его в своём локальном окружении.

Материалы сверены 2026-10-12. Примеры и объяснения написаны для этого руководства; источники и обсуждения доступны в каждой главе.