適当のごった煮

Pythonと境界標とQGISを中心にいろいろと

亀の形と速さ

スポンサードリンク

亀の形と速さ

亀の形と動く速さを変えられますが、どんな形があって、どのくらいの速さで動くのか、実際に試しました。

目次

亀の形

亀の形はturtle.screen.getshapes()で取得できるので、これを利用して表示させました。

import turtle

t = turtle.Turtle()

# 画面の大きさ変更
t.screen.setup(1000, 800)

i = 1 # 横位置調整用変数
t.pu()
print(t.screen.window_width())
for pen in t.screen.getshapes():
    t.goto(-t.screen.window_width() / 2 + 120 * i, 0)
    t.shape(pen)
    t.stamp()
    t.goto(-t.screen.window_width() / 2 + 120 * i, 20)
    t.write(pen, align='center', font=('Arial', 20))
    t.goto(-t.screen.window_width() / 2 + 120 * i, 0)
    i += 1

実行すると以下のような表示になります。

f:id:tekito-gottani:20160929193546j:plain

亀の早さ

動く速さはt.speed(speed)で変更できます。引数の範囲は0から10までで、0を例外的に最高速(アニメーションなし)として、1の最低速から順に10まで速くなっていきます。文字列でspeedを指定する場合は以下のような取り決めになっています。

文字列指定数字指定
fastest 0
fast 10
normal 6
slow 3
slowest 1

上記の表に記載されていない値や、同じ長さで描く図形が異なるときに違いが出るのか実験しました。

import turtle
import time
import math

# オブジェクト作成
t = turtle.Turtle()
t.shape('turtle')

# 画面の大きさ変更
t.screen.setup(800, 600)

# 結果保存用
jisyo = {}
for i in range(11):
    jisyo[str(i)] = ''

# 描く線の長さ
length = t.screen.window_width() - 50

# 直線
for i in range(11):
    t.speed(i)
    t.pu()
    t.goto(-t.screen.window_width()/2+20, 0)
    t.pd()
    t1 = time.time()
    t.fd(length)
    t2 = time.time()
    jisyo[str(i)] += str(round(t2-t1, 5)) + ' '
    t.clear()

# 斜線
for i in range(11):
    t.speed(i)
    t.pu()
    t.goto(-t.screen.window_width()/2+20, t.screen.window_height()/2-20)
    t.seth(-45)
    t.pd()
    t1 = time.time()
    t.fd(length)
    t2 = time.time()
    jisyo[str(i)] += str(round(t2-t1, 5)) + ' '
    t.clear()
    
# 正三角形
for i in range(11):
    t.speed(i)
    t.home()
    t1 = time.time()
    for j in range(3):
        t.fd(length/3)
        t.lt(120)
    t2 = time.time()
    jisyo[str(i)] += str(round(t2-t1, 5)) + ' '
    t.clear()

# 正方形
for i in range(11):
    t.speed(i)
    t.home()
    t1 = time.time()
    for j in range(4):
        t.fd(length/4)
        t.lt(90)
    t2 = time.time()
    jisyo[str(i)] += str(round(t2-t1, 5)) + ' '
    t.clear()

# 円
for i in range(11):
    t.speed(i)
    t.home()
    t1 = time.time()
    t.circle(length/(2*math.pi))
    t2 = time.time()
    jisyo[str(i)] += str(round(t2-t1, 5)) + ' '
    t.clear()

結果

下表のとおり、速さ0を例外としてspeedが増加するにつれてかかった時間が減っていきます。直線と斜線ではほとんど違いがみられません

方向転換が必要な図形の場合は、その分描画に時間がかかり、直線の距離と比較して方向転換の回数がある一定の値を超えると、高速範囲の最後の数段階はあまり速さに変化は見られないという結果になりました。

この他、もう少し移動距離を長くとって、speed設定ごとのピクセル/秒を計測してみたりすると面白いかもしれません。結果については実行環境による部分もあると思いますので、暇つぶしに亀を動かして遊んでみてはいかかでしょうか。

亀の速さと図を描くのにかかった時間(長さ750ピクセル
速さ\形直線斜線正三角形正方形
0 0.03125 0.01563 0.09376 0.12498 0.03125
1 3.5785 3.5785 5.54748 5.57872 5.40682
2 1.62517 1.62517 2.67216 2.68782 3.45349
3 0.98448 1.0001 1.7033 1.76581 2.96906
4 0.67192 0.67191 1.26576 1.25013 2.48464
5 0.50005 0.50005 0.98448 1.00011 2.00021
6 0.37504 0.37504 0.75008 0.81259 2.01584
7 0.2969 0.29691 0.65632 0.68757 2.00021
8 0.2344 0.23443 0.56257 0.56259 2.00021
9 0.18752 0.18752 0.4688 0.50005 2.01584
10 0.15627 0.15627 0.4688 0.50005 2.00021