¿Cómo crear una curva vectorial programáticamente?

Quiero crear una curva vectorial que sea simétrica en la parte superior e inferior. Por ejemplo, en este ícono de béisbol ( ¿Cómo dibujar una pelota de béisbol en Pixelmator? ), si trato de escribir el vector como sugiere la respuesta aceptada, termino escribiendo la curva del vector a mano, lo que significa que la curva nunca puede ser simétrica entre la parte superior y la inferior.

Entonces, quiero crear la curva vectorial mediante programación, como especificar el punto inicial y final del vector y luego especificar el punto medio del vector y también especificar el grado de la curva, para crear una curva ordenada. No me gusta crear la curva a mano, ya que no importaba lo que hiciera, se veía bastante horrible.

Entonces, ¿es posible crear la curva ordenada especificando algunos números? No me importa qué aplicaciones tengo que usar entre Affinity Designer, Pixelmator, Sketch 3 o Illustrator CC, siempre que se pueda hacer mediante programación (la publicación vinculada está diseñada por Pixelmator, FYI).

Respuestas (2)

Esta pregunta contiene dos cuestiones separadas,

  • cómo hacer las cosas programáticamente y
  • ¿Cómo se modelan formas precisas?

Para todos los efectos, estos no están relacionados. Me parece que la única razón por la que hace la primera pregunta es porque no sabe cómo colocar con precisión los elementos dentro de la GUI, pero puedo estar equivocado. Estaré demostrando Adobe Illustrator porque eso es lo que tengo a mano.

Posición precisa con herramientas GUI

La primera forma de posicionar las cosas con precisión es usar una cuadrícula y un complemento de cuadrícula . Este es un concepto de GUI equivalente al uso de solo x dígitos de precisión al escribir valores. Cuando reduce dónde puede colocar puntos, es más probable que pueda replicar el posicionamiento en otro lugar. El posicionamiento simétrico del mango conduce a resultados simétricos.

ingrese la descripción de la imagen aquí

Imagen 1 : Ajustar a la cuadrícula hace que el posicionamiento sea predecible.

Otra forma sería dibujar exactamente la mitad de su forma y usar la herramienta de espejo para producir la mitad simétrica. Otra forma más de hacer esto es usar una pequeña curva como transportador y luego ajustar a sus puntos. Como puede ver, hay muchas opciones para hacer esto sin molestarse en ir a la capa de script.

Posicionamiento programático con Adobe ExtendScript

Adobe proporciona una implementación de javaScript independiente de la plataforma llamada ExtendScript. Una secuencia de comandos para imitar lo que se hizo a mano se vería de la siguiente manera:

#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;

Simplemente pegue esto en el kit de herramientas extendscript para probarlo o colóquelo en un .jsxarchivo

Posicionamiento Programático Usando Archivos (Postscript)

A veces desea utilizar un programa arbitrario para generar dibujos vectoriales. Las opciones sanas para los formatos de salida que pueden hacer esto son:

  • PS/EPS , PostScript (encapsulado)
  • PDF , formato de documento portátil
  • SVG , gráficos vectoriales escalables
  • DXF , formato de intercambio de dibujo
  • EMF , metarchivo mejorado

De estos formatos, EPS y DXF son los menos convolucionados. SVG también es una buena opción, pero un poco demasiado detallado, y sigue siendo tan críptico como las capas de dibujo de PDF. También es posible generar PDF, pero a menos que tenga una API de dibujo, es un trabajo adicional (como QT o Cairo, pero de ninguna manera es difícil, solo un poco complicado). Uso EPS porque a veces necesito escribir EPS a mano, así que me resulta familiar.

Dibujar la forma anterior en un archivo EPS se vería de la siguiente manera:

%!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

Donde los primeros tramos de primera línea son obligatorios al igual que los últimos %%EOF. La carne del dibujo se hace con moveto y curve to donde los pares de números son los 4 puntos de control. Simplemente coloque esto en un archivo de texto con una .epsextensión y utilícelo normalmente.

Resultados

Al comparar soluciones, puede ver que el enfoque de javaScript es bastante engorroso en comparación con las alternativas.

Compasión entre la curva dibujada a mano, javascript y eps

Imagen 2: Comparación entre la curva dibujada a mano (en rojo), javaScript (en verde) y EPS (negra)

Para más recursos lea:


TL;RD

Sí, puede hacer una curva programáticamente. Sin embargo, la precisión no requiere esto. Esta publicación contiene 2 enfoques para el acceso programable y una discusión sobre cómo hacer lo mismo en la GUI.

Solo es posible cuando el número de cuadrículas es tan, tan pequeño, como la imagen que publicaste, ¿verdad? ¿Qué pasa cuando tengo que lidiar con miles de cuadrículas?
Puede cambiar el tamaño de la cuadrícula para que se adapte a sus necesidades, también puede usar una línea transportadora y ajustar a los puntos (aunque hay una característica, chinche, en Illustrator CC 2014 que ya no se ajusta a los puntos). También puede escalar numéricamente y rotar tangentes. Los puntos también se ajustarán a guías inteligentes y guías, por lo que si tiene una línea de guía, se ajustará a ella. En cualquier caso, hay MUCHAS formas de ser exacto sin tener que programar. Pero sí, no hay nada malo con el acceso a la programación.
Bien, finalmente lo logré. Muchas gracias por la gran aclaración.

Si entiendo su pregunta correctamente, Arc Correction by SH funcionará para usted. No lo he probado yo mismo, pero parece que haría el trabajo.