Création par programmation de rangées de points rayonnants

17

Je veux créer un motif de trous d'enceinte comme celui-ci: entrez la description de l'image ici

Mais je ne sais pas par où commencer. Est-ce possible sans un positionnement laborieux dans Illustrator ou un logiciel similaire?

À M
la source
Il serait trivial d'utiliser quelque chose comme Python pour créer un SVG avec des points correctement positionnés / dimensionnés, puis ouvrez le SVG dans Illustrator, réenregistrez-le en .ai et continuez à partir de là.
Superbe
Trivial a raison. Écrivez une transformation polaire en cartésienne, puis des boucles imbriquées, un rayon de pas et l'autre angle de pas. Dans votre exemple, le pas angulaire est de 9 degrés ou PI / 10.
Peter Wone

Réponses:

9

J'ajouterai ma méthode, car il me semble que c'est la plus simple. Fondamentalement, vous:

  1. Générer par calcul les cercles en Python
  2. Rendez-les comme un simple fichier SVG
  3. Ouvrir un fichier dans Illustrator

Voici le script Python (nécessite svgwriteet 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())

Il créera un fichier SVG dans le répertoire où il se trouve. Vous pouvez l'ouvrir dans un navigateur:

entrez la description de l'image ici

Ou dans Illustrator:

entrez la description de l'image ici

Vous devriez utiliser une fenêtre Illustrator plus grande que moi, cependant, la mienne était un peu trop petite pour travailler confortablement ...

Si vous ne pouvez pas demander aux scripts Python de créer des fichiers (peut-être en les exécutant dans un interpréteur Python en ligne), commentez simplement dwg.save(). La dernière ligne imprime le contenu du SVG sur la console, vous pouvez le coller dans le Bloc-notes, puis l'enregistrer sous my file.svg.

Je me suis laissé emporter et j'ai ajouté quelques fonctionnalités "soignées", comme:

  • Assurez-vous que les cercles sont correctement centrés, afin que les cercles avec des coordonnées négatives ne soient pas coupés lors de l'affichage dans votre navigateur.
  • Redimensionnez le canevas SVG.

Vous pouvez facilement les ignorer, car Illustrator ne masque pas les objets en dehors des limites du canevas et vous permet de redimensionner le canevas manuellement:

entrez la description de l'image ici

Superbest
la source
16

Vous ne spécifiez pas réellement si l'image est quelque chose que vous avez vous-même générée en savoirs traditionnels, que vous avez sous la main ou non. Si vous disposez déjà de ce code, vous pouvez exporter le canevas des applications TK au format EPS et l'ouvrir dans illustrator. Il vous suffit d'appeler canvas.postscript().

Si vous souhaitez utiliser TK

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

Il en résulte un fichier nommé "patten.eps".

résultat de pattern.eps

Image 1 : Ouverture de l'EPS généré dans l'illustrateur.

Vous pouvez le faire en extendScript, SVG ou directement en écrivant le programme EPS qui sont tous faciles à faire (voir l'annexe ci-dessous pour quelques exemples). Voir les articles suivants pour les ressources:

PS : Je ne sais pas si cela vaut la peine d'être scripté car il faut environ 3 minutes pour les dessiner à l'aide de l'outil de rotation et Ctrl+D

Mélange paramétrique dans Illustrator

  1. Tracez un cercle.
  2. dupliquez-le.
  3. mélanger les cercles
  4. dessinez un autre cercle qui représente la colonne vertébrale, coupez-le en un point
  5. Sélectionnez à la fois le mélange et le cercle et faites Objet → Fusionner → Remplacer la colonne vertébrale
  6. ajustez le nombre de sphères avec Objet → Mélange → Options de fusion ... moins un objet.
  7. Copiez et ajustez la taille et les options des cercles spne. terminé

un anneau

Image 2 : un anneau avec la méthode ci-dessus


Annexe 1: Avec EPS écrit manuellement

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

Annexe 2: exemple 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
la source
Merci - je n'ai pas la fenêtre tk, c'était juste un exemple du motif que j'ai trouvé
Tom
1
@ Tom C'est pourquoi j'ai énuméré des alternatives.
joojaa
1
Hah, c'est génial, j'ai lu quelque part que PostScript est Turing complet mais je n'ai jamais vu personne y coder auparavant.
Peter Wone
9

Si vous ne vous souciez pas des points qui s'alignent ...

Vous pouvez rapidement créer quelque chose de similaire à votre exemple dans Illustrator à l'aide d'un trait en pointillés. Pour dessiner facilement les anneaux régulièrement espacés, j'utiliserais l' outil Polar Grid .

Options de l'outil Polar Grid Résultat de l'outil Polar Grid

Ensuite, il suffit de régler le trait sur les anneaux en pointillés avec des écarts qui correspondent à votre goût:

Options du panneau de traits rayonnant des rangées de points

Vous pouvez bien sûr affiner chaque ligne pour ajouter plus de points si nécessaire, il suffit d'augmenter ou de diminuer la valeur de l'écart individuel. Avec la case d'espace active, vous pouvez utiliser votre molette de défilement pour modifier rapidement la valeur. Maintenez enfoncé Ctrl / Cmdpendant le défilement pour régler par incréments plus fins

Options du panneau de traits rayonnant des rangées de points

Un problème avec cette méthode est qu'il peut y avoir un chevauchement dans certains points:

chevauchement de points

Ceux-ci pourraient avoir besoin d'être modifiés manuellement si vous en avez besoin pour être parfait. Il doit y avoir au plus 1 chevauchement par ligne.

JohnB
la source
1
Bon, le mélange est meilleur pour aligner dur
joojaa
1
C'est une grille de haut-parleur, soit il va la sérigraphier sur de l'aluminium et percer manuellement chaque marque, auquel cas une marque légèrement large n'aura pas d'importance ou il va se convertir en DXF et utiliser une fraiseuse CNC, auquel cas une légère un trou large n'aura pas d'importance.
Peter Wone
9

Si vous vous souciez des points qui s'alignent ...

L'effet de distorsion et de transformation d'Illustrator est parfait pour ce type de motif répétitif, mais pour obtenir ce motif exact, il faudra quelques ajustements. Commencez par une ligne pointillée (avec 11 points pour votre exemple)

Volet des options de trait Ligne pointillée

Ajouter un effet de transformation via Effect > Distort & Transform > Transform...

Options d'effet de transformation rayonnant des rangées de points

Vous remarquerez que les rangées intérieures ont trop de points. C'est là que le réglage manuel entre en jeu, mais cela devrait vous permettre de comprendre le reste.

JohnB
la source
8

Utilisez Inkscape:

  1. Créez des lignes de guidage co-centriques et double-cliquez sur les lignes pour les faire pivoter de manière égale (j'ai utilisé 30 degrés).
  2. Créez une série de cercles non remplis co-centriques en définissant manuellement la largeur et la hauteur et en les déplaçant vers le centre.
  3. Créez un cercle rempli et copiez-collez un certain nombre de fois.
  4. Utilisez l'outil "Lignes et colonnes" pour les étaler le long d'une ligne, avec un espacement égal
  5. Regroupez les cercles, puis faites-les pivoter. Enfin, placez-les de sorte que le centre soit aligné avec l'intersection du guide.
  6. Copiez et collez à nouveau.

entrez la description de l'image ici

Et le résultat (en utilisant 22,5 degrés pour correspondre à l'image de l'OP):

entrez la description de l'image ici

nbubis
la source