2015年11月16日月曜日

【プログラミング】Pythonの勉強 その6 - 五芒星と正五角形 -

プログラミング初心者の学習記録です。
前回はturtleモジュールを使って六芒星を描きました。
今回は五芒星(星形)と正五角形を描いてみます。前回同様に原点を中心とする図形を描きます。



まずは作戦を練ります。
まずは、原点Oから頂点Aまでの長さを基準に、五芒星を描くときの線の長さを求めたいと思います。

直角三角形ABCに注目します。
正五角形の内角は108°で、角BADはちょうどその1/3の36°になります。
角BACはその半分の18°です。また、角ABCは72°です。

cos(BAC) = AC / AB なので、
AB = AC / cos(18°) になります。

また直角三角形OBCをみてみると、角OBCは、108°の半分の54°です。角BOCは36°です。

cos(BOC) = OC / OB かつ OB = OA なので、
OC = OB * cos(36°)  = OA * cos(36°)  となり、

AC = OA + OC なので、
AB = (OA + (OA * cos(36°)) / cos(18°) となります。


正五角形の辺の長さも、原点から頂点までの長さで表してみます。

直角三角形OBCをみると、
cos(OBC) = BC / OB なので、
BC = cos(54°) * OB
BD = BC * 2 = 2 * cos(54°) * OB となります。



「turtle_pent.py」に、五芒星を描く関数「pentagram」と、正五角形を描く関数「pentagon」を定義します。
 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
# coding:shift-jis
import math

def pentagram(target,base):
    #原点から頂点までの長さ -> base
    target.radians()
    #角度は弧度法を使用。math.pi -> 180°
    line = (base + math.cos(math.pi/5)*base)/math.cos(math.pi/10)
    #line = (base + math.cos(36)*base) / math.cos(18) 
    target.penup()
    target.left(math.pi/2)
    # 90 -> math.pi/2
    target.fd(base)
    target.pendown()
    target.left(math.pi/10*9)
    # 180 - 18 -> math.pi / 10 * 9
    n = 0
    while n < 4:
        n += 1
        target.fd(line)
        target.left(math.pi/5*4)
        # 180 - 36 -> math.pi / 5 * 4
        # 同じ動作を4回繰り返す
    target.fd(line)
    target.left(math.pi/10*9)
    # 以下、原点に戻る
    target.penup()
    target.fd(base)
    target.left(math.pi/2)
    target.penup()

def pentagon(target,base):
    #原点から頂点までの長さ -> base
    target.radians()
    #角度は弧度法を使用。math.pi -> 180°
    line = 2*math.cos(math.pi/10*3)*base
    #line = 2 * cos(54) * base 
    target.penup()
    target.left(math.pi/2)
    # 90 -> math.pi/2
    target.fd(base)
    target.pendown()
    target.left(math.pi/10*7)
    # 180 - 54 -> 126 -> math.pi/10*7
    n = 0
    while n < 4:
        n += 1
        target.fd(line)
        target.left(math.pi/5*2)
        # 180 - 108 -> 72 -> math.pi / 5 * 2
        # 同じ動作を4回繰り返す
    target.fd(line)
    target.left(math.pi/10*7)
    # 以下、原点に戻る
    target.penup()
    target.fd(base)
    target.left(math.pi/2)
    target.penup()
syntax2html

対話モードで次のように打ち込んで試してみます。
1
2
3
4
5
6
7
8
9
import turtle
kame = turtle.Turtle()
import turtle.pent
turtle_pent.pentagon(kame,100)
turtle_pent.pentagram(kame,100)
turtle_pent.pentagon(kame,200)
turtle_pent.pentagram(kame,200)
turtle_pent.pentagon(kame,300)
turtle_pent.pentagram(kame,300)
syntax2html


こんな感じに図形が描けました。
なんだかプログラミングの勉強というよりも、数学の勉強みたいになってますね。



0 件のコメント:

コメントを投稿