为了测量杆的旋转速度,我需要制作一个带有大量交替的深色/透明线圈的表盘。旋转刻度盘会中断光电传感器上的光,然后我只需要测量光脉冲的频率。绘制此表盘时,Python龟图形似乎是一个好主意。
我需要非常大地绘制这个图像,以避免在段的边缘上产生阶梯效应 - 我需要光滑的边缘。但是如果我使用大于屏幕的x或y来执行turtle.setup(x,y),则会截断画布以适合屏幕。如何避免?
我的代码包含在最后。请参见此处带截断画布的屏幕截图,其中x = y = 1420
编辑:只是为了说清楚 - 最后的getscreen()/ getcanvas()捕获这个截断的画布图像,并按原样(截断)保存到EPS文件中。这就是困扰我的事情。我需要在高分辨率图像文件中捕获整个圆圈。
我在Ubuntu 13.04上使用python-2.7.4
这是代码:
#!/usr/bin/python
# set this to 1 to troubleshoot
debug = 0
import turtle
import math
# image file with the result
fname="dial.eps"
# number of lines
n = 100
# external radius
r2 = 700
# length of each line
l = round(r2 / 10)
r1 = r2 - l
# pen thickness
# tuned for 50% fill factor at the inner end of each line
# (dark stripe and transparent stripe have equal width there)
thick = 2 * math.pi * r1 / float(2 * n)
print "thickness =", thick
# setup screen size to contain the whole circle, plus a little extra
border = 20 + thick
turtle.setup(2 * r2 + border, 2 * r2 + border)
dot = turtle.Turtle()
dot.speed(0)
dot.hideturtle()
# draw crosshairs in the center
dot.setpos(l, 0)
dot.setpos(-l, 0)
dot.home()
dot.setpos(0, l)
dot.setpos(0, -l)
dot.penup()
# thickness of lines
dot.pensize(thick)
for step in range(0, n):
a = 360.0 * step / float(n)
arad = math.radians(a)
x1 = r1 * math.cos(arad)
y1 = r1 * math.sin(arad)
x2 = r2 * math.cos(arad)
y2 = r2 * math.sin(arad)
if debug == 1:
print "a =", a, "\t x1 =", x1, "\t y1 =", y1, "\t x2 =", x2, "\t y2 =", y2
dot.penup()
dot.setpos(x1, y1)
dot.pendown()
dot.setpos(x2, y2)
ts = turtle.getscreen()
ts.getcanvas().postscript(file=fname)
print "Saved image to: ", fname
print "All done. Click image to exit."
turtle.exitonclick()
答案 0 :(得分:1)
getcanvas().postscript
保存的EPS文件与分辨率无关;您可以以任何尺寸打印它,它仍将以打印机的原始分辨率显示。我修改了您的代码以读取屏幕尺寸并相应地更改圆半径:
#!/usr/bin/python
# set this to 1 to troubleshoot
debug = 0
import turtle
import math
ts = turtle.getscreen()
max_size = 0
if ts.window_width > ts.window_height:
max_size = ts.window_height()
else:
max_size = ts.window_width()
# image file with the result
fname = 'dial.eps'
# number of lines
n = 100
# external radius
# r2 = 700
r2 = 0.8 * max_size / 2
# length of each line - changed from 'l', which looks too much like 1
line_length = round(r2 / 10)
r1 = r2 - line_length
# pen thickness
# tuned for 50% fill factor at the inner end of each line
# (dark stripe and transparent stripe have equal width there)
thick = 2 * math.pi * r1 / float(2 * n)
print 'thickness =', thick
# setup screen size to contain the whole circle, plus a little extra
border = 20 + thick
# turtle.setup(2 * r2 + border, 2 * r2 + border)
dot = turtle.Turtle()
dot.speed(0)
dot.hideturtle()
# draw crosshairs in the center
dot.setpos(line_length, 0)
dot.setpos(-line_length, 0)
dot.home()
dot.setpos(0, line_length)
dot.setpos(0, -line_length)
dot.penup()
# thickness of lines
dot.pensize(thick)
for step in range(0, n):
a = 360.0 * step / float(n)
arad = math.radians(a)
x1 = r1 * math.cos(arad)
y1 = r1 * math.sin(arad)
x2 = r2 * math.cos(arad)
y2 = r2 * math.sin(arad)
if debug == 1:
print 'a =', a, '\t x1 =', x1, '\t y1 =', y1, '\t x2 =', x2, \
'\t y2 =', y2
dot.penup()
dot.setpos(x1, y1)
dot.pendown()
dot.setpos(x2, y2)
ts.getcanvas().postscript(file=fname)
print 'Saved image to: ', fname
print 'All done. Click image to exit.'
turtle.exitonclick()
以500%的速度放大,没有锯齿:
哦,请不要将l
用作变量名;它看起来太像1
了。 Bad 程序员,没有饼干......☺