你知道为什么下面的代码在正方形的边是奇数时会产生扭曲的正方形吗?
from turtle import *
s = 67.0
pu();fd(s/2.0);rt(90.0);fd(s/2.0);pd()
for _ in range(4):
rt(90.0)
fd(s)
pu();fd(-s/2.0);rt(-90.0);fd(-s/2.0);pd()
done()
我有result
当代码均匀时,上面的代码效果很好。使用Python 3.5.0。我在linux,windows native和cygwin下也有同样的效果。
部分解决方案(编辑):我发现了,当我向s
添加非常小的数字时,一切运行良好...... s = 67.0 + 1e-10
。但不知道为什么?
1e-10
解决方案有效。
from turtle import *
from math import sqrt
from random import *
plg = 53 - 1e-10 # side size, even - works well, odd - not
sk = sqrt(2) / 2.0
speed(0)
def square(q):
s = q / 2.0
penup()
forward(s)
right(90)
forward(s)
pendown()
begin_fill()
for i in range(4):
right(90)
forward(q)
end_fill()
penup()
forward(-s)
right(-90)
forward(-s)
pendown()
def triangle(q,rot):
begin_fill()
right(45 + rot)
forward(q * sk)
right(-135)
forward(q)
right(-90)
forward(q)
right(-135)
forward(q * sk)
end_fill()
setheading(0)
pu(); forward(-plg*10/2); left(90); forward(plg*10/2);right(90); pd()
for y in range(10):
p = pos()
for x in range(10):
i = randint(0,1)
if i==0:
triangle(plg,randrange(0,360,90))
else:
square(plg)
pu(); forward(plg); pd()
pu();setpos(p);right(90);forward(plg);left(90);pd()
done()
答案 0 :(得分:1)
很少有观察结果:
1)删除'右()'从第5行确保正方形
2)添加' time.sleep(1)'就在_范围(4)中的_之前:'没有任何帮助,所以我们可以抛弃计时问题
3)' print heading()'在每个' rt()'之后打印正确的值,我们也可以丢弃角度问题
4)在屏幕周围快速拖动窗口改变方形的外观,这绝对是图形错误5)
s = 66.9999999999999
返回偶数平方,s = 66.99999999999999
(加1额外小数)返回错误6)即使在编译代码之后,方块仍然不均匀
海龟来源:http://svn.python.org/projects/python/branches/pep-0384/Lib/turtle.py
我更改了您的代码,因此它绘制了一个简单的角度:
pu();fd(s/2);rt(90.0);pd()
for x in range(2):
rt(90.0)
fd(s)
done()
这与您的问题相同,但如果我将fd(s/2)
更改为fd(s)
,一切都会好转,为什么?
它只是一个猜测(不要把它当作绝对真理,我只是好奇并试图弄明白)但我认为这取决于你的屏幕分辨率,odd_number%2
始终返回1,并且线条未对齐1个像素。如果值从67增加到67.1,则屏幕正确读取并将空格分开。 (我的是1600x900)
如果有人有更合理的解释,请写下来!这个问题很有意思!
答案 1 :(得分:0)