¿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.
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 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.
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.
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.
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.
Wrzlprmft
lobo
quint rahaman
lobo
quint rahaman
joojaa
quint rahaman