もくじ
ここではタートルグラフィクスによって絵を描く プログラムを作成する方法を説明します. 「亀の描画機能」では描画に利用できる機能の一覧を紹介していますが,それらの全てを理解しなければプログラムが作れないわけではありません.
はじめに
タートルグラフィクスとは,画面上のタートル(亀)を動かして,亀の通った跡に線をひくことで絵を描く枠組みです. 亀の動きをプログラムで指示することでさまざまな絵を描くことができます. 次にタートルグラフィクスプログラムの実行中の画面の例を示します(なお図では「矢印」が亀を表しています).
タートルグラフィクスで 亀の動作の基本となるのが「前へ進む」と「向きを変える」という指示です. これによって,ひとつながりの線画を描くことができます. さらに 指定した範囲を塗りつぶしたり, 線を描かずに移動することもできるようになっています. 詳しくは「亀の機能」を参照してください.
備考
ここで紹介するタートルグラフィクスはPythonに標準で備わっているタートルグラフィクスを少しアレンジしたもので, プログラムを実行するにはPythonに追加のパッケージを導入することが必要です. 本演習では授業で必要な設定を追加しています.授業の進行に従ってこのページを開いている場合には,すでにパッケージの導入は終わっているはずです.パッケージを導入していない場合には以下でプログラムを動作させることはできません.
プログラムの例
次に簡単なサンプルプログラムを示します. これは黄色で正方形を描くプログラム(square.py )です.なお正方形を描画した後,亀が描画前に向いていた方向を向くようにしています.
from pyturtle import * # 描画動作の定義 def draw(): line_color(100,70,0) # 線の色設定(0 <= R,G,B <= 100) line_width(3) # 線幅 = 3 forward(200) # 200前進 turn(90) # 左90度回転 forward(200) # 200前進 turn(90) # 左90度回転 forward(200) # 200前進 turn(90) # 左90度回転 forward(200) # 200前進 turn(90) # 左90度回転 # 画面の表示と描画の実行(drawに従う) launch(draw)
このサンプルプログラムは「pyturtle.py」と同じフォルダにダウンロードして,「idle」を介して実行できます. idleを起動して「File」から「Open」でダウンロードしたファイルを指定して, 新たに開かれる「Editor」で「Run」「Run Module」で実行して下さい.
キャンバスが表示されたらマウスの左ボタンをクリックするか[Enter]を押すことで絵を描くことができます. また描画が完了した後, マウスの左ボタンをクリックするか[Enter]を押すとキャンバスを閉じてプログラムを終了します.
亀の動作の記述方法
亀の動作は次のように記述します.
from pyturtle import * def draw(): # 1行ずつ亀の動作などを記述する # 行の先頭は字下げする(インデントをつける) # 「#」の後ろは行末までが注釈(コメント)として扱われる # コメントの部分はプログラムとして解釈はされない line_color(100,70,0) # 線の色設定(0 <= R,G,B <= 100) line_width(2) # 線幅の設定(幅=2に設定.線幅の初期値=1) : : : launch(draw)
「def draw():」の次の行から1行に一つずつ 好きなだけ亀の動作を書くことができます. 線の色,線の幅なども指定できます. これらの行では先頭に適切にインデントを入れる(字下げをする)必要があります(†). すべての動作を記述した後, 最後に行の先頭から(つまりインデントを入れないで)「launch(draw)」と記述します.
なおdefの行とlaunch( )の行の「draw」という名前(文字列)は,これら2箇所を同じ名前で揃えておけば,draw以外の名前にも変えられます(名前の付け方にはルールがあります).
さきほどのサンプル(square.py)も ここで説明している形式に沿って記述されていることを確認して下さい.
さてプログラムを実行すると,記述した内容が上の行から順に読み取られて,その指示の通りに順番に亀が動きます. 亀の具体的な動かし方については別途説明します(「亀の描画機能」を参照のこと).
亀の描画機能
ここではタートル(亀)の描画機能について説明します. 基本となる機能は「前へ進む」(forward)と「向きを変える」(turn)です. またline_colorで線の色,fill_colorで塗りつぶしの色を指定できます. まずこれらを使うだけでもいろいろな絵を描くことができるでしょう. 以下に示す種々の機能を利用すればバラエティに富んだ絵を描けるようになります.
機能名 | 意味 | 例 |
---|---|---|
forward(dist) | distだけ前に進む.負の値を指定した場合はうしろに下がる. | forward(100) |
turn(degree) | degree度だけ反時計回りに回転する. 負の値を指定した場合は時計回りに回転する. | turn(30) |
move(dx,dy) | 現在地から横(x方向)にdx,縦(y方向)にdyだけ離れた点に進む.亀の向きに関わらず,キャンバスの座標系を基準とすることに注意せよ. | move(60,-30) |
moveto(x,y) | 点(x,y)に移動する.ここで指定する値については「画面の座標系」を参照のこと. | moveto(0,0) |
toward(f,r) | 現在地から前にf,右にrだけ離れた点に進む.moveとは異なり,現在の亀の向きを基準とすることに注意せよ. | toward(30,-70) |
turnto(dir) | 方位dirに向きを変える.ここで指定する値については「画面の座標系」を参照のこと. | turnto(180) |
circle(r,rot_dir) | 現在地から半径rの円を描く.rot_dirは'left'か'right',つまり左回りか右回りかのいずれかを指定する. ('left','right'は引用符で囲って指示することに注意せよ) |
circle(50,'right') |
arc(r,a) | 現在地から半径rで中心角a度の円弧を描く.aが正なら左回り,負なら右回りに描く. | arc(200,-120) |
fan(r,a) | 現在地から半径rで中心角a度の扇型を描く.まず現在地から亀の向いている方向に進んで,中心角がa度の円弧を,aが正なら左回り,負なら右回りに描く.その後,円の中心に進んで,最初の点に戻る.亀の向きも最初の状態に戻る. | fan(100,90) |
begin_fill() : end_fill() |
begin_fill()からend_fill()までの間に亀が動いて囲んだ領域が塗りつぶされる.なおend_fill()の時点でbegin_fill()のときの位置に戻っていない場合には,最初の点(begin_fill()のときの位置)と最後の点(end_fill()のときの位置)を線分で結んで囲まれる領域が塗りつぶしの対象となる. | begin_fill() forward(160) turn(60) forward(160) end_fill() |
begin_hover() : end_hover() |
begin_hover()からend_hover()までの間は線を描かずに移動する. | begin_hover() turnto(180) forward(100) turn(-60) move(10,10) end_hover() |
color(r,g,b) | 描画色(線の色と塗りつぶしの色)を(r,g,b)に設定する.r,g,b(赤,緑,青成分)はそれぞれ0〜100の整数で与える.描画開始時の描画色は(0,0,0)になっている.つまり描画色をプログラムで指定しなければ,黒が使われる.一度設定した色は再度設定するまで適用される. | color(0,25,75) |
line_color(r,g,b) | 描く線の色を(r,g,b)に設定する.r,g,b(赤,緑,青成分)はそれぞれ0〜100の整数で与える.描画開始時の線の色は(0,0,0)になっている.つまり線の色をプログラムで指定しなければ,黒が使われる.一度設定した色は再度設定するまで適用される. | line_color(100,75,0) |
fill_color(r,g,b) | 塗りつぶしの色を(r,g,b)に設定する.r,g,b(赤,緑,青成分)はそれぞれ0〜100の整数で与える.描画開始時の塗りつぶしの色は(0,0,0)になっている.つまり塗りつぶしの色をプログラムで指定しなければ,黒が使われる.一度設定した色は再度設定するまで適用される. | fill_color(40,100,20) |
line_width(w) | 描く線の太さをwに設定する.wは0以上の整数で与える.なお描画開始時の線の太さ=1になっている.つまり線の太さをプログラムで指定しなければ,線の太さ=1で描画する.一度設定した値は再度設定するまで適用される. | line_width(2) |
mark() | 現在の位置と向きを記憶する.後でbackすると記憶した位置に戻ることができる(向きも戻る).いくつでも記憶できる. | |
back() | markした場所に戻る.markしたときの方向を向く.戻ったら,その場所についての記憶(その場所のmark)はなくなる.二つ以上記憶している場合は直前にmarkした場所に戻る.何も記憶していない場合には何も起きない. | |
speed(s) | 描画スピードを設定する.sに設定するのは次のいずれかである.'slowest','slow','normal','fast','fastest'.初期値は'normal'である.つまりプログラムでスピードを設定しない場合は,描画スピードは'normal'となる.一度設定した速さは再度設定するまで適用される. (sで指定する速さのデータはいずれも引用符で囲って指示することに注意せよ) |
speed('fastest') |
position() | 亀の現在位置を得る. | x,y=position() |
direction() | 亀の現在の向きを得る. | v=direction() |
ask("メッセージ") | 文字列を得る(メッセージ付きの入力欄を表示する). (注)この機能を使った場合,描画終了後にウインドウを閉じるにはキャンバスを左クリックする.[Enter]では閉じることができない. |
name=ask("お名前は?") |
askv("メッセージ") | 数値を得る(メッセージ付きの入力欄を表示する). (注)この機能を使った場合,描画終了後にウインドウを閉じるにはキャンバスを左クリックする.[Enter]では閉じることができない. |
sz=askv("一辺の長さ?") |
say("メッセージ") | メッセージを画面に表示する. | say("こんにちは!") |
wait("メッセージ") | 一時停止して現在の位置と進行方向をメッセージとともに画面に表示する.メッセージは省略してもよい. | wait() |
bye("メッセージ") | メッセージを画面に表示した後,キャンバスを閉じて,プログラムを終了する.メッセージは省略できる.その場合は,単にキャンバスを閉じて,プログラムを終了する. | bye("See you!") |
launch(draw_func) | ウインドウを開く.描画開始の指示(クリックまたは[Enter])があると,draw_funcの記述に従って描画を行う. | launch(draw) |
プログラム実行開始時の初期設定
プログラム実行開始時には亀は画面中央に上向きに配置されます. またプログラム開始の時点での描画色(線,塗りつぶし),描画する線の太さ,描画の速さは,それぞれ次の初期値で定められています.
描画色 | (0,0,0) |
---|---|
線の太さ | 1 |
速さ | 'normal' |
color,line_width,speedによって新たな設定が与えられるまでは,これらの初期設定が適用されます.
チュートリアル
タートルグラフィクスでの基本的な描画処理の説明と亀の機能の説明を兼ねたチュートリアルプログラムを用意しました(すべての機能を網羅しているわけではありません).ダウンロードして実行してみて下さい. またファイルをidleのEditorで開いて,プログラムの内容を確認してみて下さい.
なおファイルは自分のPCの「pyturtle.py」と同じフォルダにダウンロードします.ブラウザ画面で開くのではありません. 次でダウンロードの方法について説明しています.
キャンバスの座標系
キャンバスの中心が原点(0,0)となっています. 右向きにx軸,上向きにy軸がとられています. またy軸の正の方向を0として反時計回りで角度(degree)により方位を表します. 0が北,90が西,180が南,270が東を表します. 360はまた北向きを表します. もちろん中間の方位も角度(0-360)で表すことができます.
サンプルプログラム集
以下のサンプルプログラムを用意しました. ダウンロードして実行してみてください. またダウンロードしたプログラムの内容を見て参考にしてください.
- simple_star.py(星形を描く)
- two_stars.py(星形を二つ描く)
- square_fill.py(塗りつぶされた正方形を描く)
- sprout.py(植物の芽を描く)
- star_fill.py(塗りつぶされた星形を描く)
サンプルプログラムは「pyturtle.py」と同じフォルダにダウンロードして,「idle」を介して実行できます. idleを起動して「File」から「Open」でダウンロードしたファイルをを指定して 新たに開かれる「Editor」で「Run」「Run Module」で実行して下さい.
色表
色データの見本を次のページに示しています.