SE_BOKUのまとめノート的ブログ

SE_BOKUが知ってること・勉強したこと・考えたことetc

Pythonでグラフィックス:計算で花びらを描く(花びら曲線)

f:id:arakan_no_boku:20210912183619p:plain

目次

Pythonでグラフィックス:計算で花びらを描く(花びら曲線)

Pythonで「花びら曲線」を実装してみました。

計算で花びらが描ける、とても面白い関数です。

花びらを描くのに使う計算式は以下です。

f:id:arakan_no_boku:20210629002210p:plain

上記の計算式でもとめた「r」を使ってX座標とY座標を以下のように計算します。

f:id:arakan_no_boku:20210629233153p:plain

これをプログラムにあてはめると、花びらが描けます。

 

クラスのソースコードです

花びら関数の実装クラスです。

matplotlibのグラフ機能を使って、グラフィックを描きます。

計算にはNumpyとrandomを使ってます。

 

class_graphics.py

from matplotlib import pyplot as plt
import numpy as np
import random


class FlowerCurve():

    def __init__(self):
        self.__tx = []
        self.__ty = []
        self.__title = "花びら関数で花びらを描く"

    def __draw(self, a, b, n, k1, k2):
        k = 0
        if(int(b % 2.0) == 0):
            k = 1
        else:
            k = 2
        for ang in np.arange(0.0, 180.0 * k * b + 1.0, 1.0):
            s = ang * (np.pi / 180.0)
            r = ((1.0 - k1) + k1 * np.fabs(np.sin(a / b * s))) * \
                ((1.0 - k2) + k2 * np.fabs(np.sin(n * a / b * s)))
            self.__tx.append(100.0 * r * np.cos(s))
            self.__ty.append((100.0 * r * np.sin(s)) * -1.0)
        return self.__tx, self.__ty

    def draw(self, a=5.0, b=2.0, n=2.0, k1=0.7, k2=0.3):
        x, y = self.__draw(a, b, n, k1, k2)
        plt.plot(x, y)
        plt.title(self.__title)
        plt.show()

ソースの補足説明は特にありません。
計算式をほぼそのまま実装しているだけです

 

実行時に指定可能なパラメータの説明

実行時に指定可能なパラメータは5つです。

パラメータに対するエラーチェックはさぼってます(笑)。

a 花びらの枚数の基本数です。3.0以上で適当に。
b 基本、2.0固定です。1.0にすると「2×a」が花びらの枚数となります。bが3.0以上になると、どんどん予測できない形になっていきます。
n 1枚の花びらのなかにある突起の数です。1.0以上で適当に。
k1 花びらと花びらの間の切れ込みの深さです。値が大きいと、切れ込みが深くなりますが、0.1~0.9の範囲でないとどうなるかわかりません。
k2 花びら1枚の中での突起と突起の間の切れ込みの深さです。値が大きいと切れ込みが深くなります。0.1~0.9の範囲でないとどうなるかわかりません。

これらのパラメータの値を変更していくと、花びらの形が変化します。

 

実行結果

デフォルトで実行します。

from class_graphics import FlowerCurve

FlowerCurve().draw()

そうするとこんな花びらになります。

f:id:arakan_no_boku:20210918232417p:plain

 

花びらの数を30枚にしてみます。

FlowerCurve().draw(a=30)

するとこうなります。

f:id:arakan_no_boku:20210918234428p:plain

こんな感じでパラメータを変化させながら、どんな花びらになるかを試してみると面白いと思います。

ではでは。