Cree una nueva capa extendiendo la longitud del arco existente

¿Existe una forma sencilla de mantener la forma del arco existente mientras cambia su longitud? En otras palabras, me gustaría que los extremos del arco se extendieran más manteniendo la misma forma (si eso tiene algún sentido). Tengo alrededor de 100 de estos arcos para modificar.

Aquí hay un enlace a uno ya que los archivos SVG no se pueden adjuntar.

Una solución automática estaría bien, pero preferiría no tener que manipular manualmente los controladores para afectar el cambio. Los archivos se almacenan en una carpeta en Dropbox.

Bienvenido a Diseño Gráfico SE. Edite su pregunta para incluir un bosquejo rápido de lo que quiere hacer. Además, especifique si necesita una solución automática y, en caso afirmativo, cómo se almacenan sus 100 arcos.
¿Qué programa(s) estás usando?
Estoy usando Adobe Illustrator CC 2017.
He mirado su expediente y no estoy seguro de que sea posible. Puede cambiar el tamaño de la forma (con o sin el vínculo entre ancho y alto), pero cambia la forma. Necesitas saber algo sobre la función matemática para poder continuar con la forma. Como, por ejemplo, una línea recta es fácil de extender porque la función es muy básica, pero si tiene un segmento de un círculo, sería más fácil dibujar un nuevo círculo que recrear la parte faltante del círculo. Illustrator no sería capaz de adivinar que había sido un círculo en su vida pasada.
Creo que lo mejor sería empezar de nuevo; es decir, comience con un arco más grande y luego córtelo a la altura/longitud de cuerda deseada. No estoy seguro de cómo hacerlo, pero Google ha sido un buen amigo. :-) ¡Gracias por tu ayuda!
Sí, es posible, extender una curva Bezier no es ciencia espacial. Si puede aceptar una respuesta de secuencia de comandos, entonces tengo una secuencia de comandos que puede hacer esto por usted.
@joojaa, ¡definitivamente miraría el guión!

Respuestas (3)

No estoy seguro de que sea posible una solución automatizada, pero el complemento VectorScribe de Astute Graphics tiene una herramienta "Extender ruta" que puede hacer esto manualmente. Tiene un par de modos diferentes para calcular la ruta que se extiende y es tan fácil como arrastrar la ruta que desea extender.

Puedes ver algunos ejemplos (y cómo usar los atajos de teclado) aquí:

El complemento cuesta £ 69 (o lo que sea en su moneda local), pero también tiene una prueba gratuita de 14 días que puede ser suficiente para que haga lo que necesita.

Un bezier es solo un polinomio. Puede cambiar fácilmente el polinomio a una longitud diferente. Sí, podemos escribir esto, sucede que escribí esto como un guión hace 1 semana.
Bueno, eso suena terriblemente como una buena respuesta a la pregunta aquí...
seguro, pero no tengo el código conmigo en el trabajo. ¿También probablemente necesite una GUI?
Una GUI ayuda, pero un script sin GUI es mejor que ningún script
Gracias por tu sugerencia. Eso también funcionaría. Entre la tuya y la respuesta de @jooja, ¿supongo que el guión sería más rápido?
@Cai Publicado. Pero como dije todavía trabajo en progreso

Un segmento de Bézier de un camino es un polinomio. El hecho de que solo usemos la curva para un parámetro de rango [0-1] no significa que la función no exista fuera de este rango, existe. Dado que esta nueva curva también es una curva de Bézier, se puede describir con precisión con una curva de Bézier diferente.

ingrese la descripción de la imagen aquí

Imagen 1 : Dos curvas de Bézier que se han prolongado 0,1 t en ambas direcciones.

He usado la siguiente secuencia de comandos, una versión extremadamente beta:

#target illustrator

// extendSelectedSegment.jsx v0.0
//
// Copyright (c) 2017 Janne Ojala
// License: MIT see https://opensource.org/licenses/MIT

var Bezier = function(p1, p2, p3, p4) {
  if (p2 === undefined){
      this.paramsFromPath(p1);
  } else {
      this.p1 = p1;
      this.p2 = p2;
      this.p3 = p3;
      this.p4 = p4;
  }
};

Bezier.prototype.posAtParam = function(t){
   var p = [undefined, undefined];
   for (var i = 0; i < 2; i++){
   p[i] =   this.p1[i] * Math.pow(1 - t,3) 
          + this.p2[i] * 3 * t * Math.pow(1 - t,2) 
          + this.p3[i] * 3 * Math.pow(t,2) * (1 - t)
          + this.p4[i] * Math.pow(t,3);
   }
   return p;
}


Bezier.prototype.derivateAtParam = function(t){
   var d = [undefined, undefined];
   for (var i = 0; i < 2; i++){
   d[i] = - 3 * this.p1[i] * Math.pow(1 - t,2) 
          + 3 * this.p2[i] * Math.pow(1 - t,2) 
          - 6 * this.p2[i] * (1 - t) * t 
          + 6 * this.p3[i] * (1 - t) * t 
          - 3 * this.p3[i] * Math.pow(t,2) 
          + 3 * this.p4[i] * Math.pow(t,2);
   }
   return d;
}

Bezier.prototype.extendToParam = function(t, t2){
    // Extend only to one direction at time.
    if (t2 === undefined){
        t2 = t;
        t = 0;
    }
    var p4n = this.posAtParam(t2);
    var p3n = this.derivateAtParam(t2);
    for (var i = 0; i < 2; i++){
        p3n[i] = p4n[i] - ((t2-t)*p3n[i])/3; 
    }
    var p1n = this.posAtParam(t);
    var p2n = this.derivateAtParam(t);
    for (var i = 0; i < 2; i++){
        p2n[i] = p1n[i] + ((t2-t)*p2n[i])/3; 
    }
    return new Bezier(p1n, p2n, p3n, p4n);
}

Bezier.prototype.makePath = function(){
    pth = app.activeDocument.pathItems.add();
    var point1 = pth.pathPoints.add();
    point1.anchor = this.p1;
    point1.leftDirection = this.p1;
    point1.rightDirection = this.p2;

    var point2 = pth.pathPoints.add();
    point2.anchor = this.p4;
    point2.leftDirection = this.p3;
    point2.rightDirection = this.p4;
}

Bezier.prototype.paramsFromPath = function(pth){
    var point1 = pth.pathPoints[0];
    this.p1 = point1.anchor;
    this.p2 = point1.rightDirection;

    var point2 = pth.pathPoints[1];
    this.p3 = point2.leftDirection;
    this.p4 = point2.anchor;
}

var sel = app.activeDocument.selection;
var bez = new Bezier(sel[0]);
bez = bez.extendToParam(0, 1.1);
bez = bez.extendToParam(-0.1, 1.0);
bez.makePath();

Ahora tenga en cuenta que esto funciona para una sola ruta seleccionada y no tiene comprobaciones. Este script se publica tal cual y debe manejarse con cuidado. Pero por lo demás, eres libre de hacer lo que quieras con él, siempre y cuando mantengas la atribución/licencia de mis partes del código.

Nota : estoy extendiendo la función Bézier, esto no siempre produce una extensión muy "natural" ya que usa la función subyacente y que PUEDE activarse si está cerca de una situación que generaría una cúspide.

Hmm, funciona bien en un extremo y da un giro en U en el otro i.stack.imgur.com/2UREg.png
@Cai, ¡así es como se comporta Bezier en ciertos casos si el otro extremo no tiene una tangente o es muy corto!
@Cai, no tienes que creer en mi palabra, puedes ver pomax.github.io/bezierinfo/#extended pero sí, mi código tiene algunos problemas de estabilidad en ciertos casos de esquina, por eso la versión es 0,0
@joojaa, eres genial!!! ¡Eso funcionó a las mil maravillas! Muchas gracias.

Si solo desea cambiar el ancho del arco sin afectar la altura, asegúrese de que el vínculo entre el ancho y la altura no esté marcado.

cambiar ancho gif ejemplo

Si desea cambiar varios arcos al mismo tiempo, puede seleccionar los arcos e ir a Objeto -> Transformar -> Escala. Cambie la escala a No uniforme e ingrese un porcentaje mayor.

Me gustaría que los extremos del arco se extendieran más manteniendo la misma forma.

No hay forma de extender el arco y mantener la misma forma porque eso distorsionará la curva del arco.