アルゴリズム

[Python] matplotlibでC曲線を描画する方法

C曲線はフラクタルの一種で、再帰的に直角に折れ曲がる線を描画します。

Pythonのmatplotlibを使用してC曲線を描画するには、再帰関数を定義し、各再帰ステップで線分を回転・縮小して描画します。

基本的な手順として、初期の直線を描き、再帰的にその線を2つの短い線に分割し、90度回転させて描画します。

matplotlibのplot関数を使って各ステップの線分を描画し、show関数で結果を表示します。

C曲線とは何か

C曲線は、フラクタル幾何学の一種で、自己相似性を持つ図形です。

最初は単純な形状から始まり、再帰的に複雑な形状へと変化していきます。

C曲線は、特にコンピュータサイエンスや数学の分野で、再帰的なアルゴリズムやデータ構造の理解を深めるために利用されます。

C曲線は、特定の規則に従って線分を繰り返し描画することで生成され、視覚的に美しいパターンを形成します。

この特性から、アートやデザインの分野でも注目されています。

matplotlibの基本的な使い方

matplotlibとは

matplotlibは、Pythonでデータを可視化するための強力なライブラリです。

2Dおよび3Dのグラフや図を簡単に作成でき、科学技術計算やデータ分析の分野で広く使用されています。

特に、データのトレンドやパターンを視覚的に表現するのに適しています。

matplotlibは、柔軟性が高く、さまざまなスタイルやフォーマットでグラフをカスタマイズできる点が特徴です。

matplotlibのインストール方法

matplotlibは、Pythonのパッケージ管理ツールであるpipを使用して簡単にインストールできます。

以下のコマンドを実行することでインストールが可能です。

pip install matplotlib

基本的な描画の流れ

matplotlibを使用してグラフを描画する基本的な流れは以下の通りです。

ステップ説明
1必要なライブラリをインポートする
2データを準備する
3グラフを作成する
4グラフを表示する

plot関数の使い方

plot関数は、matplotlibで最も基本的な描画関数です。

x軸とy軸のデータを指定することで、折れ線グラフを描画します。

以下は、plot関数の基本的な使用例です。

import matplotlib.pyplot as plt
# データの準備
x = [1, 2, 3, 4, 5]
y = [2, 3, 5, 7, 11]
# 折れ線グラフの描画
plt.plot(x, y)
plt.title("サンプルグラフ")
plt.xlabel("x軸")
plt.ylabel("y軸")

show関数で描画を表示する

show関数は、作成したグラフを画面に表示するための関数です。

plot関数でグラフを描画した後にshow関数を呼び出すことで、実際にグラフを確認できます。

以下のように使用します。

# グラフを表示する
plt.show()

このように、matplotlibを使うことで簡単にデータを可視化することができます。

C曲線を描画するための準備

再帰関数の基本

再帰関数は、関数が自分自身を呼び出すことで問題を解決する手法です。

C曲線のようなフラクタル図形を生成する際に非常に有効です。

再帰関数は、基本ケース(終了条件)と再帰ケース(自己呼び出し)を持つ必要があります。

基本ケースが満たされると、再帰が終了し、結果が返されます。

以下は、再帰関数の基本的な構造の例です。

def recursive_function(n):
    if n == 0:  # 基本ケース
        return
    else:  # 再帰ケース
        recursive_function(n - 1)

C曲線の再帰的な生成方法

C曲線は、再帰的に線分を描画することで生成されます。

基本的なアイデアは、線分を4つの部分に分割し、それぞれを回転させて新しい線分を作成することです。

再帰的にこのプロセスを繰り返すことで、複雑な形状が形成されます。

以下は、C曲線を生成するための再帰関数の例です。

def draw_C_curve(ax, start, end, depth):
    if depth == 0:
        ax.plot([start[0], end[0]], [start[1], end[1]], color='black')
    else:
        # 中点を計算
        mid = [(start[0] + end[0]) / 2, (start[1] + end[1]) / 2]
        # 新しい点を計算
        new_point = [mid[0] - (end[1] - start[1]) / 4, mid[1] + (end[0] - start[0]) / 4]
        # 再帰的に描画
        draw_C_curve(ax, start, new_point, depth - 1)
        draw_C_curve(ax, new_point, end, depth - 1)

座標系の設定

C曲線を描画する際には、座標系を適切に設定することが重要です。

matplotlibでは、axis関数を使用して描画範囲を指定できます。

C曲線は通常、正方形の範囲内に収まるように描画されるため、x軸とy軸の範囲を同じに設定することが推奨されます。

以下は、座標系の設定の例です。

import matplotlib.pyplot as plt
# 座標系の設定
plt.axis('equal')  # x軸とy軸のスケールを同じにする
plt.xlim(-1, 1)   # x軸の範囲
plt.ylim(-1, 1)   # y軸の範囲

線分の回転と縮小の考え方

C曲線を描画する際には、線分を回転させたり縮小したりする必要があります。

具体的には、線分の中点を基準にして、特定の角度で回転させることで新しい線分を生成します。

また、線分の長さを縮小することで、再帰的に描画する際の形状を調整します。

回転行列を使用して、点の座標を変換することができます。

以下は、回転を行うための関数の例です。

import math
def rotate_point(point, angle):
    x, y = point
    rad = math.radians(angle)  # 角度をラジアンに変換
    new_x = x * math.cos(rad) - y * math.sin(rad)
    new_y = x * math.sin(rad) + y * math.cos(rad)
    return [new_x, new_y]

このように、C曲線を描画するための準備として、再帰関数の理解や座標系の設定、線分の回転と縮小の考え方が重要です。

これらの要素を組み合わせることで、C曲線を効果的に描画することができます。

C曲線を描画するPythonコード

C曲線の再帰関数の実装

C曲線を描画するための再帰関数は、線分を描画するための基本的なロジックを持っています。

以下のコードは、C曲線を生成するための再帰関数の実装例です。

def draw_C_curve(ax, start, end, depth):
    if depth == 0:
        ax.plot([start[0], end[0]], [start[1], end[1]], color='black')
    else:
        # 中点を計算
        mid = [(start[0] + end[0]) / 2, (start[1] + end[1]) / 2]
        # 新しい点を計算
        new_point = [mid[0] - (end[1] - start[1]) / 4, mid[1] + (end[0] - start[0]) / 4]
        # 再帰的に描画
        draw_C_curve(ax, start, new_point, depth - 1)
        draw_C_curve(ax, new_point, end, depth - 1)

matplotlibでの描画処理

matplotlibを使用してC曲線を描画するためには、まず図を作成し、座標系を設定した後、再帰関数を呼び出してC曲線を描画します。

以下は、matplotlibでの描画処理の例です。

import matplotlib.pyplot as plt
# C曲線を描画する関数
def plot_C_curve(depth):
    fig, ax = plt.subplots()
    plt.axis('equal')  # x軸とy軸のスケールを同じにする
    plt.xlim(-1, 1)   # x軸の範囲
    plt.ylim(-1, 1)   # y軸の範囲
    # C曲線の初期点
    start = [-0.5, 0]
    end = [0.5, 0]
    # C曲線を描画
    draw_C_curve(ax, start, end, depth)
    # グラフを表示
    plt.title(f"C曲線 (深さ: {depth})")
    plt.show()

描画結果の確認

上記のコードを実行すると、指定した深さに応じたC曲線が描画されます。

深さが大きくなるほど、曲線はより複雑になり、自己相似性が強調されます。

例えば、深さを3に設定すると、以下のような結果が得られます。

plot_C_curve(3)

再帰の深さを調整する方法

C曲線の再帰の深さは、描画の複雑さに直接影響します。

深さを増やすことで、より詳細なフラクタルパターンが生成されますが、計算量が増加し、描画に時間がかかることがあります。

深さを調整するには、plot_C_curve関数の引数を変更するだけです。

例えば、深さを5に設定する場合は、次のように呼び出します。

plot_C_curve(5)

完全なサンプルコード

以下は、C曲線を描画するための完全なサンプルコードです。

このコードを実行することで、C曲線を簡単に描画できます。

import matplotlib.pyplot as plt
def draw_C_curve(ax, start, end, depth):
    if depth == 0:
        ax.plot([start[0], end[0]], [start[1], end[1]], color='black')
    else:
        mid = [(start[0] + end[0]) / 2, (start[1] + end[1]) / 2]
        new_point = [mid[0] - (end[1] - start[1]) / 4, mid[1] + (end[0] - start[0]) / 4]
        draw_C_curve(ax, start, new_point, depth - 1)
        draw_C_curve(ax, new_point, end, depth - 1)
def plot_C_curve(depth):
    fig, ax = plt.subplots()
    plt.axis('equal')
    plt.xlim(-1, 1)
    plt.ylim(-1, 1)
    start = [-0.5, 0]
    end = [0.5, 0]
    draw_C_curve(ax, start, end, depth)
    plt.title(f"C曲線 (深さ: {depth})")
    plt.show()
# C曲線を描画
plot_C_curve(4)  # 深さを4に設定

このコードを実行することで、C曲線を視覚的に確認することができます。

深さを変更することで、異なるパターンを楽しむことができます。

C曲線のカスタマイズ

線の色や太さを変更する

C曲線を描画する際に、線の色や太さを変更することで、視覚的な印象を大きく変えることができます。

plot関数の引数にcolorlinewidthを指定することで、これらのプロパティを調整できます。

以下は、線の色を赤、太さを2に設定する例です。

def draw_C_curve(ax, start, end, depth):
    if depth == 0:
        ax.plot([start[0], end[0]], [start[1], end[1]], color='red', linewidth=2)  # 色と太さを指定
    else:
        mid = [(start[0] + end[0]) / 2, (start[1] + end[1]) / 2]
        new_point = [mid[0] - (end[1] - start[1]) / 4, mid[1] + (end[0] - start[0]) / 4]
        draw_C_curve(ax, start, new_point, depth - 1)
        draw_C_curve(ax, new_point, end, depth - 1)

背景色を変更する

背景色を変更することで、C曲線の見栄えをさらに良くすることができます。

matplotlibでは、set_facecolorメソッドを使用して、図の背景色を設定できます。

以下は、背景色を黒に設定する例です。

def plot_C_curve(depth):
    fig, ax = plt.subplots()
    ax.set_facecolor('black')  # 背景色を黒に設定
    plt.axis('equal')
    plt.xlim(-1, 1)
    plt.ylim(-1, 1)
    start = [-0.5, 0]
    end = [0.5, 0]
    draw_C_curve(ax, start, end, depth)
    plt.title(f"C曲線 (深さ: {depth})", color='white')  # タイトルの色も変更
    plt.show()

描画範囲を調整する

C曲線の描画範囲を調整することで、図形の見え方を変えることができます。

xlimylimを使用して、表示する範囲を設定します。

以下は、描画範囲を-2から2に設定する例です。

def plot_C_curve(depth):
    fig, ax = plt.subplots()
    ax.set_facecolor('black')
    plt.axis('equal')
    plt.xlim(-2, 2)  # x軸の範囲を変更
    plt.ylim(-2, 2)  # y軸の範囲を変更
    start = [-0.5, 0]
    end = [0.5, 0]
    draw_C_curve(ax, start, end, depth)
    plt.title(f"C曲線 (深さ: {depth})", color='white')
    plt.show()

アニメーションでC曲線を描く

C曲線をアニメーションで描くことで、動的な視覚効果を楽しむことができます。

matplotlibのFuncAnimationを使用して、再帰の深さを徐々に増やしながらC曲線を描画することができます。

以下は、アニメーションの実装例です。

from matplotlib.animation import FuncAnimation
def animate_C_curve(depth):
    fig, ax = plt.subplots()
    ax.set_facecolor('black')
    plt.axis('equal')
    plt.xlim(-1, 1)
    plt.ylim(-1, 1)
    start = [-0.5, 0]
    end = [0.5, 0]
    def update(frame):
        ax.clear()  # 前のフレームをクリア
        ax.set_facecolor('black')
        plt.axis('equal')
        plt.xlim(-1, 1)
        plt.ylim(-1, 1)
        draw_C_curve(ax, start, end, frame)  # 現在のフレームの深さで描画
        plt.title(f"C曲線 (深さ: {frame})", color='white')
    ani = FuncAnimation(fig, update, frames=range(depth + 1), repeat=False)
    plt.show()
# アニメーションを実行
animate_C_curve(5)  # 深さを5に設定

このように、C曲線のカスタマイズを行うことで、視覚的に魅力的な図形を作成することができます。

色や背景、描画範囲を調整することで、独自のスタイルを表現し、アニメーションを加えることで動的な要素を楽しむことができます。

応用例:他のフラクタル図形の描画

ヒルベルト曲線の描画

ヒルベルト曲線は、空間を埋めるフラクタルの一種で、再帰的に描画される特性を持っています。

ヒルベルト曲線は、特定のパターンに従って線を描くことで生成されます。

以下は、ヒルベルト曲線を描画するためのPythonコードの例です。

import turtle

def draw_Hilbert_curve(t, order, size, angle=90):
    if order == 0:
        return
    t.right(angle)
    draw_Hilbert_curve(t, order - 1, size, -angle)
    t.forward(size)
    t.left(angle)
    draw_Hilbert_curve(t, order - 1, size, angle)
    t.forward(size)
    draw_Hilbert_curve(t, order - 1, size, angle)
    t.left(angle)
    t.forward(size)
    draw_Hilbert_curve(t, order - 1, size, -angle)
    t.right(angle)

# ヒルベルト曲線を描画する関数
def plot_Hilbert_curve(order):
    screen = turtle.Screen()
    screen.setup(width=600, height=600)
    t = turtle.Turtle()
    t.speed(0)  # 最大速度
    t.penup()
    t.goto(-200, 200)  # 初期位置を設定
    t.pendown()
    size = 400 / (2**order - 1)  # サイズを調整
    draw_Hilbert_curve(t, order, size)
    screen.mainloop()

# ヒルベルト曲線を描画
plot_Hilbert_curve(4)  # オーダーを4に設定

コッホ曲線の描画

コッホ曲線は、最も有名なフラクタルの一つで、三角形の辺を分割して新しい三角形を作成することで生成されます。

以下は、コッホ曲線を描画するためのPythonコードの例です。

import math
import matplotlib.pyplot as plt
import japanize_matplotlib

def draw_Koch_curve(ax, start, end, depth):
    if depth == 0:
        ax.plot([start[0], end[0]], [start[1], end[1]], color='black')
    else:
        # 中点を計算
        mid1 = [(2 * start[0] + end[0]) / 3, (2 * start[1] + end[1]) / 3]
        mid2 = [(start[0] + 2 * end[0]) / 3, (start[1] + 2 * end[1]) / 3]
        
        # 頂点を計算
        dx = mid2[0] - mid1[0]
        dy = mid2[1] - mid1[1]
        length = math.sqrt(dx**2 + dy**2)
        angle = math.atan2(dy, dx) - math.pi / 3  # 60度を引く
        peak = [mid1[0] + length * math.cos(angle), mid1[1] + length * math.sin(angle)]
        
        # 再帰的に描画
        draw_Koch_curve(ax, start, mid1, depth - 1)
        draw_Koch_curve(ax, mid1, peak, depth - 1)
        draw_Koch_curve(ax, peak, mid2, depth - 1)
        draw_Koch_curve(ax, mid2, end, depth - 1)

# コッホ曲線を描画する関数
def plot_Koch_curve(depth):
    fig, ax = plt.subplots()
    ax.set_aspect('equal')
    ax.set_xlim(-1, 1)
    ax.set_ylim(-0.5, 0.5)
    ax.axis('off')
    start = [-1, 0]
    end = [1, 0]
    draw_Koch_curve(ax, start, end, depth)
    plt.title(f"コッホ曲線 (深さ: {depth})")
    plt.show()

# コッホ曲線を描画
plot_Koch_curve(4)  # 深さを4に設定

ドラゴン曲線の描画

ドラゴン曲線は、自己相似性を持つフラクタルで、特定のルールに従って折り返しながら描画されます。

以下は、ドラゴン曲線を描画するためのPythonコードの例です。

import math
import matplotlib.pyplot as plt
import japanize_matplotlib

def draw_Dragon_curve(ax, start, end, depth, turn_right=True):
    if depth == 0:
        ax.plot([start[0], end[0]], [start[1], end[1]], color='black')
    else:
        # 中点を計算
        mid = [(start[0] + end[0]) / 2, (start[1] + end[1]) / 2]
        
        # 90度回転させた点を計算
        if turn_right:
            new_point = [mid[0] - (end[1] - start[1]) / 2, mid[1] + (end[0] - start[0]) / 2]
        else:
            new_point = [mid[0] + (end[1] - start[1]) / 2, mid[1] - (end[0] - start[0]) / 2]
        
        # 再帰的に描画
        draw_Dragon_curve(ax, start, new_point, depth - 1, True)
        draw_Dragon_curve(ax, new_point, end, depth - 1, False)

# ドラゴン曲線を描画する関数
def plot_Dragon_curve(depth):
    fig, ax = plt.subplots()
    ax.set_aspect('equal')
    ax.set_xlim(-1, 1)
    ax.set_ylim(-1, 1)
    ax.axis('off')
    start = [-0.5, 0]
    end = [0.5, 0]
    draw_Dragon_curve(ax, start, end, depth)
    plt.title(f"ドラゴン曲線 (深さ: {depth})")
    plt.show()

# ドラゴン曲線を描画
plot_Dragon_curve(10)  # 深さを10に設定

これらのフラクタル図形は、C曲線と同様に再帰的な手法を用いて描画されます。

各フラクタルには独自の特性があり、視覚的に魅力的なパターンを生成します。

これらのコードを実行することで、さまざまなフラクタル図形を楽しむことができます。

まとめ

この記事では、C曲線の描画方法やそのカスタマイズ、さらには他のフラクタル図形の描画について詳しく解説しました。

C曲線を描くための基本的な手法から、ヒルベルト曲線やコッホ曲線、ドラゴン曲線といった他のフラクタル図形の実装方法まで、幅広く取り上げています。

これを機に、Pythonを使ったフラクタル図形の描画に挑戦してみてはいかがでしょうか。

新たな視点でプログラミングを楽しむきっかけになるかもしれません。

関連記事

Back to top button
目次へ