Programowo tworzą promieniujące rzędy kropek

17

Chcę utworzyć wzór otworów głośników w ten sposób: wprowadź opis zdjęcia tutaj

Ale nie jestem pewien, od czego zacząć. Czy można to osiągnąć bez pracochłonnego pozycjonowania w programie Illustrator lub podobnym oprogramowaniu?

Tomek
źródło
Byłoby trywialne użycie czegoś takiego jak Python, aby utworzyć plik SVG z poprawnie rozmieszczonymi / wielkościowymi kropkami, a następnie otworzyć plik SVG w programie Illustrator, ponownie zapisać jako .ai i przejść od tego miejsca.
Superbest,
Trivial ma rację. Napisz biegunową do transformacji kartezjańskiej, a następnie zagnieżdżone pętle, jeden promień krokowy i drugi kąt krokowy. W twoim przykładzie krok kątowy wynosi 9 stopni lub PI / 10.
Peter Wone

Odpowiedzi:

9

Dodam moją metodę, ponieważ wydaje mi się, że jest najprostsza. Zasadniczo:

  1. Wygeneruj komputerowo kręgi w języku Python
  2. Renderuj je jako prosty plik SVG
  3. Otwórz plik w programie Illustrator

Oto skrypt w języku Python (wymaga svgwritei 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())

Stworzy plik SVG w katalogu, w którym się znajduje. Możesz to otworzyć w przeglądarce:

wprowadź opis zdjęcia tutaj

Lub w programie Illustrator:

wprowadź opis zdjęcia tutaj

Powinieneś jednak użyć większego okna programu Illustrator niż moje, moje było jednak trochę za małe, aby wygodnie z nim pracować ...

Jeśli nie możesz mieć skryptów Pythona tworzących pliki (być może uruchamiających to w internetowym tłumaczu Pythona), po prostu skomentuj dwg.save(). Ostatni wiersz wypisuje zawartość SVG na konsolę, możesz wkleić to do Notatnika, a następnie zapisać jako my file.svg.

Dałem się ponieść emocjom i dodałem kilka „schludnych” funkcji, takich jak:

  • Upewnij się, że okręgi są odpowiednio wyśrodkowane, aby kręgi o ujemnych współrzędnych nie zostały przycięte podczas przeglądania w przeglądarce.
  • Zmień rozmiar płótna SVG.

Możesz z łatwością je pominąć, ponieważ Illustrator nie ukrywa obiektów poza granicami obszaru roboczego i pozwala ręcznie zmienić rozmiar obszaru roboczego:

wprowadź opis zdjęcia tutaj

Superbest
źródło
16

W rzeczywistości nie określasz, czy obraz jest czymś, co sam wygenerowałeś w TK, masz pod ręką, czy nie. Jeśli masz już ten kod, możesz wyeksportować płótno aplikacji TK jako EPS i otworzyć je w programie Illustrator. Wszystko, co musisz zrobić, to zadzwonić canvas.postscript().

Jeśli chcesz użyć TK

Prosta próbka w 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()

Powoduje to utworzenie pliku o nazwie "patten.eps".

wynik pattern.eps

Zdjęcie 1 : Otwarcie wygenerowanego EPS w programie Illustrator.

Możesz to zrobić w rozszerzonym języku JavaScript, SVG lub bezpośrednio, pisząc program EPS, z których wszystkie są łatwe do wykonania (niektóre przykłady znajdują się w załączniku poniżej). Zobacz następujące posty dotyczące zasobów:

PS : Nie wiem, czy warto pisać skrypty, ponieważ ich przyciągnięcie zajmuje około 3 minut za pomocą narzędzia obracania i Ctrl+D

Mieszanka parametryczna w programie Illustrator

  1. Narysuj okrąg.
  2. zduplikuj to.
  3. mieszaj koła
  4. narysuj kolejny okrąg, który reprezentuje kręgosłup, wytnij go w jednym punkcie
  5. Wybierz zarówno mieszanie, jak i okrąg i wykonaj Obiekt → Mieszaj → Zamień kręgosłup
  6. dostosuj liczbę kulek za pomocą Obiekt → Mieszanka → Opcje mieszania ... minus jeden obiekt.
  7. Skopiuj i dostosuj rozmiar kręgosłupa i opcje. gotowy

jeden pierścień

Zdjęcie 2 : Jeden pierścień z powyższą metodą


Załącznik 1: Z ręcznie napisanym EPS

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

Dodatek 2: Przykład 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
źródło
Dzięki - nie mam okna tk, to był tylko przykład wzorca, który znalazłem
Tom
1
@ Tom Oto dlaczego wymieniłem alternatywy.
joojaa,
1
Hah, to wspaniale. Czytałem gdzieś, że PostScript jest kompletny Turinga, ale nigdy wcześniej nie widziałem, żeby ktokolwiek w nim kodował.
Peter Wone,
9

Jeśli nie zależy ci na ustawieniu kropek ...

Możesz szybko zrobić coś podobnego do przykładu w programie Illustrator, używając kreski przerywanej. Aby łatwo narysować równomiernie rozmieszczone pierścienie, użyłbym narzędzia Polar Grid Tool .

Opcje narzędzia Polar Grid Wynik narzędzia Polar Grid

Następnie wystarczy ustawić obrys na pierścieniach, tak aby był przerywany szczelinami, które pasują do twoich upodobań:

Opcje panelu obrysu promieniujące rzędy kropek

Możesz oczywiście dostroić każdy wiersz, aby dodać więcej kropek, jeśli to konieczne, po prostu zwiększ lub zmniejsz wartość pojedynczej przerwy. Przy aktywnym polu odstępu możesz użyć kółka przewijania, aby szybko zmienić wartość. Przytrzymaj Ctrl / Cmdpodczas przewijania, aby dostosować w dokładniejszych krokach

Opcje panelu obrysu promieniujące rzędy kropek

Problem z tą metodą polega na tym, że niektóre kropki mogą się nakładać:

kropka zachodzi na siebie

Mogą one wymagać ręcznej edycji, jeśli potrzebujesz, aby były idealne. Powinno być co najwyżej 1 zakładka na rząd.

JohnB
źródło
1
Dobra, mieszanka jest lepsza do wyrównania trudnych
joojaa
1
To kratka głośnika, albo przesiewa ją sitodrukiem na aluminium i ręcznie przewierci każdy znak, w którym to przypadku nieco szeroki znak nie będzie miał znaczenia, albo przejdzie na DXF i użyje frezarki CNC, w którym to przypadku lekko szeroka dziura nie będzie miała znaczenia.
Peter Wone
9

Jeśli zrobić dbają o punkty w kolejce ...

Efekt zniekształcania i przekształcania programu Illustrator jest idealny dla tego rodzaju powtarzającego się wzoru, ale aby uzyskać ten dokładny wzór, trzeba będzie go trochę ulepszyć. Zacznij od linii kropkowanej (w twoim przykładzie 11 kropek)

Panel opcji obrysu Linia przerywana

Dodaj efekt przekształcenia za pomocą Effect > Distort & Transform > Transform...

Opcje efektów transformacji promieniujące rzędy kropek

Zauważysz, że wewnętrzne rzędy mają zbyt wiele kropek. W tym momencie pojawia się ręczne poprawianie, ale powinno to doprowadzić Cię na tyle daleko, aby dowiedzieć się o reszcie.

JohnB
źródło
8

Użyj Inkscape:

  1. Utwórz współśrodkowe linie prowadzące i kliknij dwukrotnie linie, aby obrócić o jednakową wartość (użyłem 30 stopni).
  2. Utwórz serię współśrodkowych niewypełnionych kół, ręcznie ustawiając szerokość i wysokość oraz przenosząc je na środek.
  3. Utwórz wypełniony okrąg i skopiuj wklej kilka razy.
  4. Użyj narzędzia „Rzędy i kolumny”, aby rozłożyć je wzdłuż rzędu z równymi odstępami
  5. Zgrupuj koła, a następnie obróć je. Na koniec umieść je w taki sposób, aby środek był w jednej linii ze skrzyżowaniem prowadnicy.
  6. Skopiuj i wklej ponownie.

wprowadź opis zdjęcia tutaj

Rezultat (użycie 22,5 stopni w celu dopasowania do obrazu OP):

wprowadź opis zdjęcia tutaj

nbubis
źródło