Programlı olarak yayılan nokta satırları oluşturma


17

Bunun gibi bir hoparlör deliği deseni oluşturmak istiyorum: resim açıklamasını buraya girin

Ama nereden başlayacağımdan emin değilim. Bu, Illustrator veya benzeri bir yazılımda zahmetli bir konumlandırma olmadan gerçekleştirilebilir mi?


Python gibi bir şeyi doğru konumlandırılmış / boyutlandırılmış noktalara sahip bir SVG oluşturmak, ardından SVG'yi Illustrator'da açmak, .ai olarak yeniden kaydetmek ve oradan gitmek önemsiz olacaktır.
Superbest

Önemsiz doğru. Kartezyen dönüşümüne bir kutup yazın, daha sonra iç içe döngüler, bir adım yarıçapı ve diğer adım açısı. Örneğin, açısal adım 9 derece veya PI / 10'dur.
Peter Wone

Yanıtlar:


9

Metodumu ekleyeceğim, çünkü bana en basitmiş gibi geliyor. Temel olarak:

  1. Hesaplama yoluyla Python'da daireler oluşturun
  2. Bunları basit bir SVG dosyası olarak işleyin
  3. Dosyayı Illustrator'da aç

İşte Python betiği (gerektirir svgwriteve 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())

İçinde bulunduğu dizinde bir SVG dosyası oluşturur. Bunu bir tarayıcıda açabilirsiniz:

resim açıklamasını buraya girin

Veya Illustrator'da:

resim açıklamasını buraya girin

Benden daha büyük bir Illustrator penceresi kullanmalısın, ancak benimki rahatça çalışmak için biraz fazla küçüktü ...

Python betiklerinin dosya oluşturmasını sağlayamıyorsanız (belki de bunu çevrimiçi bir Python yorumlayıcısında çalıştırıyorsanız) yorum yapın dwg.save(). Son satır SVG'nin içeriğini konsola yazdırır, bunu Not Defteri'ne yapıştırabilir ve sonra olarak kaydedebilirsiniz my file.svg.

Ben taşındı ve gibi birkaç "temiz" özellikleri ekledi:

  • Çevrelerin doğru ortalandığından emin olun, böylece negatif koordinatları olan daireler tarayıcınızda görüntülerken kırpılmaz.
  • SVG tuvalini yeniden boyutlandırın.

Illustrator, tuval sınırları dışındaki nesneleri gizlemediği ve tuvali manuel olarak yeniden boyutlandırmanıza izin verdiği için bunları kolayca bırakabilirsiniz:

resim açıklamasını buraya girin


16

Görüntünün TK'de kendiniz oluşturduğunuz, elinizde olup olmadığı bir şey olup olmadığını gerçekten belirtmezsiniz. Bu kod zaten varsa, TK uygulamaları tuvalini EPS olarak dışa aktarabilir ve illustrator'da açabilirsiniz. Tek yapmanız gereken aramak canvas.postscript().

TK kullanmak istiyorsanız

Python 2'de basit örnek:

#!/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()

Bu, adlı bir dosya ile sonuçlanır "patten.eps".

pattern.eps sonucu

Resim 1 : Oluşturulan EPS'yi illustrator uygulamasında açma.

Bunu extScript, SVG'de veya doğrudan yapılması kolay olan EPS programını yazarak yapabilirsiniz (bazı örnekler için aşağıdaki eke bakın). Kaynaklar için aşağıdaki gönderilere bakın:

Not : Döndürme aracı ve Ctrl+D

Illustrator'da parametrik karışım

  1. Bir daire çizin.
  2. çoğaltın.
  3. çevreleri karıştır
  4. omurgayı temsil eden başka bir daire çizin, bir noktada kesin
  5. Hem karışımı hem de daireyi seçin ve Nesne → Karışım → Omurgayı değiştir
  6. nesne sayısını Nesne → Karışım → Karışım Seçenekleri ... eksi bir nesne ile ayarlayın.
  7. Spne çemberlerinin boyutunu ve seçeneklerini kopyalayın ve ayarlayın. tamam

tek Yüzük

Resim 2 : Yukarıdaki yöntemle bir halka


Ek 1: Elle yazılmış EPS ile

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

Ek 2: ExtendScript örneği

#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);
}

Teşekkürler - tk pencerem yok, bulduğum desene sadece bir örnekti
Tom

1
@Tom Bu yüzden alternatifleri listeledim.
joojaa

1
Hah bu harika, PostScript'in Turing'in tamamlandığı bir yerde okudum ama daha önce hiç kimsenin kod yazdığını görmedim.
Peter Wone

9

Eğer sıralanan noktaların umrunda değilse ...

Kesikli bir kontur kullanarak Illustrator'da örneğinize benzer bir şey hızlı bir şekilde yapabilirsiniz. Eşit aralıklı halkaları kolayca çizmek için Polar Izgara Aracını kullanırdım .

Polar Izgara Aracı Seçenekleri Polar Izgara Aracı sonucu

O zaman sadece halkalardaki Kontur'u beğeninize uyan boşluklarla kesik bir şekilde ayarlamak meselesidir:

Kontur Paneli Seçenekleri yayılan nokta sıraları

Gerekirse daha fazla nokta eklemek için elbette her satıra ince ayar yapabilirsiniz, tek tek boşluk değerini artırın veya azaltın. Boşluk kutusu etkinken, değeri hızlı bir şekilde değiştirmek için kaydırma tekerleğinizi kullanabilirsiniz. Daha Ctrl / Cmdince artışlarla ayarlamak için kaydırırken basılı tutun

Kontur Paneli Seçenekleri yayılan nokta sıraları

Bu yöntemle ilgili bir sorun, bazı noktalarda çakışma olabilir:

nokta çakışması

Mükemmel olmaları gerekiyorsa, bunların manuel olarak düzenlenmesi gerekebilir. Satır başına en fazla 1 çakışma olmalıdır.


1
İyi bir, karışım sert hizalamak için daha iyi
joojaa

1
Bu bir hoparlör ızgarası, ya bir miktar alüminyum üzerine serigrafi yapacak ve her işaretten manuel olarak delecek, bu durumda biraz geniş bir işaret önemli olmayacak ya da DXF'ye dönüşecek ve bir CNC değirmeni kullanacak, bu durumda biraz geniş delik önemli değil.
Peter Wone

9

Eğer varsa yapmak noktalar sıraya umurumda ...

Illustrator'ın deforme etme ve dönüştürme efekti, bu tür yinelenen desen için mükemmeldir, ancak tam olarak bu paterni elde etmek için biraz ince ayar gerektirecektir. Noktalı bir çizgiyle başlayın (örneğin, 11 noktalı)

Kontur seçenekleri bölmesi Noktalı çizgi

Üzerinden Dönüşüm Etkisi Ekleme Effect > Distort & Transform > Transform...

Dönüştürme Efekti seçenekleri yayılan nokta sıraları

İç sıraların çok fazla noktaya sahip olduğunu fark edeceksiniz. Manuel ayarlama burada devreye giriyor, ancak bu sizi gerisini anlamaya yetecek kadar ileri götürecek.


8

Inkscape kullanın:

  1. Eş merkezli kılavuz çizgiler oluşturun ve eşit miktarda döndürmek için çizgilere çift tıklayın (30 derece kullandım).
  2. Genişliği ve yüksekliği manuel olarak ayarlayıp merkeze taşıyarak bir dizi eş merkezli doldurulmamış daire oluşturun.
  3. Doldurulmuş bir daire oluşturun ve birkaç kez kopyalayıp yapıştırın.
  4. Bunları satır boyunca eşit aralıklarla yaymak için "Satırlar ve Sütunlar" aracını kullanın
  5. Daireleri gruplandırın ve döndürün. Son olarak merkezin kılavuz kavşağı ile aynı hizada olacak şekilde yerleştirin.
  6. Kopyalayıp tekrar yapıştırın.

resim açıklamasını buraya girin

Ve sonuç (OP görüntüsüyle eşleşmek için 22.5 derece kullanarak):

resim açıklamasını buraya girin

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.