【Turtle】円と塗りつぶしを使って複雑な図形を描く方法[Python]

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

Turtle

前回、PythonのグラフィックスライブラリTurtleで再帰を使った木の描き方を紹介しました。

今回は円と塗りつぶしを使って複雑な図形を描く方法を紹介します。

最終的にはこんな図形を描きます。

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

円を重ねる方法

まず先ほどの図形を描くには、まずは円を何個も重ねていきます。

つまりこんな感じです。

こんな図形を描くのは思ったよりも簡単で、円を描いて、角度をずらして、また円を描くということを繰り返すだけです。

ということでこんな感じ。

import turtle
import random

t = turtle.Turtle()

num_angle = random.randrange(12,37)
circle_size = random.randrange(50, 101)
angle_change = 360/num_angle

for _ in range(num_angle):
    t.right(angle_change)
    t.circle(circle_size)
    
turtle.done()

「num_angle」は角度を変える回数、「circle_size」は円のサイズ、「angle_change」は一つの円を描く毎に変える角度です。

あとはfor文を使って、角度を変えて、円を描くを繰り返すだけです。

複雑に重なり合った部分を塗り分ける方法

次に円が重なった部分を塗り分ける方法です。

ただ最初に紹介した図形を見てみると、単純に円毎に色を塗っているのではなく、色が塗ってある部分と塗ってない部分が交互になっていることがわかります。

それを一つずつ指定して塗り分ける…なんてことはする必要はありません。

こちらの記事で紹介した通り、囲まれた部分を塗りつぶすには「t.color(“ペンの色”, “塗りつぶしの色”)」で色を指定したのち、塗りつぶしを開始するところで「t.begin_fill()」を、終了するところで「t.end_fill()」を記載します。

この塗りつぶしのコマンドをどこに書くかによってその効果が変わります。

今回の場合は円を描き始める前に「t.begin_fill()」を、全ての円を描き終わった後で「t.end_fill()」とします。

つまりこんな感じ。

import turtle
import random

t = turtle.Turtle()

num_angle = random.randrange(12,37)
circle_size = random.randrange(10, 101)
angle_change = 360/num_angle

pensize = random.randrange(1, 11)
pencolor = (random.random(), random.random(), random.random())
fillcolor = (random.random(), random.random(), random.random())

t.color(pencolor, fillcolor)
t.begin_fill()
for _ in range(num_angle):
    t.right(angle_change)
    t.circle(circle_size)
t.end_fill()
    
turtle.done()

これで最初の図形を描くことができました。

番外編:複数回重ねてみる

円と塗りつぶしを使って作成した図形をさらに複数個重ねてみるとまた違った趣があります。

import turtle
import random

t = turtle.Turtle()

num_cycle = random.randrange(3,5)

for _ in range(num_cycle):
    num_angle = random.randrange(12,36)
    circle_size = random.randrange(10, 101)
    angle_change = 360/num_angle
    
    pensize = random.randrange(1, 11)
    pencolor = (random.random(), random.random(), random.random())
    fillcolor = (random.random(), random.random(), random.random())
    
    t.color(pencolor, fillcolor)
    t.begin_fill()
    for _ in range(num_angle):
        t.right(angle_change)
        t.circle(circle_size)
    t.end_fill()

turtle.done()

今回のプログラムでは円の個数や色などランダムにしてあるので、何度も実行して違いを楽しむのもいいかと思います。

次回は四角形を使って複雑な図形を描いてみましょう。

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

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

コメント

コメントする

目次