【Turtle】菱形、台形(平行四辺形)、星型、葉っぱ型の描き方[Python]

  • URLをコピーしました!
目次

Turtle

前回、PythonのグラフィックスライブラリTurtleで長方形、正多角形、円の描き方を紹介しました。

今回は菱形、台形(平行四辺形)、星型、葉っぱ型の描き方を紹介します。

それでは始めていきましょう。

菱形

菱形は辺の長さは全て同じ、ある2辺が成す角をαとすると、向かい合う角もα、その他2つの角は180°-αとなる図形です。

import turtle

def diamond(a, alpha, clockwise=True):
    if clockwise == True:
        t.left(alpha/2)
        t.forward(a)
        t.right(alpha)
        t.forward(a)
        t.right(180-alpha)
        t.forward(a)
        t.right(alpha)
        t.forward(a)
        t.right(180-alpha)
    elif clockwise == False:
        t.left(180-alpha)
        t.forward(a)
        t.left(alpha)
        t.forward(a)
        t.left(180-alpha)
        t.forward(a)
        t.left(alpha)
        t.forward(a)
        t.right(alpha/2)

if __name__ == "__main__":
    t = turtle.Turtle()
    
    diamond(100, 30, True)
    
    t.pencolor("Red")
    diamond(100, 30, False)
    
    turtle.done()

台形(平行四辺形)

台形は2辺が並行な四角形です。

そこで並行な2辺の長さ(aとc)、その間の1辺の長さ(b)、そして辺aと辺bで成す角αで示すことができます。

import turtle

def trapezoid(a, b, c, alpha, clockwise=True):
    pos = t.position()
    if clockwise == True:
        t.forward(a)
        t.right(alpha)
        t.forward(b)
        t.right(180-alpha)
        t.forward(c)
        t.setposition(pos)
        t.right(180)
    elif clockwise == False:
        t.left(180)
        t.forward(a)
        t.left(alpha)
        t.forward(b)
        t.left(180-alpha)
        t.forward(c)
        t.setposition(pos)
        t.left(180)

if __name__ == "__main__":
    t = turtle.Turtle()
    
    trapezoid(100, 50, 150, 45, True)
    
    t.pencolor("Red")
    trapezoid(200, 100, 150, 75, False)
    
    turtle.done()

また台形でaとcの長さを同じにすると平行四辺形になります。

import turtle

def trapezoid(a, b, c, alpha, clockwise=True):
    pos = t.position()
    if clockwise == True:
        t.forward(a)
        t.right(alpha)
        t.forward(b)
        t.right(180-alpha)
        t.forward(c)
        t.setposition(pos)
        t.right(180)
    elif clockwise == False:
        t.left(180)
        t.forward(a)
        t.left(alpha)
        t.forward(b)
        t.left(180-alpha)
        t.forward(c)
        t.setposition(pos)
        t.left(180)

if __name__ == "__main__":
    t = turtle.Turtle()
    
    trapezoid(100, 50, 100, 45, True)
    
    t.pencolor("Red")
    trapezoid(200, 75, 200, 45, False)
    
    turtle.done()

星型

星型は線が交差するものとしないものの2つを描くことができます。

交差する場合は線の長さを「l」として、一つの線を描く毎に144°回転させることで描くことができます。

import turtle

def star_cross(l, clockwise=True):
    pos = t.position()
    t.right(90)
    if clockwise == True:
        t.left(18)
        for _ in range(5):
            t.forward(l)
            t.right(144)
        t.left(72)

    elif clockwise == False:
        t.right(18)
        for _ in range(5):
            t.forward(l)
            t.left(144)
        t.right(72)

if __name__ == "__main__":
    t = turtle.Turtle()
    
    star_cross(100, True)
    
    t.pencolor("Red")
    star_cross(100, False)
    
    turtle.done()

交差しない星型の場合は、辺の長さを「l」として、星の頂点は144°、その他の角は逆方向に72°回転させることで描くことができます。

import turtle

def star(l, clockwise=True):
    pos = t.position()
    t.right(90)
    if clockwise == True:
        t.left(18)
        for i in range(10):
            t.forward(l)
            if i % 2 == 0:
                t.left(72)
            else:
                t.right(144)
        t.left(72)

    elif clockwise == False:
        t.right(18)
        for i in range(10):
            t.forward(l)
            if i % 2 == 0:
                t.right(72)
            else:
                t.left(144)
        t.right(72)

if __name__ == "__main__":
    t = turtle.Turtle()
    
    star(100, True)
    
    t.pencolor("Red")
    star(100, False)
    
    turtle.done()

葉っぱ型

葉っぱ型は、円を描く要領で円弧を描き、頂点で180°-描いた角度を回転させ、再度同じ長さの円弧を描くことで描くことができます。

import turtle

def leaf(l, step, angle, clockwise=True):
    if clockwise == True:
        t.left(90)
        for _ in range(step):
            t.forward(l)
            t.right(angle)
        t.right(180-step*angle)
        for _ in range(step):
            t.forward(l)
            t.right(angle)
        t.right(270-step*angle)

    elif clockwise == False:
        t.left(90)
        for _ in range(step):
            t.forward(l)
            t.left(angle)
        t.left(180-step*angle)
        for _ in range(step):
            t.forward(l)
            t.left(angle)
        t.left(90-step*angle)

if __name__ == "__main__":
    t = turtle.Turtle()
    
    leaf(10, 20, 5, True)
    
    t.pencolor("Red")
    leaf(50, 10, 7, False)
    
    turtle.done()

だいぶ複雑な図形を描くことができるようになりました。

次回は再帰というテクニックを使って木を描いてみましょう。

ではでは今回はこんな感じで。

よかったらシェアしてね!
  • URLをコピーしました!

コメント

コメントする

目次