gpt4 book ai didi

蟒 turtle : why centered square for odd size is uneven/distorted?

转载 作者:行者123 更新时间:2023-11-28 18:35:11 26 4
gpt4 key购买 nike

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

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

最佳答案

一些观察:

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

turtle 来源: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 always返回 1,并且线条错位 1 个像素,如果值从 67 增加到 67.1,屏幕会正确读取它并平分空间。 (我的是 1600x900)

如果有人有更合理的解释,请写下来!这个问题很有趣!

关于蟒 turtle : why centered square for odd size is uneven/distorted?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33199445/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com