如何以编程方式创建矢量曲线?

平面设计 adobe-illustrator 插画脚本 每股收益 像素化器
2022-02-28 11:40:18

我想创建一条上下对称的矢量曲线。例如,在这个棒球图标(如何在 Pixelmator 中绘制棒球?)中,如果我尝试按照接受的答案的建议编写向量,我最终会手写向量曲线 - 这意味着曲线永远不会上下对称。

所以我想以编程的方式创建向量曲线,比如指定向量的起点和终点,然后指定向量的中点并指定曲线的度数,以创建一个整齐的曲线。我不喜欢手动创建曲线,因为无论我做什么,它看起来都非常糟糕。

那么是否可以通过指定一些数字来创建整齐的曲线?我不介意我必须在 Affinity Designer、Pixelmator、Sketch 3 或 Illustrator CC 中使用哪些应用程序,只要它可以通过编程方式完成(链接的帖子由 Pixelmator 设计,仅供参考)。

2个回答

这个问题包含两个单独的问题,

  • 如何以编程方式做事和
  • 你如何为精确的形状建模。

出于所有意图和目的,这些都是无关的。在我看来,您问第一个问题的唯一原因是因为您不知道如何在 GUI 中精确定位项目,但我可能错了。我将展示Adob​​e Illustrator,因为这就是我手头的东西。

使用 GUI 工具精确定位

精确定位事物的第一种方法是使用网格网格对齐这是一个 GUI 等效概念,在键入值时仅使用 x 位精度。当您减少可以定位点的位置时,您更有可能在其他地方复制定位。对称的手柄定位导致对称的结果。

在此处输入图像描述

图 1:对齐网格使定位可预测。

另一种方法是精确绘制一半形状并使用镜像工具生成对称的一半。另一种方法是使用一条小曲线作为量角器,然后捕捉到它的点。所以你看到有很多选项可以做到这一点,而不必费心去脚本层。

使用 Adob​​e 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;

只需将其粘贴到扩展脚本工具包中进行测试,或放入.jsx文件中

使用文件的程序化定位(后记)

有时您想使用任意程序来生成矢量图。可以做到这一点的输出格式的明智选择是:

  • PS/EPS , (封装的) PostScript
  • 可移植文件格式
  • 可缩放矢量图形
  • 图形交换格式
  • 增强型元文件

在这些格式中, EPSDXF的卷积最少。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 和 curve to 完成的,其中数字对是 4 个控制点。只需将其放在带有.eps扩展名的文本文件中即可正常使用。

结果

比较解决方案,您可以看到与替代方案相比,javaScript 方法相当繁琐。

手绘、javascript和eps曲线之间的同情

图 2:手绘(红色)、javascript(绿色)和 EPS 曲线(黑色)之间的比较

如需更多资源,请阅读:


TL;博士

是的,您可以以编程方式制作曲线。然而,精度不需要这个。这篇文章包含 2 种可编程访问的方法,以及一个关于如何在 GUI 中做同样事情的讨论。

如果我正确理解您的问题, SH 的Arc Correction将为您工作。我自己没有尝试过,但看起来它可以完成这项工作。