L-시스템(L-system)은 1986년 린덴마이어(Lindenmayer)가 생태계의 성장 모형, 특히 나무의 분기 모형을 연구하는 목적으로 고안하였다. L-시스템은 세가지 요소 $(S,\, \omega,\, P)$로 이루어지는데, 이 시스템의 각 요소들에 대하여
- $S$는 시스템을 구성하는 문장들의 집합, (이를 다시 세분화 하여 매 단계마다 치환규칙에 의해 변하는 변수들의 집합과, 변하지 않는 상수들의 집합으로 나누기도 한다),
- $\omega$는 $S$의 문장들로 구성된 시스템의 초기 상태,
- $P$는 시스템의 현 단계에서 다음 단계로 변환시키는 치환 규칙
을 나타낸다. 예를 들어 어떤 L-시스템이 다음와 같은 규칙으로 생성된다고 하자.
\[ S = \{A,\, B\}, \quad \omega = A, \quad P = \{ (A \to ABA),\, (B \to BA)\} \]
그러면 각 단계별 시스템의 상태는 다음과 같다.
\begin{align*} 0 &: A \\ 1 &: ABA \\ 2 &: ABABAABA \\ 3 &: ABABAABABAABAABABAABA \\ 4 &: \cdots \end{align*}
이 L-시스템은 특히 프랙탈 구조를 그리는데 효과적인데, $S$의 각 문장들에 대하여 적당한 그림 규칙만 정의해 주면 (예를 들어 위의 예시에서 $A$는 '단위길이의 직선을 그리기', $B$는 '반시계 방향으로 $90^{\circ}$ 회전하기' 등으로 임의의 정의하면 된다), 시스템의 단계가 진행됨에 따라서 점차 복잡한 프랙탈 구조의 그림을 자동으로 얻을 수 있다.
아래 두 그림은 L-시스템을 이용하여 만든 시어핀스키 삼각형(Sierpinski triangle)과 시어핀스키 곡선(Sierpinski curve)이다.
시어핀스키 삼각형(Sierpinski triangle)
시어핀스키 삼각형을 그리는 L-시스템은 다음과 같이 주어진다.
\[ S = \{F,\, G,\, +,\, -\}, \quad \omega = F-G-G, \quad P = \{ (F \to F-G+F+G-F),\, (G \to GG)\} \]
이제 $F$와 $G$ 모두 '단위길이의 직선을 그리기'로 정의하고, $+$는 '시계 방향으로 $120^{\circ}$ 회전하기', $-$는 '반시계 방향으로 $120^{\circ}$ 회전하기'로 각각 정의해 주면, 아래의 시어핀스키 삼각형을 얻는다.
p5.js
코드 보기
시어핀스키 곡선(Sierpinski curve)
시어핀스키 곡선을 그리는 L-시스템은 다음과 같이 주어진다.
\[ S = \{F,\, G,\, +,\, -\}, \quad \omega = F, \quad P = \{ (F \to -G+F+G-),\, (G \to +F-G-F-) \} \]
이제 $F$와 $G$ 모두 '단위길이의 직선을 그리기'로 정의하고, $+$는 '시계 방향으로 $60^{\circ}$ 회전하기', $-$는 '반시계 방향으로 $60^{\circ}$ 회전하기'로 각각 정의해 주면, 아래의 시어핀스키 곡선을 얻는다.
p5.js
코드 보기
'Others > Processing' 카테고리의 다른 글
p5.js 연습 006. 프랙탈 스파이로그래프(fractal spirograph) (0) | 2017.07.14 |
---|---|
p5.js 연습 005. 에피사이클로이드(epicycloid) (0) | 2017.07.09 |
p5.js 연습 004. 스파이로그래프(Spirograph) (0) | 2017.07.07 |
p5.js 연습 002. 프랙탈 나무 (0) | 2017.07.05 |
p5.js 연습 001 (1) | 2017.07.04 |