"BOKU"のITな日常

BOKUが勉強したり、考えたことを頭の整理を兼ねてまとめてます。

Pythonでグラフィックス:花びら曲線を使って花びらを描く(花びら曲線)クラス。

f:id:arakan_no_boku:20210912183619p:plain

目次

花びら曲線で花びらを描く

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

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

デフォルトで描くとこんな図が描けます。

f:id:arakan_no_boku:20210918232417p:plain

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

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

グラフの機能を使って図形を描くので、matplotlibが必要です。

タイトルを日本語にしているので日本語フォントの設定も必要です。

arakan-pgm-ai.hatenablog.com

あと、計算に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

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

ではでは。