Creación programática de filas de puntos radiantes

17

Quiero crear un patrón de agujeros de altavoz como este: ingrese la descripción de la imagen aquí

Pero no estoy seguro de por dónde empezar. ¿Se puede lograr esto sin un laborioso posicionamiento en Illustrator o software similar?

Tom
fuente
Sería trivial usar algo como Python para crear un SVG con puntos correctamente posicionados / de tamaño, luego abra el SVG en Illustrator, vuelva a guardarlo como .ai, y vaya desde allí.
Excelente
Trivial tiene razón. Escriba una transformación polar a cartesiana, luego bucles anidados, un radio de paso y el otro ángulo de paso. En su ejemplo, el paso angular es de 9 grados o PI / 10.
Peter Wone

Respuestas:

9

Agregaré mi método, ya que me parece que es el más simple. Básicamente, usted:

  1. Genera computacionalmente los círculos en Python
  2. Renderizarlos como un simple archivo SVG
  3. Abrir archivo en Illustrator

Aquí está el script de Python (requiere svgwritey 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:

ingrese la descripción de la imagen aquí

O en Illustrator:

ingrese la descripción de la imagen aquí

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:

  • Asegúrese de que los círculos estén correctamente centrados, de modo que los círculos con coordenadas negativas no se recorten cuando se visualicen en su navegador.
  • Cambiar el tamaño del lienzo SVG.

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:

ingrese la descripción de la imagen aquí

Superbest
fuente
16

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().

Si quieres usar TK

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".

resultado de pattern.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

Mezcla paramétrica en Illustrator

  1. Dibuja un circulo.
  2. duplicarlo
  3. mezclar los círculos
  4. dibuja otro círculo que represente la columna vertebral, córtala en un punto
  5. Seleccione tanto mezclar como circular y hacer Objeto → Mezclar → Reemplazar columna vertebral
  6. ajustar el número de esferas con Objeto → Mezclar → Opciones de fusión ... menos un objeto.
  7. Copie y ajuste el tamaño y las opciones de los círculos spne. hecho

un anillo

Imagen 2 : un anillo con el método anterior


Apéndice 1: con EPS escrito manualmente

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

Apéndice 2: ejemplo de ExtendScript

#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);
}
joojaa
fuente
Gracias. No tengo la ventana tk, fue solo un ejemplo del patrón que encontré
Tom
1
@ Tom Es por eso que enumeré alternativas.
joojaa
1
Ja, eso es increíble, leí en alguna parte que PostScript está Turing completo pero nunca vi a nadie realmente codificarlo antes.
Peter Wone
9

Si no importan los puntos alineados ...

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 .

Opciones de la herramienta de cuadrícula polar Resultado de 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:

Opciones de panel de trazo Radiando filas de puntos

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

Opciones de panel de trazo Radiando filas de puntos

Un problema con este método es que puede haber cierta superposición en algunos de los puntos:

superposición de puntos

Es posible que deba editarlos manualmente si necesita que sean perfectos. Debe haber como máximo 1 superposición por fila.

JohnB
fuente
1
Buena, la mezcla es mejor para alinear duro
joojaa
1
Es una rejilla de altavoz, o la va a serigrafiar sobre aluminio y perforará manualmente cada marca, en cuyo caso una marca ligeramente ancha no importará o se convertirá a DXF y usará un molino CNC, en cuyo caso un poco El agujero ancho no importará.
Peter Wone
9

Si lo haces atención sobre los puntos alineando ...

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)

Panel de opciones de trazo Linea punteada

Agregar un efecto de transformación a través de Effect > Distort & Transform > Transform...

Opciones de efecto de transformación Radiando filas de puntos

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.

JohnB
fuente
8

Utiliza Inkscape:

  1. Cree líneas de guía co-céntricas y haga doble clic en las líneas para rotar en la misma cantidad (usé 30 grados).
  2. Cree una serie de círculos sin relleno co-céntricos configurando manualmente el ancho y la altura, y moviéndolos al centro.
  3. Cree un círculo relleno y copie y pegue varias veces.
  4. Use la herramienta "Filas y columnas" para extenderlas a lo largo de una fila, con espacios iguales
  5. Agrupe los círculos y luego gírelos. Finalmente colóquelos de modo que el centro se alinee con la intersección de la guía.
  6. Copia y pega de nuevo.

ingrese la descripción de la imagen aquí

Y el resultado (usando 22.5 grados para que coincida con la imagen del OP):

ingrese la descripción de la imagen aquí

nbubis
fuente