Quiero crear un patrón de agujeros de altavoz como este:
Pero no estoy seguro de por dónde empezar. ¿Se puede lograr esto sin un laborioso posicionamiento en Illustrator o software similar?
Quiero crear un patrón de agujeros de altavoz como este:
Pero no estoy seguro de por dónde empezar. ¿Se puede lograr esto sin un laborioso posicionamiento en Illustrator o software similar?
Respuestas:
Agregaré mi método, ya que me parece que es el más simple. Básicamente, usted:
Aquí está el script de Python (requiere svgwrite
y math
):
"""
This script has two purposes:
- Simple demonstration of using Python (specifically the svgwrite library) to create an SVG file
- Answer the question http://graphicdesign.stackexchange.com/q/56200/21332
"""
# n[x] should give the number of circles at a distance of (x+1)*d from the center
d = 30
n = [8, 16, 20, 20, 20]
r = 7 # radius of each circle
# Calculate the center points of each circle
circles = [(0, 0)] # There is always one circle in the middle
import math
for i in range(0, len(n)):
m = n[i] # m is the number of circle in this "row", i is the number of the row
for j in range(0, m): # for each circle...
phi = 2*math.pi*j/m # Calculate the angle at which the circle will be
# Convert polar coordinates to cartesian
x = d*(i+1)*math.cos(phi)
y = d*(i+1)*math.sin(phi)
circles.append((x, y))
# Write circles to SVG
import svgwrite
# Determine correct size of drawing
width = max([c[0] for c in circles])*2.2
height = max([c[1] for c in circles])*2.2
dwg = svgwrite.Drawing('demo.svg', size = (width, height)) # output will be in the same folder as this script
# offsets for shifting all circles so that the SVG can be easily viewed in browser
x_offset = min([c[0] for c in circles])*1.1
y_offset = min([c[1] for c in circles])*1.1
for c in circles:
adjusted_x = c[0] - x_offset
adjusted_y = c[1] - y_offset
dwg.add(svgwrite.shapes.Circle((adjusted_x, adjusted_y), r))
# Save the file
dwg.save()
# Print SVG source to console
print(dwg.tostring())
Creará un archivo SVG en el directorio en el que se encuentra. Puede abrirlo en un navegador:
O en Illustrator:
Sin embargo, deberías usar una ventana de Illustrator más grande que la mía, la mía era demasiado pequeña para trabajar cómodamente ...
Si no puede hacer que los scripts de Python creen archivos (tal vez ejecutando esto en un intérprete de Python en línea), simplemente comente dwg.save()
. La última línea imprime el contenido del SVG en la consola, puede pegarlo en el Bloc de notas y luego guardarlo como my file.svg
.
Me dejé llevar y agregué algunas características "ordenadas", como:
Puede omitirlos fácilmente, ya que Illustrator no oculta objetos fuera de los límites del lienzo y le permite cambiar el tamaño del lienzo manualmente:
En realidad, no especifica si la imagen es o no algo que ha generado usted mismo en TK, tenga o no a mano. Si ya tiene este código, puede exportar el lienzo de aplicaciones TK como EPS y abrirlo en Illustrator. Todo lo que necesitas hacer es llamar canvas.postscript()
.
Muestra simple en python 2:
#!/usr/bin/python
# -*- coding: utf-8 -*-
from Tkinter import *
import math
def circle(c, x, y, r=10):
return c.create_oval(x-r, y-r, x+r, y+r, width=0, fill="black")
def draw_circles(c, num, r):
step = (2.0*math.pi)/float(num)
for i in range(num):
x = 400 + r * math.sin(i*step)
y = 400 + r * math.cos(i*step)
circle(c, x, y)
main_window = Tk()
main_window.title('Pattern to EPS')
canvas = Canvas(main_window,
width=800, height=800,
bg = 'white')
circle(canvas, 400, 400)
for i in range(1, 6):
draw_circles(canvas, i*8, i*60)
canvas.pack()
# next line generates a eps file
canvas.postscript(file = "pattern.eps", width=800, height=800 )
# uncomment next line if you want to see the tk window
# main_window.mainloop()
Esto da como resultado un archivo llamado "patten.eps"
.
Imagen 1 : Apertura del EPS generado en Illustrator.
Puede hacer esto en extendScript, SVG o directamente escribiendo el programa EPS, todo lo cual es fácil de hacer (consulte el apéndice a continuación para ver algunos ejemplos). Consulte las siguientes publicaciones para obtener recursos:
PD : No sé si vale la pena hacer scripts, ya que lleva unos 3 minutos dibujarlos con la ayuda de la herramienta de rotación y Ctrl+D
Imagen 2 : un anillo con el método anterior
%!PS-Adobe-3.0 EPSF-3.0
%%BoundingBox: 0 0 800 800
%%Title: pattern
%%Creator: joojaa
%%CreationDate: 2015-07-08
%%EndComments
/c {newpath 10 0 360 arc closepath fill} def
/cr {
dup 8 mul 2 dict begin /i exch def /r exch 60 mul def
1 1 i {360 i div mul dup sin exch cos r mul exch r mul c} for
end
} def
400 400 translate
0 0 c
1 1 6 {cr} for
%%EOF
#target illustrator
var doc = app.activeDocument;
function circle(x,y) {
doc.pathItems.ellipse(x+5,y-5,10,10);
}
function draw_circles(num, r){
var step = (2.0*Math.PI)/num;
for (var i = 0; i < num; i++) {
var x = -200 + r * Math.sin(i*step);
var y = 200 + r * Math.cos(i*step);
circle(x, y);
}
}
circle(-200,200);
for (var i = 1; i <= 6; i++) {
draw_circles(i*8, i*30);
}
Puede crear rápidamente algo similar a su ejemplo en Illustrator con un trazo discontinuo. Para dibujar fácilmente los anillos espaciados uniformemente, usaría la herramienta de cuadrícula polar .
Entonces es solo una cuestión de configurar el Stroke en los anillos con rayas que se ajusten a su gusto:
Por supuesto, puede ajustar cada fila para agregar más puntos si es necesario, solo aumentar o disminuir el valor de espacio individual. Con el cuadro de separación activo, puede usar su rueda de desplazamiento para cambiar rápidamente el valor. Sostenga Ctrl / Cmdmientras se desplaza para ajustar en incrementos más finos
Un problema con este método es que puede haber cierta superposición en algunos de los puntos:
Es posible que deba editarlos manualmente si necesita que sean perfectos. Debe haber como máximo 1 superposición por fila.
El efecto de distorsión y transformación de Illustrator es perfecto para este tipo de patrón repetitivo, pero para obtener ese patrón exacto requerirá algunos ajustes. Comience con una línea punteada (con 11 puntos para su ejemplo)
Agregar un efecto de transformación a través de Effect > Distort & Transform > Transform...
Notarás que las filas internas tienen demasiados puntos. Ahí es donde entra el ajuste manual, pero esto debería llevarte lo suficientemente lejos como para resolver el resto.
Utiliza Inkscape:
Y el resultado (usando 22.5 grados para que coincida con la imagen del OP):