turtle.seth()
turtle.seth()
は、Pythonのタートルグラフィックスにおいて、カメ(タートル)の向きを絶対的な角度で設定するための関数です。
より正確には、turtle.setheading()
の短縮形(エイリアス)です。
どういうことか?
タートルグラフィックスでは、画面上に「カメ」と呼ばれる描画オブジェクトがあり、このカメを動かすことで線や図形を描いていきます。カメには常に「向き」があります。
left()
やright()
:カメが現在の向きから相対的に回転します。forward()
やbackward()
:カメが現在向いている方向に進みます。
これに対して、seth()
(またはsetheading()
)は、カメの向きを「絶対的な角度」で指定します。つまり、現在のカメの向きがどうであっても、指定した角度に強制的に変更します。
角度の基準
通常、turtle
モジュールにおける角度の基準は以下のようになります(Standardモードの場合):
- 270度: 南(下方向)
- 180度: 西(左方向)
- 90度: 北(上方向)
- 0度: 東(右方向)
これは、時計回りが負の角度、反時計回りが正の角度として扱われる一般的な数学的な角度の考え方と一致します。
使用例
import turtle
# タートルオブジェクトを作成
t = turtle.Turtle()
# タートルを東(0度)に向ける
t.seth(0)
t.forward(100) # 東に100進む
# タートルを北(90度)に向ける
t.seth(90)
t.forward(100) # 北に100進む
# タートルを南西(225度)に向ける
t.seth(225)
t.forward(100) # 南西に100進む
turtle.done() # 描画ウィンドウを閉じないようにする
left(角度)
/right(角度)
: カメの現在の向きから、「指定した角度分だけ」左/右に回転させます。相対的な変更です。seth(角度)
: カメの向きを「その角度」に直接設定します。現在の向きは関係ありません。
NameError: name 'turtle' is not defined または AttributeError: 'module' object has no attribute 'seth'
原因
turtle
という名前の別のファイル(例えば、自分で作成したturtle.py
など)が同じディレクトリに存在し、それが標準のturtle
モジュールよりも優先して読み込まれてしまっている可能性があります。turtle
モジュールが正しくインポートされていないか、あるいはインポートの方法が間違っている可能性があります。
トラブルシューティング
- ファイル名の競合
実行しているスクリプトと同じディレクトリ内にturtle.py
という名前のファイルがないか確認してください。もしあれば、ファイル名を変更するか、別のディレクトリに移動してください。Pythonは現在のディレクトリからモジュールを検索するため、標準ライブラリよりもローカルファイルが優先されます。 - インポートの確認
コードの先頭にimport turtle
またはfrom turtle import *
があることを確認してください。import turtle
の場合:turtle.seth(90)
のようにturtle.
プレフィックスを付ける必要があります。from turtle import *
の場合:seth(90)
のように直接関数名を使用できます。
タートルが動かない、または意図しない方向に動く
原因
turtle.tracer(0)
を使用していて、turtle.update()
を呼び出していない。- 描画スピードが非常に遅い、または速すぎるために描画がすぐに完了してしまっている。
seth()
を呼び出した後に、カメが動くコマンド(forward()
など)が実行されていない。seth()
に渡す角度が間違っている。
トラブルシューティング
- tracer() と update()
高速描画のためにturtle.tracer(0)
を使用している場合、変更が画面に反映されません。描画処理の最後にturtle.update()
を呼び出す必要があります。アニメーションを無効にする場合は、tracer(0)
とupdate()
のペアで使うのが一般的です。 - スピードの設定
t.speed(スピード)
で描画スピードを調整できます。- 0: アニメーションなしで瞬時に描画が完了します。
- 1 ( slowest ) から 10 ( fastest ) まで設定できます。
- 描画速度が遅すぎると、動きが確認しづらい場合があります。
- 移動コマンドの確認
seth()
は向きを変えるだけで、実際にカメを動かすわけではありません。t.forward(100)
のような移動コマンドがその後にあることを確認してください。 - 角度の確認
turtle
の標準モードでは、- 0度: 東(右)
- 90度: 北(上)
- 180度: 西(左)
- 270度: 南(下) となります。この基準で意図した角度になっているか確認してください。
import turtle
t = turtle.Turtle()
turtle.tracer(0) # アニメーションをオフにする
t.seth(45)
t.forward(100)
# 他の描画コマンド...
turtle.update() # 変更を画面に反映させる
turtle.done()
ウィンドウがすぐに閉じてしまう
原因
- スクリプトが終了すると同時に、タートルグラフィックスのウィンドウも閉じてしまいます。
トラブルシューティング
- コードの最後に
turtle.done()
またはturtle.mainloop()
を追加してください。これにより、ウィンドウが手動で閉じられるまで開いたままになります。
import turtle
t = turtle.Turtle()
t.seth(90)
t.forward(50)
turtle.done() # または turtle.mainloop()
TypeError: seth() missing 1 required positional argument: 'to_angle'
原因
seth()
関数に引数(角度)が渡されていない場合に発生します。
トラブルシューティング
t.seth(90)
のように、必ず角度の値を引数として渡してください。角度は整数または浮動小数点数で指定します。
ValueError: bad argument: -1 など(不正な引数)
原因
seth()
に渡す引数の値が、関数が期待する形式ではない場合に発生します。例えば、文字列を渡してしまったり、無効な値を与えたりした場合など。
トラブルシューティング
seth()
には数値(整数または浮動小数点数)の角度を渡すようにしてください。例えば、t.seth("90")
のように文字列で渡してしまうとエラーになります。
原因
- 複数のタートルオブジェクトを扱っている際に、どのタートルの
seth()
を呼び出しているのかが曖昧になることがあります。
- 各タートルオブジェクトを明確な変数に代入し、それぞれの変数を通してメソッドを呼び出すようにしてください。
import turtle
t1 = turtle.Turtle()
t2 = turtle.Turtle()
t1.color("red")
t2.color("blue")
t1.seth(0) # t1の向きを東に
t1.forward(50)
t2.seth(90) # t2の向きを北に
t2.forward(50)
turtle.done()
基本的な使用法と方向の理解
最も基本的な例です。seth()
を使ってカメの向きを絶対的な角度で設定し、その方向に進みます。
import turtle
# 画面とタートルオブジェクトの準備
screen = turtle.Screen()
screen.setup(width=600, height=400) # 画面サイズを設定
t = turtle.Turtle()
t.shape("turtle") # カメの形にする
# 描画速度を速くする
t.speed(1) # 1 (slowest) から 10 (fastest), 0 はアニメーションなし
# 東(0度)へ進む
t.penup() # ペンを上げて移動
t.goto(-200, 0) # 左端に移動
t.pendown() # ペンを下ろす
t.seth(0) # 0度は東(右)
t.forward(100) # 東へ100ピクセル進む
t.write("0度 (東)", align="center", font=("Arial", 10, "normal")) # 説明書き
# 北(90度)へ進む
t.penup()
t.goto(-100, 0)
t.pendown()
t.seth(90) # 90度は北(上)
t.forward(100)
t.write("90度 (北)", align="center", font=("Arial", 10, "normal"))
# 西(180度)へ進む
t.penup()
t.goto(0, 0)
t.pendown()
t.seth(180) # 180度は西(左)
t.forward(100)
t.write("180度 (西)", align="center", font=("Arial", 10, "normal"))
# 南(270度、または-90度)へ進む
t.penup()
t.goto(100, 0)
t.pendown()
t.seth(270) # 270度は南(下)
# t.seth(-90) としても同じ結果になります。
t.forward(100)
t.write("270度 (南)", align="center", font=("Arial", 10, "normal"))
# 南東(-45度、または315度)へ進む
t.penup()
t.goto(200, 0)
t.pendown()
t.seth(-45) # 負の角度も使用可能
t.forward(100)
t.write("-45度 (南東)", align="center", font=("Arial", 10, "normal"))
# 描画ウィンドウを閉じるまで待機
turtle.done()
この例では、seth()
を使ってカメをさまざまな絶対方向に向かせ、その結果としてカメがどのような線を描くかを示しています。
図形を描く際の seth() の活用
seth()
を使うことで、カメの向きを直接指定できるため、特定の形状やパターンを描く際に便利です。
例:正方形を描く(seth()
のみで向きを制御)
import turtle
t = turtle.Turtle()
t.shape("turtle")
t.speed(3)
side_length = 100
# 最初の辺 (東へ)
t.seth(0)
t.forward(side_length)
# 2番目の辺 (北へ)
t.seth(90)
t.forward(side_length)
# 3番目の辺 (西へ)
t.seth(180)
t.forward(side_length)
# 4番目の辺 (南へ)
t.seth(270)
t.forward(side_length)
turtle.done()
この例では、left()
や right()
を使わずに、seth()
だけで各辺を描く前のカメの向きを正確に設定しています。
円周上の点を結ぶ(放射状の線)
中心から放射状に線を描く場合など、特定の角度に向かって線を引く際に seth()
が非常に役立ちます。
import turtle
import math
t = turtle.Turtle()
t.shape("arrow") # 矢印の形にする
t.speed(0) # 最速
t.penup() # ペンを上げて移動
t.goto(0, 0) # 中心に移動
t.pendown()
radius = 150
num_lines = 12
for i in range(num_lines):
# 角度を計算 (360度を線の本数で割る)
angle = i * (360 / num_lines)
# カメをその角度に向ける
t.seth(angle)
# 中心から外側へ線を引く
t.forward(radius)
# 中心に戻る (ペンは上げたまま)
t.penup()
t.goto(0, 0)
t.pendown()
turtle.done()
このコードは、中心から12本の線が放射状に伸びる図形を描きます。seth(angle)
を使うことで、各線が常に中心から正しい角度で伸びるように制御しています。
タートル自身を回転させるアニメーションなどでも seth()
は使えます。
import turtle
import time
t = turtle.Turtle()
t.shape("turtle")
t.color("green")
t.speed(0) # 最速
# タートルの中心を維持しつつ回転させる
for angle in range(0, 361, 10): # 0度から360度まで10度刻み
t.seth(angle)
# 少し待つことで回転のアニメーションが見える
time.sleep(0.05)
turtle.done()
この例では、seth()
を繰り返し呼び出すことで、タートルがその場でクルクルと回転する様子を表現しています。
turtle.seth(angle)
は、タートルの向きを絶対的な角度で制御したい場合に非常に強力なツールです。
- 用途
- 特定の方向に直線を引きたい場合。
- 図形の角を正確に設定したい場合。
- 放射状のパターンや、角度に基づいて動くオブジェクトを描く場合。
- タートル自身の向きをアニメーションさせたい場合。
- 基準
通常、東が0度、北が90度、西が180度、南が270度(または-90度)です。
left() / right() による相対的な回転
これは seth()
の最も直接的な代替方法です。seth()
が「どの方向を向くか」を指定するのに対し、left()
や right()
は「現在の向きから何度回転するか」を指定します。
特徴
- ループとの相性
正多角形を描く際など、繰り返し同じ角度だけ回転する処理に適しています。 - 直感的
「左に90度曲がる」「右に45度回転する」といった自然な思考でプログラミングできます。 - 相対的
カメの現在の向きに依存して回転します。
例:正方形を描く
import turtle
t = turtle.Turtle()
t.shape("turtle")
t.speed(3)
side_length = 100
for _ in range(4): # 4回繰り返す
t.forward(side_length) # 前に進む
t.right(90) # 右に90度回転
turtle.done()
この例では、seth()
を使わずに right(90)
を繰り返し呼び出すことで正方形を描いています。
towards(x, y) と seth() の組み合わせ
towards(x, y)
は、現在のカメの位置から指定された座標 (x, y)
へ向かうために必要な角度(絶対角度)を返します。この戻り値を seth()
に渡すことで、特定の点へカメを向けることができます。
特徴
- seth() との連携
towards()
単体では向きを変えるだけで、描画は行いません。 - 目標指向
特定の目的地に向かってカメを向けたい場合に非常に便利です。
例:複数の点に向かって線を描く
import turtle
t = turtle.Turtle()
t.shape("arrow")
t.speed(1) # 少し遅め
# 描画したい点のリスト
points = [(100, 50), (-50, 150), (200, -100), (0, 0)]
for x, y in points:
# 現在地から次の点へ向かう角度を計算し、その向きにカメをセット
current_x, current_y = t.pos()
print(f"現在地: ({current_x}, {current_y}), 次の目標: ({x}, {y})")
# towards() は、(x, y) に向かうために必要な絶対角度を計算
angle_to_target = t.towards(x, y)
t.seth(angle_to_target) # その角度にカメの向きを設定
# ターゲットまで進む
t.goto(x, y) # あるいは t.forward(t.distance(x, y))
time.sleep(1) # 少し停止して確認
turtle.done()
この例では、seth()
自体は使っていますが、その引数を towards()
で動的に決定しています。これは「特定の方向を向く」という意図を実現する強力な方法です。
turtle
モジュールが提供する関数だけでなく、Pythonの標準 math
モジュールを使って、カメの現在の位置 (xcor()
, ycor()
) や現在の向き (heading()
) を基に、次の移動先の座標を計算し、goto()
で直接移動させる方法もあります。これは seth()
の「間接的な代替」と考えることができます。
特徴
- seth() が不要な場合も
向きを変更せずに直接目的地にジャンプさせたい場合に特に有効です。 - 数学的知識
角度や三角関数(sin
,cos
)に関する理解が必要になります。 - 柔軟性
複雑な軌道やカスタムな移動パターンをプログラムする際に、より詳細な制御が可能です。
例:円周上を移動する(goto
を使用)
これは seth()
を直接使わない例ですが、結果的にカメが円周に沿って動くため、向きの制御の一種と言えます。
import turtle
import math
t = turtle.Turtle()
t.shape("circle")
t.speed(0) # 最速
t.penup() # 線を引かずに移動
center_x, center_y = 0, -100 # 円の中心
radius = 150
num_steps = 360 # 円を構成する点の数
for angle_deg in range(0, num_steps + 1, 5): # 0度から360度まで5度刻み
# 角度をラジアンに変換
angle_rad = math.radians(angle_deg)
# 円周上の点の座標を計算
x = center_x + radius * math.cos(angle_rad)
y = center_y + radius * math.sin(angle_rad)
t.goto(x, y) # その座標に移動
# 必要であれば、カメの向きも設定できるが、この例では不要
# t.seth(angle_deg + 90) # 円の外側を向くように調整 (例)
t.pendown() # 線を引き始める
turtle.done()
この例では、seth()
は使わず、goto()
で直接座標を指定してカメを動かしています。カメの向きは shape("circle")
なのであまり関係ありませんが、もし shape("turtle")
であれば、円に沿って向きを変えるために seth()
を使うとより自然な動きに見えます。
turtle.seth()
はカメの向きを絶対的に制御する強力な方法ですが、目的によっては以下のような代替手段や補完的な方法が考えられます。
- 座標を直接計算して移動させたい場合
goto()
やsetx()
,sety()
を使用し、必要に応じて数学関数と組み合わせます。 - 特定の座標へ向かいたい場合
towards()
とseth()
の組み合わせが便利です。 - 相対的な回転を繰り返す場合
left()
やright()
がシンプルで効率的です。