我正在寻找自动找到新海龟绘图的起始位置的最佳方法,以便无论其大小和形状如何,它都会在图形窗口中居中。
到目前为止,我已经开发了一个函数,可以检查每个绘制元素海龟的位置,以找到左、右、上、下的极值,这样我就可以找到图片大小,并可以在发布代码之前使用它来调整起始位置。这是简单形状绘制的示例,添加了我的图片尺寸检测:
from turtle import *
Lt=0
Rt=0
Top=0
Bottom=0
def chkPosition():
global Lt
global Rt
global Top
global Bottom
pos = position()
if(Lt>pos[0]):
Lt = pos[0]
if(Rt<pos[0]):
Rt= pos[0]
if(Top<pos[1]):
Top = pos[1]
if(Bottom>pos[1]):
Bottom = pos[1]
def drawShape(len,angles):
for i in range(angles):
chkPosition()
forward(len)
left(360/angles)
drawShape(80,12)
print(Lt,Rt,Top,Bottom)
print(Rt-Lt,Top-Bottom)
这个方法确实有效,但对我来说似乎很笨拙,所以我想请教更多有经验的乌龟程序员是否有更好的方法来找到乌龟绘图的起始位置以使它们居中?
问候
没有通用的方法可以将每个形状居中(在绘制它并找到所有最大、最小点之前)。
对于您的形状(“几乎”圆形),您可以使用几何计算起点。
alpha + alpha + 360/repeat = 180
所以
alpha = (180 - 360/repeat)/2
但我需要
180-alpha
向右移动(然后向左移动)
beta = 180 - aplha = 180 - (180 - 360/repeat)/2
现在
width
cos(alpha) = (lengt/2) / width
所以
width = (lengt/2) / cos(alpha)
因为Python在
radians
中使用cos()
所以我需要
width = (length/2) / math.cos(math.radians(alpha))
现在我有
beta
和 width
所以我可以移动起点并且形状将居中。
from turtle import *
import math
# --- functions ---
def draw_shape(length, repeat):
angle = 360/repeat
# move start point
alpha = (180-angle)/2
beta = 180 - alpha
width = (length/2) / math.cos(math.radians(alpha))
#color('red')
penup()
right(beta)
forward(width)
left(beta)
pendown()
#color('black')
# draw "almost" circle
for i in range(repeat):
forward(length)
left(angle)
# --- main ---
draw_shape(80, 12)
penup()
goto(0,0)
pendown()
draw_shape(50, 36)
penup()
goto(0,0)
pendown()
draw_shape(70, 5)
penup()
goto(0,0)
pendown()
exitonclick()
我在图像上留下了红色
width
。
我很欣赏@furas的解释和代码,但我避免数学。为了说明总是有另一种方法来解决问题,这里有一个无需数学的解决方案,可以生成相同的同心多边形:
from turtle import Turtle, Screen
def draw_shape(turtle, radius, sides):
# move start point
turtle.penup()
turtle.sety(-radius)
turtle.pendown()
# draw "almost" circle
turtle.circle(radius, steps=sides)
turtle = Turtle()
shapes = [(155, 12), (275, 36), (50, 5)]
for shape in shapes:
draw_shape(turtle, *shape)
turtle.penup()
turtle.home()
turtle.pendown()
screen = Screen()
screen.exitonclick()