Criando programaticamente linhas radiantes de pontos

17

Eu quero criar um padrão de orador como este: insira a descrição da imagem aqui

Mas não sei por onde começar. Isso pode ser conseguido sem posicionamento trabalhoso no Illustrator ou em software semelhante?

Tom
fonte
Seria trivial usar algo como Python para criar um SVG com pontos corretamente posicionados / dimensionados, abrir o SVG no Illustrator, salvar novamente como .ai e seguir a partir daí.
Superbest
Trivial está certo. Escreva uma transformação polar para cartesiana e, em seguida, loops aninhados, um raio de passo e o outro ângulo de passo. No seu exemplo, o passo angular é 9 graus ou PI / 10.
Peter Wone

Respostas:

9

Vou adicionar meu método, pois me parece que é o mais simples. Basicamente, você:

  1. Gerar computacionalmente os círculos em Python
  2. Renderize-os como um arquivo SVG simples
  3. Abrir arquivo no Illustrator

Aqui está o script Python (requer svgwritee 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())

Ele criará um arquivo SVG no diretório em que está. Você pode abrir isso em um navegador:

insira a descrição da imagem aqui

Ou no Illustrator:

insira a descrição da imagem aqui

Você deve usar uma janela maior do Illustrator do que eu, mas a minha era um pouco pequena demais para trabalhar confortavelmente ...

Se você não pode fazer com que os scripts Python criem arquivos (talvez executando isso em um interpretador Python on-line), basta comentar dwg.save(). A última linha imprime o conteúdo do SVG no console; você pode colá-lo no bloco de notas e salvar como my file.svg.

Eu me empolguei e adicionei alguns recursos "legais", como:

  • Verifique se os círculos estão centralizados corretamente, para que os círculos com coordenadas negativas não sejam cortados ao serem visualizados no navegador.
  • Redimensione a tela SVG.

Você pode excluí-los facilmente, pois o Illustrator não oculta objetos fora dos limites da tela e permite redimensionar a tela manualmente:

insira a descrição da imagem aqui

Superbest
fonte
16

Na verdade, você não especifica se a imagem é ou não algo que você gerou no TK, tem à mão ou não. Se você já possui esse código, pode exportar a tela dos aplicativos TK como EPS e abri-la no ilustrador. Tudo o que você precisa fazer é ligar canvas.postscript().

Se você deseja usar o TK

Amostra simples em 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()

Isso resulta em um arquivo chamado "patten.eps".

resultado de pattern.eps

Imagem 1 : Abrindo o EPS gerado no ilustrador.

Você pode fazer isso em extendedScript, SVG ou diretamente escrevendo o programa EPS, que é fácil de executar (consulte o apêndice abaixo para ver alguns exemplos). Veja as seguintes postagens para obter recursos:

PS : Não sei se vale a pena criar scripts, pois leva cerca de 3 minutos para atraí-los com a ajuda da ferramenta de rotação e Ctrl+D

Mistura paramétrica no Illustrator

  1. Desenhar um círculo.
  2. duplicá-lo.
  3. misture os círculos
  4. desenhe outro círculo que represente a coluna, corte-o em um ponto
  5. Selecione mesclar e circular e faça Objeto → Misturar → Substituir lombada
  6. ajuste o número de esferas com Objeto → Mistura → Opções de mesclagem ... menos um objeto.
  7. Copie e ajuste o tamanho e as opções dos círculos spne. feito

Um anel

Imagem 2 : Um anel com o método acima


Apêndice 1: Com 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: Exemplo do 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
fonte
Graças - Eu não tenho a janela de tk, foi apenas um exemplo do padrão que eu encontrei
Tom
1
@ Tom É por isso que listei alternativas.
joojaa
1
Ah, isso é incrível, eu li em algum lugar que o PostScript é Turing completo, mas eu nunca vi alguém realmente codificar isso antes.
Peter Wone
9

Se você não se importa com os pontos alinhados ...

Você pode criar rapidamente algo semelhante ao seu exemplo no Illustrator usando um traço tracejado. Para desenhar os anéis espaçados uniformemente com facilidade, eu usaria a ferramenta Polar Grid .

Opções da ferramenta Polar Grid Resultado da Ferramenta de Grade Polar

Então é só uma questão de definir o traço nos anéis para marcar com lacunas que se encaixam no seu gosto:

Opções do painel de traços irradiando linhas de pontos

É claro que você pode ajustar cada linha para adicionar mais pontos, se necessário, apenas aumentar ou diminuir o valor do intervalo individual. Com a caixa de espaço ativa, você pode usar sua roda de rolagem para alterar rapidamente o valor. Mantenha Ctrl / Cmdpressionado enquanto rola para ajustar em incrementos mais finos

Opções do painel de traços irradiando linhas de pontos

Um problema com esse método é que pode haver sobreposição em alguns dos pontos:

sobreposição de pontos

Esses podem precisar ser editados manualmente se você precisar deles para serem perfeitos. Deve haver no máximo 1 sobreposição por linha.

JohnB
fonte
1
Um bom, mistura é melhor para alinhar difícil
joojaa
1
É uma grade de alto-falante, ou ele vai serigrafá-lo sobre um pouco de alumínio e perfurar manualmente cada marca, caso em que uma marca um pouco larga não importará ou ele irá converter para DXF e usar uma usina CNC, caso em que um pouco buraco largo não importa.
Peter Wone
9

Se você fazer o cuidado sobre os pontos alinhando ...

O efeito de distorção e transformação do Illustrator é perfeito para esse tipo de padrão de repetição, mas para obter esse padrão exato, será necessário algum ajuste. Comece com uma linha pontilhada (com 11 pontos no seu exemplo)

Painel de opções de traços Linha pontilhada

Adicionar um efeito de transformação via Effect > Distort & Transform > Transform...

Opções de efeito de transformação irradiando linhas de pontos

Você notará que as linhas internas têm muitos pontos. É aí que entra o ajuste manual, mas isso deve levá-lo longe o suficiente para descobrir o resto.

JohnB
fonte
8

Use o Inkscape:

  1. Crie linhas de guia co-centradas e clique duas vezes nas linhas para girar em igual quantidade (usei 30 graus).
  2. Crie uma série de círculos não preenchidos co-centrados, configurando manualmente a largura e a altura e movendo-os para o centro.
  3. Crie um círculo preenchido e copie e cole várias vezes.
  4. Use a ferramenta "Linhas e colunas" para espalhá-las ao longo de uma linha, com espaçamento igual
  5. Agrupe os círculos e gire-os. Finalmente, coloque-os de forma que o centro fique alinhado com a interseção da guia.
  6. Copie e cole novamente.

insira a descrição da imagem aqui

E o resultado (usando 22,5 graus para corresponder à imagem do OP):

insira a descrição da imagem aqui

nbubis
fonte