LoginSignup
1
0

昔模様を作るプログラムを作った話

Posted at

※結構昔に作ったプログラムで下手なのでご容赦ください。

フラワーオブライフ

ある日(3年以上前)にYouTubeで面白い模様を見たのです。
紹介として「黄金比と円周率を掛け合わせた幾何学模様、それがフラワーオブライフ」と都市伝説系YouTubeで見て、その図形は神社の狛犬とか他世界中に使われているらしく、最近だと日〇レの夜11時のニュースのOPで見れます。

プログラム

円が見た感じ円の中心から正六角形の頂点に新しく中心を作り円を作るという感じの図形になっています。

import numpy as np
import matplotlib.pyplot as plt

def en(theta, cx, cy):
    x = np.array([])
    y = np.array([])
    for i in range(len(cx)):
        x = np.append(x, np.cos(theta)+cx[i])
        y = np.append(y, np.sin(theta)+cy[i])
        line = np.arange(0, 360.1, 0.1)
        plt.plot(np.cos(np.pi*line/180)+cx[i],np.sin(np.pi*line/180)+cy[i],color="#000000")#,color="#c1ab05")
    return x, y


kaku = np.array([0, 60, 120, 180, 240, 300, 360])
thet = np.pi * kaku / 180
x, y = en(thet, [0], [0])
x2 = np.array(y)
y2 = np.array(x)
for i in range(4):
    x, y = en(thet, x, y)
plt.savefig("FlowerofLife")
plt.show()

このプログラムを実行すると以下のような図形が出力されます。
image.png
何とも言えない図形です。

麻の葉模様

某アニメを見ていて(第一クールで見るのやめたけど)美しい模様でなおかつフラワーオブライフと似ていると思った模様だと思って作ったものがあります。

プログラム

今度のプログラムは角度計算以外に辺の長さは正弦定理を使って長さを考えるなど色々と工夫して作りました。
あとキャラクターの色に合わせて背景も変えています。

import matplotlib.pyplot as plt
import numpy as np

def neduko(cnt, ctr):
    if cnt == 0:
        return 0
    else:
        cnt = cnt - 1
        tmp = []
        for i in range(6):
            for j in range(len(ctr)):
                tmp.append([ctr[j][0]+np.cos(60*i*np.pi/180), ctr[j][1]+np.sin(60*i*np.pi/180)])
            plt.plot([ctr[:, 0],ctr[:, 0]+np.cos(60*i*np.pi/180)/2], [ctr[:, 1],ctr[:, 1]+np.sin(60*i*np.pi/180)/2], color="#000000")
            plt.plot([ctr[:, 0],ctr[:, 0]+np.cos((60*i+30)*np.pi/180)/np.sqrt(3)], [ctr[:, 1],ctr[:, 1]+np.sin((60*i+30)*np.pi/180)/np.sqrt(3)], color="#000000")
        neduko(cnt, np.array(tmp))

ax = plt.axes()
ax.set_facecolor("#FDE8E9")
neduko(cnt=4, ctr=np.array([[0, 0]]))
plt.show()

実行すると以下のような図形が出力されます。
image.png

フラワーオブライフと違ってこっちは再帰アルゴリズムをちゃんと使っているので少し見やすくなったかなと。

まとめ

図形を作るの難しい。

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0