Python Turtle:为什么奇数大小的居中方格是不均匀/失真的?

时间:2015-10-18 14:59:10

标签: python turtle-graphics

你知道为什么下面的代码在正方形的边是奇数时会产生扭曲的正方形吗?

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

2 个答案:

答案 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)

在Mac上使用Yosemite 10.10.5上的python 3.5,它绘制了一个完美的正方形。enter image description here

您可以在每个绘图说明后打印乌龟坐标,以确定您的平台上发生了什么。