2015年11月18日水曜日

【プログラミング】Pythonの勉強 その7 - いろんな図形をランダムに描く -

プログラミング初心者の学習記録です。
今回もturtleモジュールで遊んでみます。
いろんな図形をいろいろな大きさでランダムで描くプログラムを書いてみます。

図形の種類は、円、四角形、三角形の3種類にします。種類を増やすとややこしくなるので、今回はこれだけにします。
原点からランダムの距離を移動し、そこから図形を描いて原点に戻るという動作を10回やります。




「random_shape.py」という名前で次のようにプログラムを書きました。
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
# coding:shift-jis
import math
import random
import turtle

class Kame(turtle.Turtle):
    def __init__(self):
        super(Kame,self).__init__()
        pass

    def random_draw(self):
        self.radians()
        i = 0
        while i < 10: # 10回繰り返す
            i += 1
            shape = random.randint(0,2)
            r = random.randint(3,8) * 50 # 150から400まで50きざみでランダム

            if shape == 0: # 0 ならば円を描く
                self.penup()
                self.left(math.pi/2) # 上を向く
                self.fd(r)
                self.pendown() # スタート地点に着く
                self.left(math.pi/2) # 左を向く
                self.circle(r)
                self.left(math.pi/2) # 下を向く
                self.penup()
                self.fd(r)
                self.pendown() # 原点に戻る
                self.left(math.pi/2) # 右を向く

            elif shape == 1: # 1 ならば正方形を描く
                line = r / math.cos(math.pi/4)
                # cos(45°) = r / line -> line = r = cos(45°)
                self.penup()
                self.left(math.pi/2) # 上を向く
                self.fd(r)
                self.pendown() # スタート地点に着く
                self.left(math.pi/4*3) # 135°左
                self.fd(line)
                n = 0
                while n < 3: # 3回繰り返し
                    n += 1
                    self.left(math.pi/2) # 90°左
                    self.fd(line)
                self.left(math.pi/4*3) # 下を向く
                self.penup()
                self.fd(r)
                self.pendown() # 原点に戻る
                self.left(math.pi/2) # 右を向く

            else: # 2 ならば三角形を描く
                line = (r+(math.cos(math.pi/3)*r)) / math.cos(math.pi/6) 
                self.penup()
                self.left(math.pi/2) # 上を向く
                self.fd(r)
                self.pendown() # スタート地点に着く
                self.left(math.pi/6*5) # 150°左
                self.fd(line)
                self.left(math.pi/3*2) # 120°左
                self.fd(line)
                self.left(math.pi/3*2) # 120°左
                self.fd(line)
                self.left(math.pi/6*5) # 下を向く
                self.penup()
                self.fd(r)
                self.pendown() # 原点に戻る
                self.left(math.pi/2) # 右を向く
syntax2html


実行するには、対話モードで次のように入力します。
1
2
3
import random_shape
kame = random_shape.Kame()
kame.random_draw()
syntax2html

こんな感じに図形が描けました。

本当は、図形を描く部分や原点からスタート地点までの移動、描き終わってから原点への移動を、それぞれ関数に分けようと思ったのです。
クラスを使わずに関数だけを定義したらうまくいったのですが、クラスを作ってその中に複数メソッドを書いて、メソッドの中で他のメソッドを使おうとするとエラーが出てうまくいきませんでした。
この辺ももっと勉強して調べたいと思います。



0 件のコメント:

コメントを投稿