Pythonの基礎・制御構文で図形を描いてみよう
制御構文とは
プログラムの実装には 「繰り返し」や「条件分岐」と呼ばれる制御が用いられ, これらを記述するための命令文が 制御構文 です. Pythonでは,「繰り返し」を記述するための命令文が for文であり, 「条件分岐」を記述するための命令文が if文 です. Turtleグラフィックスに制御構文を組み合わせることで, より複雑な図形を描画することが可能です. ここでは,渦巻状の図形や円の描画に挑戦してみましょう.
Google Colaboratory
下記のリンクをクリックして,Colabにアクセスしましょう.
Colabにアクセスしたら,大学のGmailアカウント(@g.sugiyama-u.ac.jp)でログインしていることを確認してください. 次に,ノートブック(ファイル)を新規作成し,ノートブックの名前を chapter2.ipynb に変更しましょう.
加えて,前回と同様に,ColabTurtleとインストールしておきます. このとき,算術計算のためのライブラリである math も追加しておきます.
!pip install ColabTurtle
from ColabTurtle.Turtle import *
import math
for文で繰り返し
for文の記述方法
for文は特定の処理を指定した回数だけ繰り返したいときに用います.
このとき,繰り返しの対象となる処理は,for
の位置から,字下げ する必要があります.
Colabで字下げするには,キーボードの Tabキー を押します.
for i in range(繰り返す回数):
繰り返す対象となる処理
for文を利用した描画
ここでは,亀を$50$だけ直進させる処理(forward(50)
)を,10回繰り返します.
この結果,亀は初期値の座標$(100, 250)$から$500$だけ右に移動した座標$(600, 250)$に移動します.
initializeTurtle()
penup()
goto(100, 250)
right(90)
pendown()
for i in range(10):
forward(50)
penup()
for文で用いられるi
は,繰り返しの回数を表し,ここでは,$0$から$9$まで変化します.
そこで,このi
を利用して,亀の進む距離を変化させます.
亀の進む距離はdistance
という変数に代入(値を設定すること)します.
変数とは数値や文字を記録する箱のことであり,ここでは次のように処理しています.
これは,distance
という変数に,$10 \times (i+1)$の値を代入することを意味しています.
i
は$0$から$9$まで変化するため,
distance
は$10$から$100$まで変化することになります.
この結果,亀は初期値の座標$(100, 250)$から$550$だけ右に移動した座標$(650, 250)$に移動します.
distance = 10 * (i+1)
initializeTurtle()
penup()
goto(100, 250)
right(90)
pendown()
for i in range(10):
distance = 10 * (i+1)
forward(distance)
penup()
渦巻状の図形の描画
for文を利用して,渦巻状の図形を描いてみましょう. ここでは,亀を進行方向に直進させて,右向きに$90$度回転させる処理を,20回繰り返しています. このとき,亀の進む距離は$20$から$400$まで変化させています. この結果,渦巻状の図形を描くことになります.
initializeTurtle()
penup()
goto(400, 250)
right(90)
pendown()
for i in range(20):
distance = 20 * (i+1)
forward(distance)
right(90)
penup()
円の描画
for文を利用して,円を描いてみましょう.
ここでは,i
は角度を表し,$0$度から$359$度まで変化させています.
Pythonでは,角度はラジアン角で表すため,次の式で変換し,r
に代入しています.
r = 2 * math.pi * (i / 360)
上記の式をmath.radians()
関数で表すこともできます.
r = math.radians(i)
円のX座標は,中心のX座標(center_x
)と,半径(radius
)に余弦(cos
)をかけ合わせた値の和となります.
同様に,円のY座標は,中心のY座標(center_y
)と,半径(radius
)に正弦(sin
)をかけ合わせた値の和となります.
x = center_x + radius * math.cos(r)
y = center_y + radius * math.sin(r)
算出された座標$(x,y)$にgoto
で亀を移動させることで円を描きます(亀の向きは関係ない).
ここで,speed
は亀の動きが更新される速さです.
各自の環境に合わせ適宜調整してください.
center_x = 400
center_y = 250
radius = 200
initializeTurtle()
speed(10)
penup()
for i in range(360):
r = math.radians(i)
x = center_x + radius * math.cos(r)
y = center_y + radius * math.sin(r)
goto(x, y)
pendown()
penup()
if文で条件分岐
if文の記述方法
if文は条件に応じて,実行したい処理を選択するときに用います.
条件は,次の表に示す比較演算子と呼ばれる記号を用いて 条件式と呼ばれる形式で記述します.
条件式の結果は,必ずTrue
(真)またはFalse
(偽)のいずれかの値となります.
比較演算子 | 意味 | 例 |
---|---|---|
$A==B$ | AとBは等しい | $x==3$ |
$A!=B$ | AとBは等しくない | $x!=3$ |
$A>B$ | AはBより大きい | $x>3$ |
$A>=B$ | AはB以上 | $x>=3$ |
$A<B$ | AはBより小さい | $x<3$ |
$A<=B$ | AはB以下 | $x<=3$ |
if文は条件式を用いて次のように記述します.
条件式がTrue
のときだけ,対象となる処理は実行されます.
また,対象の処理は,if
の位置から,字下げ する必要があります.
if(条件式):
条件式がTrueのとき実行される処理
次の記述のようにelse
を利用して,条件式がFalse
の場合にも,特定の処理を実行することができます.
条件式はTrue
またはFalse
の2値のため,いずれかの処理が必ず実行されることに注意してください.
if(条件式):
条件式がTrueのとき実行される処理
else:
条件式がFalseのとき実行される処理
次の記述のようにelif
を利用して,複数の条件式を設定して分岐を増やすことができます.
このとき,else
は省略することもできます.
if(条件式1):
条件式1がTrueのとき実行される処理
elif(条件式2):
条件式2がTrueのとき実行される処理
else:
いずれの条件式も満たさないとき実行される処理
if文を利用した描画
if文を利用して,円に色を設定してみましょう.
ここでは,亀のX座標(getx
)を条件式に用いています(Y座標を取得するにはgety
).
$x$座標が$400$以上のときは赤色.
$x$座標が$400$より小さいときは青色で描画しています.
center_x = 400
center_y = 250
radius = 200
initializeTurtle()
speed(10)
penup()
for i in range(360):
if(getx() >= 400):
color("red")
else:
color("blue")
r = math.radians(i)
x = center_x + radius * math.cos(r)
y = center_y + radius * math.sin(r)
goto(x, y)
pendown()
penup()
if文を利用して,渦巻状の図形に色を設定してみましょう.
ここでは,亀の進行方向(heading
)を条件式に用いています.
進行方向が上($270$度)のとき黄色.
進行方向が右($0$度)のとき赤色.
進行方向が下($90$度)のとき青色.
進行方向が左($180$度)のとき緑色で描画しています.
まずは,heading()
が亀の進行方向を表していることを確認してみましょう.
initializeTurtle()
print(heading()) # 上
right(90)
print(heading()) # 右
right(90)
print(heading()) # 下
right(90)
print(heading()) # 左
270
0
90
180
それでは,亀の進行方向に応じて色を変えてみます.
penup()
goto(400, 250)
right(90)
pendown()
for i in range(20):
if(heading() == 0):
color("red")
elif(heading() == 90):
color("blue")
elif(heading() == 180):
color("green")
elif(heading() == 270):
color("yellow")
distance = 20 * (i+1)
forward(distance)
right(90)
penup()
課題
下図を参考に渦巻状の三角形の図形を描いてください. また,進行方向を条件に赤色,青色,緑色に直線を塗り分けてください.
課題が完成したら,Google Colaboratoryで作成した chapter2.ipynb を保存し, 共有用のリンク と ノートブック(.ipynb) をダウンロードして提出してください. 提出の前に必ず下記の設定を行ってください.
- ノートブックの設定で「セルの出力を除外する」のチェックを外す
- ノートブックの変更内容を保存して固定
- 共有設定で「学校法人椙山女学園大学」を「閲覧者」に設定