日本で一番有名なマークである
安産祈願マークを
プログラムで作ってみましょう!!!
動画はこちら
https://www.youtube.com/embed/5We7M65se3c
さて
作り方は
numpyとmatplotlibを用いて
マークを描いていきます。
widgetも用いて
うねうね変形できるようにもします。
ソースはこちら
import numpy as np
import matplotlib.pyplot as plt
from ipywidgets import interact, FloatSlider, IntSlider,Select
%matplotlib inline
r = IntSlider(min=1, max=8, step=1, value=5)
t = FloatSlider(min=1.0, max=1.5, step=0.1, value=1.0)
c = Select(options=['black', 'red', 'blue','green'],
value='black',description='coler : ',disabled=False)
@interact(r=r,t=t,c=c)
def plot_man(r,t,c):
plt.figure(figsize=(10,9))
plt.axes().set_aspect('equal', 'datalim')
# circle 1
x = [np.sin(np.radians(_x))*r for _x in np.linspace(-180,180,721)]
y = [np.cos(np.radians(_y))*r*t for _y in np.linspace(-180,180,721)]
plt.plot(x, y, c)
# circle 2
x2 = [i*0.7 for i in x]
y2 = [i*0.7 for i in y]
plt.plot(x2, y2, c)
# line
x3 = [0,0]
y3 = [min(y)*1.25,max(y)*1.25]
plt.plot(x3, y3, c)
# lines
x4 = [i*1.2 for i in x]
y4 = [i*1.2 for i in y]
for i in range(16):
x5 = [x[i*45],x4[i*45]]
y5 = [y[i*45],y4[i*45]]
plt.plot(x5, y5, c)
plt.xlim([-20,20])
plt.ylim([-20,20])
plt.show()
jupyter notebookで
動かすことができます。
結果はこうなります。
rで円の半径を変更
tで楕円の倍率を変更
colorで色を変更です。
楕円は
円の縦横方向を n 倍にすることで実現しています。
なので
縦方向であれば
xの値はそのままに
yの値の倍率を変えてあげると
縦方向の楕円になります。
今回のやり方では
まず半径を決めて円を用意します。
内側の円は1つめの円の倍率を変えただけです。
縦棒はxの値が0でyの値を変化させることで
実現させ、外側の棒たちは
大きな円を用意し
1つめの円から外側の円に向かう値で
描いています。
一応16本になるみたいなので
22.5度の角度になるような計算で
座標を求めています。
全部足すと
安産マークになります!!!!!!!
せっかくなので
GIFも作ってみましょう
matplotlibではアニメーション機能で
mp4やgifも作れますが
環境によっては動かないこともあり
今回は
画像をたくさん生成して
無理くりGIFに落とし込みます。
ソースはこちら
from PIL import Image, ImageDraw, ImageFont
import numpy as np
import matplotlib.pyplot as plt
from ipywidgets import interact, FloatSlider, IntSlider,Select
import os
data_dir = 'anzan_data/'
if not os.path.exists(data_dir):
os.makedirs(data_dir)
for a in range(30):
plt.figure(figsize=(3,3))
plt.axes().set_aspect('equal', 'datalim')
plt.tick_params(labelbottom=False,
labelleft=False,
labelright=False,
labeltop=False)
plt.tick_params(bottom=False,
left=False,
right=False,
top=False)
plt.xlim([-20,20])
plt.ylim([-20,20])
c ='black'
n = (np.abs(np.sin(a))+1)
# circle 1
x = [np.sin(np.radians(_x))*8 for _x in np.linspace(-180,180,721)]
y = [np.cos(np.radians(_y))*8*n for _y in np.linspace(-180,180,721)]
plt.plot(x, y, c)
# circle 2
x2 = [i*0.7 for i in x]
y2 = [i*0.7 for i in y]
plt.plot(x2, y2, c)
# line
x3 = [0,0]
y3 = [min(y)*1.25,max(y)*1.25]
plt.plot(x3, y3, c)
# lines
x4 = [i*1.2 for i in x]
y4 = [i*1.2 for i in y]
for i in range(16):
x5 = [x[i*45],x4[i*45]]
y5 = [y[i*45],y4[i*45]]
plt.plot(x5, y5, c)
file_name = data_dir + 'tmp_{0:02}.png'.format(a)
plt.savefig(file_name)
images = []
for a in range(30):
file_name = data_dir + 'tmp_{0:02}.png'.format(a)
img = Image.open(file_name)
images.append(img)
gif_name = 'anzan.gif'
images[0].save(gif_name,save_all=True, append_images=images[1:], optimize=False, duration=2, loop=0)
jupyter notebookで実行すると
安産祈願マークがnotebookの在るディレクトリに
作成されます。
はい
ビロンビロンして
気持ちのいいGIFが生成されます。
是非興味のある方は
試してみてください。
それでは