내가 말할 수있는 L-Systems 는 흥미로운 "유기적"결과를 얻기 위해 재귀 적으로 적용 할 수있는 일련의 문법과 같은 대체 규칙입니다.
식물은 L-Systems가 자주 사용되는 곳입니다. 그들은 많은 재귀 적 성장을 보입니다 (즉, 가지가 더 많은 가지로 나뉘어 짐). 간단한 예를 들어, L-System을 사용하여 생성 된 "롤리팝"트리를 보여 드리겠습니다.
variables : | o (these are the things that will grow)
start : o
| (this is what we start with)
rules : (o → o o) (these are the substitution rules that we apply
\ / one step at a time)
따라서 1 세대에서 우리는 시작했습니다.
o
|
2 세대에서는 각 규칙을 따르고 규칙에 따라 기존 부품을 대체합니다. 우리는 "공"을 "2 개의 막대기와 공"으로 대체합니다 :
o o
\ /
|
세대 3 :
o o o o
\| |/
\ /
|
곧 우리는 예쁜 (크 래피) 큰 나무를 가질 것입니다!
코드에서이 작업을 수행하려면 임의의 끝에 도달 할 때까지 동일한 부분에 규칙을 계속 적용하거나 재귀 적으로 (예 : DFS)이 작업을 수행하거나이 예제에서 수행 한 것처럼 반복적으로 (예 : BFS) 수행 할 수 있습니다. 모든 요소에 대해 하나의 규칙 "통과"를 수행하고 여러 단계를 반복합니다. 그건:
재귀 적으로 :
tree = start
grow(tree, start)
func grow(tree, part)
if this part of the tree is big enough
stop
if part is 'o'
replace part with 'o\/o'
grow(tree, the left 'o')
grow(tree, the right 'o')
반복적으로 :
tree = start
for a number of iterations
for each part in tree
if part is 'o':
replace with 'o\/o'
L-Systems의 많은 사용은 하위 부문을 사용하여 "성장"단계를 수행합니다. 즉, "성장"함에 따라 부품이 점점 작아지고, 더 큰 부품은 나뉘어집니다. 그렇지 않으면 성장 시스템이 자체적으로 겹치기 시작할 수 있습니다. 롤리팝 트리 예제에서 볼 수 있듯이 새 가지의 모양을 변경하여 두 가지 가지가 중간에 겹치지 않도록 마술로 보장했습니다. 세분화를 사용하여 도시의 예를 봅시다 :
variables: block_vertical block_horizontal road_vertical road_horizontal
start: block_vertical
rules: (block_vertical → block_horizontal road_vertical block_horizontal)
(block_horizontal → block_vertical road_horizontal block_vertical)
이것은 잠시 후에 의미가 있습니다.
1 세대
+--------------------+
| |
| |
| |
| V |
| |
| |
| |
+--------------------+
지루한 단일 수직 블록. (V는 세로를 나타냅니다.)
2 세대 : 수직 블록을 수평 블록으로 대체하고 중간에 수직 도로를 배치합니다.
+--------------------+
| r |
| r |
| r |
| H r H |
| r |
| r |
| r |
+--------------------+
R은 도로를 의미합니다! 나는 무작위로 간격을 두 었으며 PCG에서 지루한 정규 부품을 원하지 않습니다.
3 세대 : 수평 블록을 수평 도로로 분리 된 수직 블록으로 교체합니다. 기존 도로는 그대로 있습니다. 그들에게는 규칙이 없습니다.
+--------------------+
| V r |
| r |
|rrrrrrrr |
| r V |
| V r |
| rrrrrrrrrrrrr|
| r V |
+--------------------+
도로가 서로 어떻게 연결되어 있는지 확인하십시오. 이것을 충분히 반복하면 다음과 같은 결과가 나옵니다 ( 관련 답변을 찢어 버렸 습니다 ).
내가 다루지 않은 많은 세부 사항이 있으며,이 결과는 "분명히"생성 된 것처럼 보입니다. 실제 도시는 다소 다르게 보입니다. 그것이 PCG를 재미있게 만드는 이유입니다. 결과를 조정하고 개선하기 위해 할 수있는 일이 많이 있지만 L-Systems와 관련이 없으므로이 답변을 여기에 남겨 두겠습니다. 이것이 당신이 시작하는 데 도움이되기를 바랍니다.
*-문법과 PCG 식물과 같은 특정 유형에 직면했지만 L-Systems를 공식적으로 연구하지는 않았습니다. 정의 나 개념이 틀리면 수정 해주세요