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 posicionamiento laborioso en Illustrator o un software similar?
En realidad, no especifica si la imagen es algo que ha generado usted mismo en TK, tiene a mano o no. Si ya tiene este código, puede exportar el lienzo de aplicaciones TK como EPS y abrirlo en Illustrator. Todo lo que necesita 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 : Abriendo el EPS generado en illustrator.
Puede hacer esto en extendScript, SVG o directamente escribiendo el programa EPS, todos los cuales son fáciles 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 crear secuencias de comandos, 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);
}
Agregaré mi método, ya que me parece que es el más simple. Básicamente, tú:
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 ilustrador:
Sin embargo, debería 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 ejecutándolos 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 archivo my file.svg
.
Me dejé llevar y agregué algunas características "pulcras", como:
Podría omitirlos fácilmente, ya que Illustrator no oculta los objetos fuera de los límites del lienzo y le permite cambiar el tamaño del lienzo manualmente:
Puede hacer rápidamente algo similar a su ejemplo en Illustrator usando un trazo discontinuo. Para dibujar fácilmente los anillos espaciados uniformemente, usaría la herramienta Cuadrícula polar .
Luego, solo es cuestión de configurar el Trazo en los anillos para que quede discontinuo con espacios que se ajusten a su gusto:
Por supuesto, puede ajustar cada fila para agregar más puntos si es necesario, solo aumente o disminuya el valor del espacio individual. Con el cuadro de espacio activo, puede usar su rueda de desplazamiento para cambiar rápidamente el valor. Mantenga Ctrl / Cmdpresionado mientras 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, necesitará algunos ajustes. Comience con una línea de puntos (con 11 puntos para su ejemplo)
Agregue un efecto de transformación a través deEffect > Distort & Transform > Transform...
Notarás que las filas internas tienen demasiados puntos. Ahí es donde entra en juego el ajuste manual, pero esto debería llevarlo lo suficientemente lejos como para descubrir el resto.
Utilice Inkscape:
Y el resultado (usando 22.5 grados para que coincida con la imagen del OP):
supermejor
Pedro Wone