def factorial(n):
if n == 1: #関数をwell-definedにするために重要な意味を持つ
return 1
else:
return n*factorial(n-1) #n-1に対して自分自身を呼び出す
print(factorial(5)) #定義した関数を呼び出して値を表示する
120
このような関数の再帰的定義は、以下に示すようにフラクタルの描画の際に有用です。
import numpy as np
import matplotlib.pyplot as plt
def draw_Koch(two_nodes,n): #2つの点からなる行列two_nodesと、残りの繰り返し回数nが引数
if n == 0: #残りの繰り返し回数が0なら線分を描画する
plt.plot(two_nodes[0,:],two_nodes[1,:],"b")
else: #それ以外なら線分を変形する
p0 = two_nodes[:,0]
p1 = two_nodes[:,1]
p2 = 2/3*p0+1/3*p1
p3 = 1/3*p0+2/3*p1
theta = 60/180*np.pi
A = np.array([[np.cos(theta),-np.sin(theta)],[np.sin(theta),np.cos(theta)]])
p4 = p2+A@(p3-p2)
draw_Koch(np.array([p0,p2]).T,n-1) #新たな各線分に対して、残りの繰り返し回数を1減らして自身を呼び出す
draw_Koch(np.array([p2,p4]).T,n-1)
draw_Koch(np.array([p4,p3]).T,n-1)
draw_Koch(np.array([p3,p1]).T,n-1)
draw_Koch(np.array([[0,0],[1,0]]).T,5)
plt.gca().set_aspect("equal")
plt.show()
線分を下の図のように変形する操作を繰り返すことによって得られるフラクタルを考え、これをツリー(tree)と呼ぶことにします。
※これは一般に知られているフラクタルではありませんが、木を表現するフラクタルはWeb検索でいくつも見つかるため、興味があれば調べてみてください。
関数の再帰的定義によってツリーを描画するコードは、次のようになります。
import numpy as np
import matplotlib.pyplot as plt
def draw_tree(two_nodes,n): #2つの点からなる行列two_nodesと、残りの繰り返し回数nが引数
if n == 0: #残りの繰り返し回数が0なら線分を描画する
plt.plot(two_nodes[0,:],two_nodes[1,:],"b")
else: #それ以外なら線分を変形する
p0 = two_nodes[:,0]
p1 = two_nodes[:,1]
p2 = 2/3*p0+1/3*p1
p3 = 1/3*p0+2/3*p1
theta = 60/180*np.pi
A = np.array([[np.cos(theta),-np.sin(theta)],[np.sin(theta),np.cos(theta)]]) #反時計回りの回転
B = np.array([[np.cos(-theta),-np.sin(-theta)],[np.sin(-theta),np.cos(-theta)]]) #時計回りの回転
p4 = p2+A@(p3-p2)
p5 = p3+B@(p1-p3)
draw_tree(np.array([p0,p2]).T,n-1) #新たな各線分に対して、残りの繰り返し回数を1減らして自身を呼び出す
draw_tree(np.array([p2,p3]).T,n-1)
draw_tree(np.array([p3,p1]).T,n-1)
draw_tree(np.array([p2,p4]).T,n-1)
draw_tree(np.array([p3,p5]).T,n-1)
draw_tree(np.array([[0,0],[0,1]]).T,3)
plt.gca().set_aspect("equal")
plt.show()
フラクタルやベジェ曲線などを用いて、家を含む風景の図を描画してください。
家は第11回レポート課題で作成したものを使用するとよいです。もちろん、さらに手を加えても構いません。
フラクタルを必ず使用してください。授業で扱ったフラクタルそのままではなく、自分で調べたもの・考えたもの・改造したものが望ましいです。
授業ホームページの「昨年度の学生の作品」を参考にするとよいです。
図の大きさを変更したい場合は、plt.figure(figsize=(横幅,高さ))
をplot
より前に書いてください。デフォルトの値は $(6.4,4.8)$ です。
#第15回レポート課題のコード
今回のレポート課題の提出フォームには、「来年度の授業ホームページでの作品の公開を承諾するか否か」の質問項目があります。
皆さんが昨年度の学生の作品を参考にしているように、皆さんの作品の中から優秀なものを来年度の学生が参考にできるようにしたいと考えているためです。作品の公開は、基本的に作品の画像と氏名を掲載する形になります。
三つの選択肢「承諾する」「匿名なら承諾する」「承諾しない」の中から、いずれかを自由に選んでください。