乌龟绘图自动居中

时间:2016-11-02 12:24:37

标签: python turtle-graphics

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

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

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)

这个方法确实有效,但对我来说这看起来很笨拙所以我想问一下更多的经验龟程序员有没有更好的方法找到龟图的起始位置让它们居中?

此致

2 个答案:

答案 0 :(得分:1)

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

对于你的形状(&#34;几乎&#34;圆),你可以使用几何计算起点。

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

现在我有betawidth所以我可以移动起点,形状将居中。

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

答案 1 :(得分:0)

我很佩服@ furas&#39;解释和代码,但我避免数学。为了说明在这里总是存在另一种解决问题的方法,这是一种产生相同同心多边形的无数学解决方案:

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