Python Turtleの「radians()」徹底解説:度とラジアンの切り替え方

2025-06-06

turtle.radians() とは何か

turtle モジュールは、グラフィックを描画するためのPythonの標準ライブラリです。カメ(タートル)を模したカーソルを動かすことで、線や図形を描くことができます。

turtle モジュールで角度を指定する際、デフォルトでは**度(degrees)**を使用します。例えば、turtle.right(90) とすれば、カメは右に90度回転します。

しかし、数学や他のプログラミングの文脈では、角度を**ラジアン(radians)**で扱うことがよくあります。特に、三角関数(math.sin(), math.cos() など)の多くはラジアンを引数にとります。

turtle.radians() は、この turtle モジュールの角度の単位を、デフォルトの「度」から「ラジアン」に切り替える関数です。

使い方

turtle.radians() は引数をとりません。この関数を一度呼び出すと、それ以降のすべての角度指定(turtle.left(), turtle.right(), turtle.setheading() など)がラジアン単位として解釈されるようになります。


import turtle
import math

# タートルスクリーンの設定
screen = turtle.Screen()
screen.setup(width=600, height=400)
screen.tracer(0) # アニメーションをオフにして高速化

t = turtle.Turtle()
t.speed(0) # 最速
t.penup()
t.goto(-200, 0)
t.pendown()

# デフォルト(度)での描画
t.pencolor("blue")
t.forward(100)
t.right(90) # 90度右に回転
t.forward(100)
t.left(45)  # 45度左に回転
t.forward(50)

# 角度の単位をラジアンに切り替える
turtle.radians()

# ラジアンでの描画
t.penup()
t.goto(50, 0)
t.pendown()
t.pencolor("red")

# 90度(π/2ラジアン)右に回転
t.forward(100)
t.right(math.pi / 2) # π/2ラジアン右に回転
t.forward(100)

# 45度(π/4ラジアン)左に回転
t.left(math.pi / 4)  # π/4ラジアン左に回転
t.forward(50)

screen.update() # 描画を更新
screen.mainloop()

上記の例では、最初に青い線で描画している部分はデフォルトの「度」を使用しています。turtle.radians() を呼び出した後は、赤い線で描画している部分で角度をラジアンで指定しています。math.pi を使用してラジアン値を計算している点に注目してください。

元に戻すには

turtle.radians() で角度の単位をラジアンに切り替えた後、再び「度」に戻したい場合は、turtle.degrees() 関数を使用します。

import turtle
import math

# ... (初期設定は省略) ...

turtle.radians() # ラジアンモード
t.right(math.pi / 2)

turtle.degrees() # 度モードに戻す
t.right(90) # これ以降は90度として解釈される
  • より正確な表現
    円周率 π を用いて角度を表現することで、浮動小数点数の丸め誤差を気にすることなく、より正確な角度指定が可能になる場合があります。
  • 他のライブラリとの連携
    math モジュールなどの多くのPythonライブラリがラジアンを前提としているため、turtle.radians() を使用することで、これらのライブラリとシームレスに連携できます。
  • 数学的な整合性
    ラジアンは数学的な計算(特に三角関数)で自然に使用される単位であり、統一性を持たせることができます。


一般的なエラーとトラブルシューティング

turtle.radians() 自体が直接エラーを引き起こすことは稀ですが、この関数を使った後に発生しやすい「論理エラー」や「意図しない挙動」が主な問題となります。

  1. ラジアンモードであることを忘れて、度で角度を指定してしまう

    これは最もよくある間違いです。turtle.radians() を呼び出した後も、感覚的に「90度回転させたい」と思って t.right(90) のように書いてしまうと、実際には 90 ラジアン(約 5157 度!)という非常に大きな角度で回転してしまい、予想外の描画になります。

    例 (意図しない挙動)

    import turtle
    import math
    
    t = turtle.Turtle()
    turtle.radians() # 単位をラジアンに設定
    
    # 90度回転させたいのに、誤って90ラジアンとしてしまう
    t.right(90) # これだと約5157度回転してしまう!
    
    # 正しいラジアンでの90度回転
    # t.right(math.pi / 2) # こちらが正しい
    
    • turtle.radians() を呼び出した後は、すべての角度指定がラジアン単位になることを常に意識してください。
    • 度数で角度を指定したい場合は、math.radians() 関数を使って度数をラジアンに変換するか、turtle.degrees() を呼び出して単位を「度」に戻してから指定します。
      import turtle
      import math
      
      t = turtle.Turtle()
      turtle.radians()
      
      # 45度をラジアンに変換して使う
      t.forward(50)
      t.left(math.radians(45)) # math.radians() で度をラジアンに変換
      t.forward(50)
      
      # または、一度度モードに戻してから使う
      turtle.degrees() # 度モードに戻す
      t.right(90) # 90度として解釈される
      
    • プログラムのどこで単位が切り替わっているかを明確にするため、コメントを積極的に活用しましょう。
  2. math.pi をインポートし忘れる、または間違った値を使う

    ラジアンを使用する場合、円周率 π (パイ) の値が頻繁に必要になります。Pythonでは math モジュールに math.pi として定義されています。これをインポートし忘れたり、間違った値を使ったりすると、計算が狂います。

    例 (NameError)

    import turtle
    
    t = turtle.Turtle()
    turtle.radians()
    
    # math.pi をインポートし忘れていると NameError が発生
    t.circle(50, 2 * pi) # NameError: name 'pi' is not defined
    

    トラブルシューティング

    • ラジアンで角度計算を行う場合は、必ず import math を行い、math.pi を使用するようにしてください。
      import turtle
      import math # これを忘れない!
      
      t = turtle.Turtle()
      turtle.radians()
      t.circle(50, 2 * math.pi) # 円を一周描画
      
  3. turtle.radians() を呼び出すタイミングの問題

    turtle.radians() は、呼び出された時点から角度の単位を変更します。プログラムの途中で切り替えると、その後の処理に影響します。特に、複数の関数や処理ブロックで角度を扱う場合、どこで単位が変更されたかを把握しておく必要があります。

    例 (混乱しやすいケース)

    import turtle
    import math
    
    def draw_square_degrees(t_obj):
        # この関数は度で描画を想定
        for _ in range(4):
            t_obj.forward(100)
            t_obj.right(90) # 度で90度
    
    def draw_circle_radians(t_obj):
        # この関数はラジアンで描画を想定
        t_obj.circle(50, math.pi * 2) # ラジアンで360度
    
    t = turtle.Turtle()
    screen = turtle.Screen()
    
    # まず度で四角を描画
    turtle.degrees() # 明示的に度モードにする
    draw_square_degrees(t)
    
    # 次にラジアンで円を描画したい場合
    t.penup()
    t.goto(100, 0)
    t.pendown()
    turtle.radians() # ここでラジアンモードに切り替え
    draw_circle_radians(t)
    
    screen.mainloop()
    

    トラブルシューティング

    • コード全体で角度の単位を統一するか、切り替えを行う場所を明確にし、必要に応じて turtle.degrees()turtle.radians() を適切に呼び出してください。
    • 特に、異なる角度単位を前提とする複数の関数を使用する場合は、各関数の冒頭で適切な turtle.degrees() または turtle.radians() を呼び出すことで、予期せぬ挙動を防ぐことができます。
  4. 単に turtle モジュールの基本的な使用法に関するエラー

    turtle.radians() 自体というよりは、turtle モジュール全体の一般的なエラーが、turtle.radians() を使っている際にも発生することがあります。

    • import turtle を忘れる
      NameError: name 'turtle' is not defined
      • 解決策
        プログラムの先頭で import turtle を行います。
    • タートルオブジェクトを作成していないのにメソッドを呼び出す
      AttributeError: 'module' object has no attribute 'right' (例: turtle.right(90) と書いてしまう)
      • 解決策
        t = turtle.Turtle() のようにタートルオブジェクトを作成し、t.right(90) のようにそのオブジェクトのメソッドとして呼び出します。
    • 閉じ括弧の忘れなど、Pythonの基本的な構文エラー
      SyntaxError
      • 解決策
        エラーメッセージの行番号を確認し、括弧や引用符の閉じ忘れがないか確認します。
  • 公式ドキュメントを参照する
    turtle モジュールの公式ドキュメントは、各関数の詳細な動作や例が記載されており、問題解決の大きな助けとなります。
  • コードを小さな部分に分割してテストする
    複雑な描画を行う前に、角度の単位が正しく設定されているか、簡単な直線や回転でテストしてみることで、問題を早期に発見できます。
  • printデバッグ
    角度を渡す直前や、turtle.radians() を呼び出した直後に、print() 文を使って現在の角度の値や turtle のモード(直接確認する関数はありませんが、自分でメッセージを出力する)を確認すると、デバッグに役立ちます。
  • エラーメッセージをよく読む
    Pythonのエラーメッセージは、どこで何が問題なのかを示してくれます。特に NameErrorAttributeError は、変数名や関数名のスペルミス、または未定義のものを呼び出している可能性を示唆します。


turtle.radians() を使用する基本的な例

例1:度とラジアンでの描画の比較

この例では、同じ角度(90度)を度モードとラジアンモードで指定した場合の動作の違いを示します。

import turtle
import math # ラジアンで計算するためにmathモジュールが必要

# 1. スクリーンとタートルの準備
screen = turtle.Screen()
screen.setup(width=600, height=400) # ウィンドウサイズを設定
screen.tracer(0) # アニメーションをオフにして描画を高速化

t = turtle.Turtle()
t.speed(0) # 最速に設定
t.penup() # ペンを上げて移動
t.goto(-250, 50) # 開始位置へ移動
t.pendown() # ペンを下ろす

# 2. デフォルト(度)モードでの描画
t.pencolor("blue") # 青い線で描画
t.pensize(3) # 線の太さ

t.write("Degrees Mode (Default): 90 degrees turn", font=("Arial", 10, "normal"))
t.forward(100)
t.right(90) # 90度右に回転(度モードなのでそのまま90と指定)
t.forward(100)

# 3. 位置を移動
t.penup()
t.goto(-50, 50)
t.pendown()

# 4. ラジアンモードへの切り替え
turtle.radians() # ここで角度の単位をラジアンに切り替える

t.pencolor("red") # 赤い線で描画
t.write("Radians Mode: pi/2 radians (90 degrees) turn", font=("Arial", 10, "normal"))
t.forward(100)
t.right(math.pi / 2) # 90度 = π/2 ラジアンなので、math.pi / 2 と指定
t.forward(100)

# 5. もう一度度モードに戻す
t.penup()
t.goto(150, 50)
t.pendown()
turtle.degrees() # ここで角度の単位を度に戻す

t.pencolor("green") # 緑の線で描画
t.write("Back to Degrees Mode: 90 degrees turn", font=("Arial", 10, "normal"))
t.forward(100)
t.right(90) # 再び度モードなので、90と指定
t.forward(100)

# 描画を更新して表示
screen.update()
screen.mainloop() # ウィンドウを閉じないようにする

説明

  • 緑の線
    turtle.degrees() を呼び出すことで、再び度モードに戻ります。そのため、t.right(90) が再び90度回転として機能します。
  • 赤い線
    turtle.radians() を呼び出した後、ラジアンモードになります。90度をラジアンで表すと π/2 なので、math.pi / 2 を指定しています。
  • 青い線
    デフォルトの度モードで描画します。t.right(90) はそのまま90度回転を意味します。

例2:ラジアンで渦巻きを描く

ラジアンは、角度が連続的に変化するような図形を描くのに適しています。

import turtle
import math

screen = turtle.Screen()
screen.setup(width=600, height=600)
screen.bgcolor("black") # 背景を黒に
screen.tracer(0)

t = turtle.Turtle()
t.speed(0)
t.pencolor("cyan") # 水色の線
t.hideturtle() # タートルを非表示にする

turtle.radians() # ラジアンモードに切り替える

# 渦巻きの描画
length = 5
for i in range(300): # 300回繰り返す
    t.forward(length)
    # 角度を少しずつ増やす (ラジアン単位)
    # ここでは、π/8 (22.5度) ずつ回転させる
    t.left(math.pi / 8)
    length += 0.5 # 進む距離も少しずつ増やす

screen.update()
screen.mainloop()

説明

  • length を少しずつ増やすことで、外側に向かって広がる渦巻きが描かれます。
  • ループ内で t.left(math.pi / 8) とすることで、常に約22.5度ずつ左に回転します。
  • turtle.radians() でラジアンモードに設定します。

例3:三角関数を使った描画 (サインカーブ)

math モジュールの三角関数 (math.sin(), math.cos()) は、引数にラジアンを期待します。turtle.radians() を使うことで、タートルの回転とこれらの関数を直接連携させることができます。

import turtle
import math

screen = turtle.Screen()
screen.setup(width=800, height=400)
screen.tracer(0)

t = turtle.Turtle()
t.speed(0)
t.pencolor("purple") # 紫の線
t.hideturtle()

t.penup()
t.goto(-350, 0) # 左端中央から開始
t.pendown()

turtle.radians() # ラジアンモードに切り替える

# サインカーブの描画
# x軸に沿って進み、y軸の高さはsin関数で変化させる
for angle in range(720): # 0ラジアンから720ラジアンまで (約 114周分)
    # angle をそのままラジアンとして使用
    x = angle * 0.5 # x座標は角度に比例して少しずつ増やす
    y = math.sin(angle) * 100 # sinの値は-1から1なので、100倍して振幅を大きくする

    t.goto(x - 350, y) # 現在のタートルの位置を計算した(x, y)に移動
    # x軸のオフセットを考慮して -350 しています

screen.update()
screen.mainloop()

説明

  • ループを回す angle 変数自体をラジアン値として使用し、連続的なカーブを描いています。
  • math.sin(angle)angle をラジアンとして計算し、それに基づいて y 座標を決定します。
  • turtle.radians() を設定することで、もし turtle.setheading() などで角度を設定する場合もラジアンで指定できます。(この例では goto を使っているので直接は影響しませんが、概念として重要です)。

これらの例からわかるように、turtle.radians() は主に以下のような場面で役立ちます。

  • 角度をラジアンで統一的に扱いたいプログラミングスタイル。
  • 数学的な計算に基づいて図形を描きたい場合。
  • math モジュールの三角関数(sin, cos, tan など)と連携して角度を扱う場合。


turtle.radians() の代替方法

turtle.radians() は、turtle モジュール全体の角度単位を「度」から「ラジアン」に切り替える便利な関数ですが、常にそうする必要があるわけではありません。特定の状況や好みに応じて、以下のような代替方法でラジアンを扱うことができます。

  1. math.radians() 関数を使って度をラジアンに変換する (最も一般的で推奨される方法)

    math モジュールの radians() 関数は、度数単位の角度をラジアン単位に変換します。turtle モードがデフォルトの「度」のままであっても、この関数を使うことで個別にラジアン値を適用できます。

    特徴

    • turtle のグローバルな角度設定(度モード)を変更しない。
    • 必要な場所で明示的に変換を行うため、コードの可読性が高い。
    • math モジュールをインポートする必要がある。

    コード例

    import turtle
    import math
    
    screen = turtle.Screen()
    screen.setup(width=600, height=400)
    screen.tracer(0) # 高速化
    
    t = turtle.Turtle()
    t.speed(0)
    t.pencolor("blue")
    t.pensize(3)
    
    # デフォルトは度モード
    t.write("Default (Degrees Mode):", font=("Arial", 12, "normal"))
    t.forward(100)
    t.right(90) # 90度回転
    t.forward(100)
    
    # ラジアンで90度(π/2ラジアン)回転させたいが、モードは度のまま
    t.penup()
    t.goto(50, 0)
    t.pendown()
    t.pencolor("red")
    
    # math.radians() を使って45度をラジアンに変換して回転
    # t.right(math.radians(45)) と同じ意味になる
    t.write("Using math.radians(45):", font=("Arial", 12, "normal"))
    t.forward(100)
    t.left(math.radians(45)) # 45度をラジアンに変換して左に回転
    t.forward(100)
    
    # math.pi を直接使って角度を指定する (これも度モードで機能する)
    t.penup()
    t.goto(200, 0)
    t.pendown()
    t.pencolor("green")
    
    t.write("Using math.pi (360 degrees = 2*pi):", font=("Arial", 12, "normal"))
    t.circle(50, 2 * math.pi) # 円を一周描画(360度 = 2πラジアン)
                             # ここでは2 * math.pi が「角度」ではなく「度数」として解釈される
                             # math.pi * 2 が 6.28... となり、度モードで約6.28度として解釈される
                             # これは円の描画では問題ないが、回転では非常に小さな角度になる
    
    # 【重要注意】
    # `turtle.circle()` の第2引数(extent)は、
    # `turtle.radians()` が有効な場合はラジアンとして、
    # 無効な場合は度数として解釈されます。
    # つまり、上記 `t.circle(50, 2 * math.pi)` は
    # 度モードなので「約6.28度分の円弧」を描画します。
    # 「円を一周」描画したい場合は、以下のようになります。
    t.penup()
    t.goto(200, -100)
    t.pendown()
    t.pencolor("orange")
    t.write("Correct 360 degrees (in degrees mode):", font=("Arial", 12, "normal"))
    t.circle(50, 360) # 360度分の円弧
    
    screen.update()
    screen.mainloop()
    
    • この方法は、turtle が「度」モードのままであっても、math.radians(度数) を使うことで、特定の回転や方向設定においてラジアン値を渡すことを可能にします。
    • turtle.circle()extent 引数(第2引数)は、turtle.radians() が有効な場合はラジアン、無効な場合は度数として解釈されます。そのため、math.pi * 2 を直接渡すと、度モードでは約6.28度として解釈されてしまい、一周にはなりません。一周を描画したい場合は 360 を渡すか、turtle.radians() を有効にする必要があります。
  2. 必要な場所で手動でラジアン値を計算して指定する

    math.pi を使って、自分でラジアン値を計算し、直接 turtle の関数に渡す方法です。

    特徴

    • math.radians() 関数を呼び出す手間が省ける(コード量が若干減る)。
    • ラジアン計算に慣れている人向け。
    • turtle のグローバルな角度設定(度モード)を変更しない。
    • math.pi のインポートは必要。

    コード例

    import turtle
    import math
    
    screen = turtle.Screen()
    screen.tracer(0)
    
    t = turtle.Turtle()
    t.speed(0)
    t.pencolor("purple")
    t.pensize(2)
    
    # 度モードのまま
    t.penup()
    t.goto(-200, 0)
    t.pendown()
    
    t.write("Manual Radians Calc (Degrees Mode):", font=("Arial", 12, "normal"))
    t.forward(100)
    
    # 45度をラジアンで手動計算して指定 (45 * pi / 180 = pi / 4)
    t.left(math.pi / 4) # 約0.785ラジアン = 45度
    t.forward(100)
    
    # 180度をラジアンで手動計算して指定 (pi)
    t.right(math.pi) # 約3.14ラジアン = 180度
    t.forward(100)
    
    # 円を一周描画 (360度)
    t.penup()
    t.goto(100, 0)
    t.pendown()
    t.write("Circle (360 degrees in degrees mode):", font=("Arial", 12, "normal"))
    t.circle(50, 360) # 360度分の円弧
    
    screen.update()
    screen.mainloop()
    

    解説

    • この方法では、t.left(math.pi / 4) のように、直接ラジアンの値を計算して渡します。turtle は度モードなので、math.pi / 4 の結果(約0.785)を「0.785度」として解釈します。これは意図した挙動と異なる場合があるため、非常に注意が必要です。
    • この方法は、turtle.radians() を有効にせず、かつ math.radians() を使わない場合に、「数学的なラジアン値を度モードの turtle 関数に渡す」という、やや非直感的な挙動になるため、基本的には推奨されません。 上記のコードでは math.pi / 4 は約0.785度として回転します。45度回転させたいのであれば math.radians(45) を使うべきです。
    • turtle.circle()extent 引数に関しては、先述の通り、度モードでは度数として解釈されるため、360 と指定するのが適切です。
  • 手動計算: 非推奨

    • 上記で示した「手動でラジアン値を計算して turtle 関数に渡す」方法は、turtle が度モードでその値を「度」として解釈してしまうため、混乱を招きやすく、ほとんどの場合で意図した動作になりません。 基本的にこの方法は避けるべきです。もし行うなら、t.left(math.radians(角度_度数)) のように math.radians() を使って明示的に変換してください。
  • turtle.radians() を使う場合

    • プログラム全体で一貫してラジアン単位で角度を扱いたい場合に適しています。
    • 特に、数学的なモデルに基づいて複雑な図形を描画する場合など、ラジアンでの思考が自然な場合に便利です。
  • 最も推奨される方法: math.radians() を使う

    • turtle のグローバルな設定を変更せず、必要な場所で柔軟に度とラジアンを使い分けたい場合に最適です。
    • コードが読みやすく、意図が明確になります。
    • turtle.radians() を呼び出した後に「度」を指定してしまい、意図しない大きな角度で回転してしまうミスを防げます。