長さ \(l\) の線分( \(0\) 次Koch曲線)を与える.
この線分を \(3\) 等分し,中央の長さ \(\dfrac{l}{3}\) の線分を,それを底辺とする正三角形の残りの \(2\) 辺で置き換える. すると,長さが \(\dfrac{l}{3}\) である \(4\) 本の線分からなる折れ線( \(1\) 次Koch曲線)ができる.
次に,\(1\) 次Koch曲線の \(4\) 本の線分それぞれを, \(1\) 次Koch曲線と同様の手順で作った折れ線で置き換えれば, \(4^2\) 本の線分からなる折れ線( \(2\) 次Koch曲線)ができる.
\(\vdots\)
この操作を,\(n\) 回繰り返して作られる\(4^n\) 本の線分からなる折れ線が \(n\) 次Koch曲線であり,\(n \to \infty\) とした極限によって得られる曲線が Koch曲線 である.
Koch曲線は,部分の中に全体を縮小した構造がそのまま観察されるFractal図形(自己相似図形)であり,いかなる微小部分の長さも無限大であり,いたるところ微分不可能である.
まず,\(n\) 次のKoch曲線を描く関数“Koch(n,x,y,t,l,j)”を定義する. これをもとに,正三角形の各辺をKoch曲線にするプログラミングを作り,この図形を \(n\) 次まで並べて出力する関数“TriangleKoch(n)”を定義する.
################################################################################
# Hou to Use
# 正数nに対して,TriangleKoch(n)とすれば,
# 正三角形の角辺が0,1,2,...,n次のKoch曲線であるような図形が順に得られる.
# 新たに図を描くときは,plot.new()により,図を消去する.
################################################################################
Koch <- function(n,x,y,t,l){
# n:次数
# x,y:座標
# t:回転角
# l:長さ
# j:定義域調整
if(n > 0){
# Step0
n <- n-1
l <- l/3
# Step1
Koch(n,x,y,t,l)
# Step2
x <- x+l*cos(t)
y <- y+l*sin(t)
t <- t+pi/3
Koch(n,x,y,t,l)
# Step3
x <- x+l*cos(t)
y <- y+l*sin(t)
t <- t-2*pi/3
Koch(n,x,y,t,l)
# Step4
x <- x+l*cos(t)
y <- y+l*sin(t)
t <- t+pi/3
Koch(n,x,y,t,l)
}
else{
plot(
c(x,x+l*cos(t)), c(y,y+l*sin(t)),
type="l", # type="l":線のplot(点と点を結ぶ)
xlim=c(0,3), # 定義域はjに依存させる
ylim=c(-1,1),
ann=F, # 軸のラベルを表示しない
axes=F, # 軸を表示しない
asp=1 # 軸の比率は1
)
par(new=T) # 既存のグラフに重ね書き
}
}
TriangleKoch <- function(n){
r <- sqrt(3)
for(i in 0:2){ # i:三角形の周に沿ってKoch曲線を描く
t <- 2*i*pi/3
Koch(n,1+cos(-t),sin(-t),7*pi/6+2*t,r)
# x座標は図形の中心になる
}
}
ここでは,TriangleKoch(n)をいくつか出力しておこう.
TriangleKoch(0)
TriangleKoch(2)
TriangleKoch(4)
TriangleKoch(6)