我正在寻找自动找到新龟图的起始位置的最佳方法,这样它就可以在图形窗口中居中,无论其大小和形状如何。
到目前为止,我已经开发了一个功能,可以检查每个绘制的元素龟位置,找到左,右,上,下的极值,这样我找到图片大小,并可以在发布之前用它来调整起始位置我的代码。这是添加了我的图片尺寸检测的简单形状绘制示例:
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)
这个方法确实有效,但对我来说这看起来很笨拙所以我想问一下更多的经验龟程序员有没有更好的方法找到龟图的起始位置让它们居中?
此致
答案 0 :(得分:1)
没有通用的方法可以将每个形状居中(在绘制之前找到所有的最大,最小点)。
对于你的形状(&#34;几乎&#34;圆),你可以使用几何计算起点。
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
。
答案 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()