Pythonの基礎・制御構文で図形を描いてみよう

Image from Gyazo

制御構文とは

プログラムの実装には 「繰り返し」や「条件分岐」と呼ばれる制御が用いられ, これらを記述するための命令文が 制御構文 です. Pythonでは,「繰り返し」を記述するための命令文が for文であり, 「条件分岐」を記述するための命令文が if文 です. Turtleグラフィックスに制御構文を組み合わせることで, より複雑な図形を描画することが可能です. ここでは,渦巻状の図形や円の描画に挑戦してみましょう.

Google Colaboratory

下記のリンクをクリックして,Colabにアクセスしましょう.

Google Colaboratory

Colabにアクセスしたら,大学のGmailアカウント(@g.sugiyama-u.ac.jp)でログインしていることを確認してください. 次に,ノートブック(ファイル)を新規作成し,ノートブックの名前を chapter2.ipynb に変更しましょう.

Image from Gyazo

加えて,前回と同様に,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()

Image from Gyazo

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()

Image from Gyazo

渦巻状の図形の描画

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()

Image from Gyazo

円の描画

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()

Image from Gyazo

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()

Image from Gyazo

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()

Image from Gyazo

課題

下図を参考に渦巻状の三角形の図形を描いてください. また,進行方向を条件に赤色,青色,緑色に直線を塗り分けてください.

Image from Gyazo

課題が完成したら,Google Colaboratoryで作成した chapter2.ipynb を保存し, 共有用のリンクノートブック(.ipynb) をダウンロードして提出してください. 提出の前に必ず下記の設定を行ってください.

参考図書

愛知県名古屋市にある椙山女学園大学 文化情報学部 向研究室の公式サイトです. 専門は情報科学であり,人工知能やデータベースなどの技術要素を指導しています. この公式サイトでは,授業で使用している教材を公開すると共に, ベールに包まれた女子大教員のミステリアスな日常を4コマ漫画でお伝えしていきます. サイトに関するご意見やご質問はFacebookまたはTwitterでお問い合わせください.