以编程方式创建辐射状的点行


17

我想创建一个扬声器孔图案,如下所示: 在此处输入图片说明

但是我不确定从哪里开始。无需在Illustrator或类似软件中进行繁琐的定位,就可以实现吗?


使用Python之类的东西来创建具有正确位置/大小的点的SVG,然后在Illustrator中打开SVG,重新保存为.ai,然后从那里开始,将是微不足道的。
极好的2015年

琐碎是正确的。写一个极坐标到笛卡尔变换,然后嵌套循环,一个步进半径,另一个步进角。在您的示例中,角度步长为9度或PI / 10。
彼得·沃恩

Answers:


9

我将添加我的方法,因为在我看来这是最简单的方法。基本上,您:

  1. 用Python计算生成圆
  2. 将它们渲染为简单的SVG文件
  3. 在Illustrator中打开文件

这是Python脚本(需要svgwritemath):

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

它将在其所在的目录中创建一个SVG文件。您可以在浏览器中打开它:

在此处输入图片说明

或在Illustrator中:

在此处输入图片说明

您应该使用比我更大的Illustrator窗口,但是,我的体积太小,无法舒适地使用...

如果您无法让Python脚本创建文件(也许可以在在线Python解释器中运行文件),则只需注释掉即可dwg.save()。最后一行将SVG的内容打印到控制台,您可以将其粘贴到记事本中,然后另存为my file.svg

我不知所措,添加了一些“简洁”功能,例如:

  • 确保圆圈正确居中,以便在浏览器中查看时不会修剪具有负坐标的圆圈。
  • 调整SVG画布的大小。

您可以轻松地将它们排除在外,因为Illustrator不会将对象隐藏在画布边界之外,并且允许您手动调整画布的大小:

在此处输入图片说明


16

您实际上并没有指定图像是否是您自己在TK中生成的,是否可以使用的。如果您已经有了此代码,则可以将TK应用程序画布导出为EPS并在illustrator中打开它。您所需要做的就是打电话canvas.postscript()

如果您想使用传统知识

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

这将产生一个名为的文件"patten.eps"

pattern.eps的结果

图片1:在Illustrator中打开生成的EPS。

您可以在extendScript,SVG中或直接通过编写EPS程序来轻松完成所有这些操作(有关示例,请参见下面的附录)。有关资源,请参见以下帖子:

PS:我不知道它是否值得编写脚本,因为大约需要3分钟才能借助旋转工具和Ctrl+D

Illustrator中的参数混合

  1. 画一个圆。
  2. 复制它。
  3. 混合圈子
  4. 再画一个代表脊柱的圆,切成一个点
  5. 选择混合和圆并执行对象→混合→替换脊椎
  6. 使用对象→混合→混合选项...减去一个对象来调整球的数量。
  7. 复制和调整Spne圆的大小和选项。做完了

一环

图片2:使用上述方法的一枚戒指


附录1:带有手动书写的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

附录2: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);
}

谢谢-我没有tk窗口,这只是我找到的模式的一个示例
Tom

1
@Tom那就是为什么我列出了替代品。
joojaa 2015年

1
太棒了,我在某处读到PostScript已完成Turing,但我从未见过有人在其中编写过代码。
彼得·沃尼

9

如果你关心点排队...

您可以使用虚线笔触快速制作与Illustrator中的示例类似的内容。为了轻松绘制均匀间隔的环,我将使用Polar Grid Tool

Polar Grid工具选项 Polar Grid工具结果

然后,只需将指环上的笔触设置为虚线即可,并根据自己的喜好缝隙:

笔划面板选项 散落的点行

当然,您可以根据需要微调每一行以添加更多点,只需增加或减少单个间隙值即可。启用间隙框后,您可以使用滚轮快速更改该值。Ctrl / Cmd滚动时按住可进行微调

笔划面板选项 散落的点行

这种方法的一个问题是某些点可能重叠:

点重叠

如果您需要完美的话,可能需要手动编辑。每行最多应有1个重叠。


1
好人,融合更适合艰难的
挑战

1
这是一个扬声器格栅,要么将其丝网印刷到一些铝上,然后手动钻出每个标记,在这种情况下,稍宽的标记将无关紧要,或者他将转换为DXF并使用CNC磨机,在这种情况下,宽孔没关系。
彼得·沃恩

9

如果您确实关心排列的点...

Illustrator的变形和变换效果非常适合这种重复模式,但是为了获得准确的模式,需要进行一些调整。从虚线开始(示例中包含11个点)

描边选项窗格 虚线

通过添加变换效果 Effect > Distort & Transform > Transform...

变换效果选项 散落的点行

您会注意到内部行的点太多。这就是手动调整的地方,但这应该使您足够了解其他内容。


8

使用Inkscape:

  1. 创建同心基准线,然后双击这些线以相等的角度旋转(我使用了30度)。
  2. 手动设置宽度和高度,然后将其移动到中心,以创建一系列同心的未填充圆。
  3. 创建一个实心圆,然后复制粘贴几次。
  4. 使用“行和列”工具将它们沿行分布,间距相等
  5. 对圆进行分组,然后旋转它们。最后放置它们,使中心与引导交叉点对齐。
  6. 再次复制并粘贴。

在此处输入图片说明

结果(使用22.5度匹配OP的图像):

在此处输入图片说明

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.