2016-11-02 11 views
0

私は新しいタートルの描画の開始位置を自動的に見つけるための最良の方法を探しています。そのサイズと形状にかかわらずグラフィックウィンドウの中央に配置されます。タートルの描画自動センタリング

これまでは、描いた各要素のカメの位置を左、右、上、下の極端な値で確認する機能を開発しました。その方法で画像のサイズを見つけ出し、開始位置を調節してコード。これは私の写真のサイズ検出が追加で描画単純な形状の例である:

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

使用ジオメトリが開始位置を見つけること。 – furas

答えて

1

(あなたがそれを引くと、すべてのMAX、MINポイントを見つける前に)すべての形状を中央に普遍的な方法はありません。

形状(「ほぼ円」)では、ジオメトリを使用して開始点を計算できます。今

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はので、私は私が中心になります開始点と図形を移動することができます今、私はbetawidthを持って

width = (length/2)/math.cos(math.radians(alpha)) 

が必要cos()radiansを使用しているため。

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

私は赤い画像を残しました。

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

関連する問題