Python龟:为什么奇数大小的居中正方形不均匀/扭曲?

2024-04-23 10:19:27 发布

您现在位置:Python中文网/ 问答频道 /正文

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

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

上面的代码在边是平的情况下工作得很好。使用python3.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()

Tags: infromimportrightforrange解决方案fill
2条回答

很少观察到:

1) Remove 'right()' from the 5th line assures a regular square

2) Adding 'time.sleep(1)' just before 'for _ in range(4):' doesn't help in any way, so we can discard a timing problem

3) 'print heading()' after every 'rt()' prints the correct values, we can also discard problems of angulation

4) Drag the window very quickly around the screen changes the appearance of the square, this is definitely a graphical error

5) s = 66.9999999999999 returns an even square, s = 66.99999999999999 (adding 1 extra decimal) returns as the error

6) Even after compilation of the code, the square stills uneven

海龟来源: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)

如果有人有更合理的解释,就写出来吧!这个问题很有趣!你知道吗

在Mac上使用Python3.5和Yosemite 10.10.5,它绘制了一个完美的正方形

你可以打印海龟坐标后,每个绘图指令,以找出什么是发生在你的平台。你知道吗

相关问题 更多 >