Secara terprogram menciptakan deretan titik-titik yang terpancar


17

Saya ingin membuat pola lubang speaker seperti ini: masukkan deskripsi gambar di sini

Tapi saya tidak yakin harus mulai dari mana. Apakah ini dapat dicapai tanpa pemosisian yang melelahkan di Illustrator atau perangkat lunak serupa?


Akan sepele untuk menggunakan sesuatu seperti Python untuk membuat SVG dengan titik-titik berukuran / diposisikan dengan benar, kemudian buka SVG di Illustrator, resave sebagai .ai, dan pergi dari sana.
Hebat

Sepele itu benar. Tulis kutub ke transformasi Cartesian, lalu loop bersarang, satu radius loncatan dan sudut loncatan lainnya. Dalam contoh Anda langkah sudut adalah 9 derajat atau PI / 10.
Peter Wone

Jawaban:


9

Saya akan menambahkan metode saya, karena menurut saya sepertinya itu yang paling sederhana. Pada dasarnya, Anda:

  1. Menghasilkan lingkaran secara komputasi dengan Python
  2. Jadikan mereka sebagai file SVG sederhana
  3. Buka file di Illustrator

Berikut ini skrip Python (membutuhkan svgwritedan 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())

Ini akan membuat file SVG di direktori tempatnya. Anda dapat membuka ini di browser:

masukkan deskripsi gambar di sini

Atau di Illustrator:

masukkan deskripsi gambar di sini

Anda harus menggunakan jendela Illustrator yang lebih besar daripada saya, meskipun, saya agak terlalu kecil untuk bekerja dengan nyaman ...

Jika Anda tidak dapat membuat skrip Python membuat file (mungkin menjalankan ini dalam interpreter Python online) maka cukup komentar dwg.save(). Baris terakhir mencetak isi SVG ke konsol, Anda dapat menempelkan ini ke Notepad, lalu simpan sebagai my file.svg.

Saya terbawa suasana dan menambahkan beberapa fitur "rapi", seperti:

  • Pastikan lingkaran berada di tengah dengan benar, sehingga lingkaran dengan koordinat negatif tidak terpotong saat melihat di browser Anda.
  • Ubah ukuran kanvas SVG.

Anda dapat dengan mudah meninggalkan ini, karena Illustrator tidak menyembunyikan objek di luar batas kanvas dan memungkinkan Anda untuk mengubah ukuran kanvas secara manual:

masukkan deskripsi gambar di sini


16

Anda tidak benar-benar menentukan apakah gambar tersebut adalah sesuatu yang Anda hasilkan sendiri di TK, ada di tangan atau tidak. Jika Anda sudah memiliki kode ini maka Anda dapat mengekspor kanvas aplikasi TK sebagai EPS dan membukanya di ilustrator. Yang perlu Anda lakukan hanyalah menelepon canvas.postscript().

Jika Anda ingin menggunakan TK

Contoh sederhana dalam 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()

Ini menghasilkan file bernama "patten.eps".

hasil dari pattern.eps

Gambar 1 : Membuka EPS yang dihasilkan dalam ilustrator.

Anda dapat melakukan ini dalam extendedScript, SVG atau langsung dengan menulis program EPS yang semuanya mudah dilakukan (lihat lampiran di bawah untuk beberapa contoh). Lihat posting berikut untuk sumber daya:

PS : Saya tidak tahu apakah skripnya layak karena dibutuhkan sekitar 3 menit untuk menarik mereka dengan bantuan alat putar dan Ctrl+D

Perpaduan parametrik dalam Illustrator

  1. Menggambar lingkaran.
  2. duplikat itu.
  3. berbaur lingkaran
  4. menggambar lingkaran lain yang mewakili tulang belakang, potong satu titik
  5. Pilih campuran dan lingkaran dan lakukan Obyek → Blend → Ganti tulang belakang
  6. sesuaikan jumlah bola dengan Object → Blend → Blend Options ... minus satu objek.
  7. Salin dan sesuaikan ukuran dan opsi lingkaran spne. selesai

satu dering

Gambar 2 : Satu dering dengan metode di atas


Lampiran 1: Dengan EPS yang ditulis secara manual

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

Lampiran 2: Contoh 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);
}

Terima kasih - Saya tidak punya jendela tk, itu hanya contoh dari pola yang saya temukan
Tom

1
@ Tom Itulah mengapa saya mendaftar alternatif.
joojaa

1
Hah itu luar biasa, saya membaca bahwa PostScript sudah selesai tetapi saya belum pernah melihat orang yang benar-benar kode di dalamnya.
Peter Wone

9

Jika Anda tidak peduli dengan titik-titik yang berbaris ...

Anda dapat dengan cepat membuat sesuatu yang mirip dengan contoh Anda di Illustrator menggunakan stroke putus-putus. Untuk menggambar cincin dengan jarak yang sama dengan mudah, saya akan menggunakan Polar Grid Tool .

Opsi Alat Kotak Kutub Hasil Alat Kotak Kutub

Maka itu hanya masalah mengatur Stroke pada cincin untuk putus dengan celah yang sesuai dengan keinginan Anda:

Opsi Panel Stroke memancarkan deretan titik

Anda tentu saja dapat menyempurnakan setiap baris untuk menambahkan lebih banyak titik jika diperlukan, cukup menambah atau mengurangi nilai celah individual. Dengan kotak celah aktif, Anda dapat menggunakan roda gulir Anda untuk dengan cepat mengubah nilainya. Tahan Ctrl / Cmdsambil menggulir untuk menyesuaikan kenaikan yang lebih halus

Opsi Panel Stroke memancarkan deretan titik

Masalah dengan metode ini adalah mungkin ada beberapa tumpang tindih di beberapa titik:

titik tumpang tindih

Itu mungkin perlu diedit secara manual jika Anda ingin mereka menjadi sempurna. Harus ada paling banyak 1 tumpang tindih per baris.


1
Bagus, campuran lebih baik untuk menyelaraskan tangguh
joojaa

1
Ini adalah pemanggang speaker, entah dia akan menyaringnya ke aluminium dan secara manual menelusuri setiap tanda dalam hal mana tanda yang sedikit lebar tidak masalah atau dia akan mengkonversi ke DXF dan menggunakan pabrik CNC, dalam hal ini sedikit lubang lebar tidak masalah.
Peter Wone

9

Jika Anda melakukan peduli tentang titik-titik berbaris ...

Efek distorsi dan transformasi ilustrator sangat cocok untuk pola pengulangan seperti ini, tetapi untuk mendapatkan pola yang tepat itu membutuhkan beberapa penyesuaian. Mulai dengan garis putus-putus (dengan 11 titik sebagai contoh Anda)

Panel opsi stroke Garis putus-putus

Tambahkan Efek Transform via Effect > Distort & Transform > Transform...

Mengubah opsi Efek memancarkan deretan titik

Anda akan melihat bahwa baris-baris dalam memiliki terlalu banyak titik. Di situlah tweaking manual masuk, tetapi ini akan membuat Anda cukup jauh untuk mencari tahu sisanya.


8

Gunakan Inkscape:

  1. Buat garis panduan co-centric dan klik dua kali garis untuk memutar dengan jumlah yang sama (saya menggunakan 30 derajat).
  2. Buat serangkaian lingkaran tak terisi co-sentris secara manual mengatur lebar dan tinggi, dan memindahkannya ke tengah.
  3. Buat lingkaran yang diisi, dan salin tempel beberapa kali.
  4. Gunakan alat "Baris dan Kolom" untuk menyebarkannya di sepanjang baris, dengan jarak yang sama
  5. Kelompokkan lingkaran, lalu putar. Akhirnya tempatkan mereka sehingga garis tengah sejajar dengan persimpangan panduan.
  6. Salin dan tempel lagi.

masukkan deskripsi gambar di sini

Dan hasilnya (menggunakan 22,5 derajat untuk mencocokkan gambar OP):

masukkan deskripsi gambar di sini

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.