Python Turtle:为什么奇数大小的居中正方形不均匀/扭曲?
你们知道为什么当正方形的边是奇数时,下面的代码会产生扭曲的正方形吗Python Turtle:为什么奇数大小的居中正方形不均匀/扭曲?,python,turtle-graphics,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() 我得了这样的病 上述代码在边为偶数时工作良好。使用了Python 3.5.0。我在linux、windows na
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()
我得了这样的病
上述代码在边为偶数时工作良好。使用了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) 从第5行中删除“right()”,以确保规则的正方形
2) 在范围(4)中的“for”之前加上“time.sleep(1)”,没有任何帮助,因此我们可以忽略计时问题
3) “print heading()”在每个“rt()”打印出正确的值之后,我们还可以放弃角度问题
4) 在屏幕周围快速拖动窗口会改变正方形的外观,这肯定是图形错误
5) s=66.9999999999
返回一个偶数平方,s=66.9999999999999
(添加一个额外的小数点)作为错误返回
6) 即使在编译代码之后,正方形仍然不均匀
海龟资料来源:
我更改了您的代码,因此它绘制了一个简单的角度:
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,如果值从67增加到67.1,那么线会偏离1个像素。屏幕会正确读取并平均分割空间。(我的是1600x900)
如果有人有更合理的解释,就写出来!这个问题很有趣 在Mac上使用python 3.5和Yosemite 10.10.5,它绘制了一个完美的正方形
您可以在每次绘图指示后打印海龟坐标,以了解平台上发生了什么你只是想画一个正方形吗?我想画一个正方形,龟在画前和画后都在中间。Hmmm.…对于一个正方形来说,它是有效的。但当我连续画几张时,这种方法还是会产生不好的结果。将最后一行更改为以下内容:
pu();fd(-s/2.0);rt(-90.0);fd(-s/2.0);fd(s);pd()
并为范围(3)中的添加:
在第一次定位前(+缩进)谢谢!我刚刚发现,将1e-10
添加到s
可以解决问题。很好,编辑您的问题,让有相同问题的人知道如何解决它!完成。但是如果你有其他的和一般的解决方案,请让我知道。添加1e-10是一个肮脏的黑客行为。好的,我会检查,保持警惕