Как создать векторную кривую программно?

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

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

Так можно ли создать аккуратную кривую, указав некоторые числа? Я не возражаю против того, какие приложения я должен использовать среди Affinity Designer, Pixelmator, Sketch 3 или Illustrator CC, если это можно сделать программно (связанный пост разработан Pixelmator, FYI).

Ответы (2)

Этот вопрос содержит две отдельные проблемы,

  • как делать что-то программно и
  • как моделировать точные формы.

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

Точное положение с помощью инструментов графического интерфейса

Первый способ точно позиционировать объекты — использовать сетку и привязку к сетке . Это концепция графического интерфейса, эквивалентная использованию только x цифр точности при вводе значений. Когда вы уменьшаете количество мест, где вы можете размещать точки, более вероятно, что вы сможете воспроизвести позиционирование в другом месте. Симметричное расположение рукояток приводит к симметричным результатам.

введите описание изображения здесь

Изображение 1. Привязка к сетке делает позиционирование предсказуемым.

Другой способ - нарисовать ровно половину вашей фигуры и использовать инструмент «Зеркало», чтобы создать симметричную половину. Еще один способ сделать это — использовать маленькую кривую в качестве транспортира, а затем привязываться к ее точкам. Итак, вы видите, что есть много вариантов сделать это, не утруждая себя переходом на уровень сценария.

Программное позиционирование с использованием Adobe ExtendScript

Adobe предоставляет независимую от платформы реализацию JavaScript под названием ExtendScript. Сценарий, имитирующий то, что делается вручную, будет выглядеть следующим образом:

#target illustrator

var doc = app.activeDocument;
var pathItem = doc.pathItems.add();

pts = [[0,0], [5,0], [5,5], [0,5]]

// match units of drawn document
// convert points to 2 * mm
for(var i=0; i< pts.length; i++) {
    for(var j=0; j< pts[i].length; j++) {
        pts[i][j] *= 2 * 2.83464567;
    }
}

var point1 = pathItem.pathPoints.add();
point1.anchor = pts[0];
point1.leftDirection = point1.anchor;
point1.rightDirection = pts[1];

var point2 = pathItem.pathPoints.add();
point2.anchor = pts[3];
point2.leftDirection = pts[2];
point2.rightDirection = point2.anchor;

pathItem.stroke = true;
pathItem.fill = false;

Просто вставьте это в набор инструментов extendscript для тестирования или поместите в .jsxфайл

Программное позиционирование с использованием файлов (Postscript)

Иногда вы хотите использовать произвольную программу для создания векторных рисунков. Разумный выбор выходных форматов, которые могут это сделать:

  • PS/EPS , (инкапсулированный) PostScript
  • PDF , переносимый формат документа
  • SVG , масштабируемая векторная графика
  • DXF , формат обмена чертежами
  • EMF , расширенный метафайл

Из этих форматов EPS и DXF наименее свернуты. SVG также является хорошим выбором, но он слишком многословен и по-прежнему столь же загадочен, как и слои чертежей PDF. PDF также можно сгенерировать, но если у вас нет API для рисования, это дополнительная работа (например, QT или Cairo, но это ни в коем случае не сложно, просто немного запутанно). Я использую EPS , потому что мне иногда нужно писать EPS вручную, так что мне это знакомо.

Рисование вышеуказанной формы в файле EPS будет выглядеть следующим образом:

%!PS-Adobe-3.0 EPSF-3.0
%%BoundingBox: 0 0 40 40
%%Title: Graph Drawing
%%Creator: Janne Ojala
%%CreationDate:  2013-03-23
%%EndComments

% optional stuff to get 
% same scale as my settings
    /mm {2.83464567 mul} def 
    2 mm dup scale % 1 unit = 2 mm 
    1 2 mm div setlinewidth  
    1 1 translate  % offset 
% end optional

newpath
0 0 moveto
5 0  5 5  0 5 curveto 
stroke

%%EOF

В первых разделах первая строка обязательна, как и последняя %%EOF. Основная часть рисунка сделана с помощью moveto и кривой туда, где пары чисел являются 4 контрольными точками. Просто поместите это в текстовый файл с .epsрасширением и используйте как обычно.

Результаты

Сравнивая решения, вы можете видеть, что подход javaScript довольно громоздкий по сравнению с альтернативами.

Сострадание между рисованной, javascript и кривой eps

Изображение 2: Сравнение нарисованной от руки (красный), javaScript (зеленый) и кривой EPS (черный)

Для получения дополнительных ресурсов читайте:


TL;DR

Да, можно программно сделать кривую. Однако точность этого не требует. Этот пост содержит 2 подхода к программируемому доступу и одно обсуждение того, как сделать то же самое в графическом интерфейсе.

Это возможно только тогда, когда количество сеток настолько маленькое, как на картинке, которую вы разместили, верно? Как насчет того, когда мне приходится иметь дело с тысячами сеток?
Вы можете изменить размер сетки в соответствии с вашими потребностями, также вы можете использовать линию транспортира и привязываться к точкам (в иллюстраторе CC 2014 есть сложная функция, кашляющая ошибка, которая больше не привязывается к точкам). Вы также можете численно масштабировать касательные поворота. Точки также будут привязаны к интеллектуальным направляющим и направляющим, поэтому, если у вас есть направляющая линия, она будет привязана к ней. В любом случае есть МНОГО способов быть точным, не вдаваясь в программирование. Но да ничего плохого в программировании доступа.
Хорошо, я, наконец, сделал это. Большое спасибо за отличное разъяснение.

Если я правильно понял ваш вопрос, вам подойдет коррекция дуги с помощью SH. Я не пробовал это сам, но похоже, что это сработает.