海龟画图自动居中

问题描述 投票:0回答:2

我正在寻找自动找到新海龟绘图的起始位置的最佳方法,以便无论其大小和形状如何,它都会在图形窗口中居中。

到目前为止,我已经开发了一个函数,可以检查每个绘制元素海龟的位置,以找到左、右、上、下的极值,这样我就可以找到图片大小,并可以在发布代码之前使用它来调整起始位置。这是简单形状绘制的示例,添加了我的图片尺寸检测:

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)

这个方法确实有效,但对我来说似乎很笨拙,所以我想请教更多有经验的乌龟程序员是否有更好的方法来找到乌龟绘图的起始位置以使它们居中?

问候

python turtle-graphics python-turtle
2个回答
1
投票

没有通用的方法可以将每个形状居中(在绘制它并找到所有最大、最小点之前)。

对于您的形状(“几乎”圆形),您可以使用几何计算起点。

enter image description here

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

enter image description here


0
投票

我很欣赏@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()

enter image description here

© www.soinside.com 2019 - 2024. All rights reserved.