Primeira vez aqui? Seja bem vindo e cheque o FAQ!
x

Como replicar estruturas de árvores com ramificações usando os conhecidos L-Systems (Lindenmayer-Systems)?

0 votos
21 visitas
perguntada Jul 5 em Ciência da Computação por Edmar Rocha Pereira (21 pontos)  
editado Jul 6 por Edmar Rocha Pereira

Figura 2.8 do livro The Algorithmic Beauty of Plants - Przemyslaw Prusinkiewicz and Aristid Lindenmayer (1991) [PL1991].

A imagem será apresentada aqui.

Compartilhe

1 Resposta

0 votos
respondida Jul 5 por Edmar Rocha Pereira (21 pontos)  
editado Jul 6 por Edmar Rocha Pereira

Stochastic Plant

No livro “The Algorithmic Beauty of Plants”, de Przemyslaw Prusinkiewicz e Aristid Lindenmayer, mostra-se que a estrutura de uma árvore pode ser representada por meio dos chamados Context-Free Lindenmayer Systems, ou simplesmente Sistemas-OL.

Os L-systems permitem a definição de formas complexas através do uso de iteração. Eles usam uma linguagem matemática na qual uma cadeia inicial de caracteres é comparada com regras que são avaliadas repetidamente, e os resultados são usados para gerar geometria. O resultado de cada avaliação se torna a base para a próxima iteração da geometria, dando a ilusão de crescimento.

A estrutura de árvores com ramificações é uma forma de escrever L-systems para demonstrar e experimentar as diferentes possibilidades de se gerar uma árvore com várias ramificações.

\[\]

# Código L-systems indentado:

lsystem Tree extends Branches {

  let d1 = 94.74;  // divergence angle 1
  let d2 = 132.63;  // divergence angle 2
  let angle = 18.95;  // branching angle
  let l = 1.109;  // length increase rate
  let w = 1.732;  // width increase rate

  set symbols axiom = /(45) F(200, 1) A;
  set iterations = 6;
  set initialAngle = 90;
  set tropismVector = {0, -1, 0};
  set tropismCoefficient = 0.22;
  set scale = 0.7;

  interpret F as DrawForward;
  interpret f as MoveForward;
  interpret & as Pitch(-angle);
  interpret / as Roll;

  rewrite A to
    F(50, w) [ C & F(50, 1) A ] /(d1)
    [ C & F(50, 1) A ] /(d2) [ C & F(50, 1) A ];
  rewrite F(length, width) to F(length * l, width * w);
  rewrite f(length) to F(length * w);
  rewrite C to f(-1) &(-90) f(1) &(90);  // correction

}

process all with SvgRenderer;

Figura replicada do código acima rodado no Processador L-systems.
A imagem será apresentada aqui.

\[\]

# Código L-systems indentado:

lsystem Tree extends Branches {

  let d1 = 94.74;  // divergence angle 1
  let d2 = 132.63;  // divergence angle 2
  let angle = 18.95;  // branching angle
  let l = 1.109;  // length increase rate
  let w = 1.732;  // width increase rate

  set symbols axiom = /(45) F(200, 1) A;
  set iterations = 8;
  set initialAngle = 90;
  set tropismVector = {0, -1, 0};
  set tropismCoefficient = 0.14;
  set scale = 0.7;

  interpret F as DrawForward;
  interpret f as MoveForward;
  interpret & as Pitch(-angle);
  interpret / as Roll;

  rewrite A to
    F(50, w) [ C & F(50, 1) A ] /(d1)
    [ C & F(50, 1) A ] /(d2) [ C & F(50, 1) A ];
  rewrite F(length, width) to F(length * l, width * w);
  rewrite f(length) to F(length * w);
  rewrite C to f(-1) &(-90) f(1) &(90);  // correction

}

process all with SvgRenderer;

Figura replicada do código acima rodado no Processador L-systems.
A imagem será apresentada aqui.

\[\]

\[\]

# Código L-systems indentado:

lsystem Tree extends Branches {

  let d1 = 94.74;  // divergence angle 1
  let d2 = 132.63;  // divergence angle 2
  let angle = 18.95;  // branching angle
  let l = 1.109;  // length increase rate
  let w = 1.732;  // width increase rate

  set symbols axiom = /(45) F(100, 1) A;
  set iterations = 8;
  set initialAngle = 90;
  set tropismVector = {0, -1, 0};
  set tropismCoefficient = 0.23;
  set scale = 0.7;

  interpret F as DrawForward;
  interpret f as MoveForward;
  interpret & as Pitch(-angle);
  interpret / as Roll;

  rewrite A to
    F(50, w) [ C & F(50, 1) A ] /(d1)
    [ C & F(50, 1) A ] /(d2) [ C & F(50, 1) A ];
  rewrite F(length, width) to F(length * l, width * w);
  rewrite f(length) to F(length * w);
  rewrite C to f(-1) &(-90) f(1) &(90);  // correction

}

process all with SvgRenderer;

Figura replicada do código acima rodado no Processador L-systems.
A imagem será apresentada aqui.

\[\]
# Código L-systems indentado:

lsystem Tree extends Branches {

  let d1 = 180;  // divergence angle 1
  let d2 = 252;  // divergence angle 2
  let angle = 36;  // branching angle
  let l = 1.070;  // length increase rate
  let w = 1.732;  // width increase rate

  set symbols axiom = /(45) F(100, 1) A;
  set iterations = 6;
  set initialAngle = 90;
  set tropismVector = {-0.61, 0.77, -0.19};
  set tropismCoefficient = 0.40;
  set scale = 0.7;

  interpret F as DrawForward;
  interpret f as MoveForward;
  interpret & as Pitch(-angle);
  interpret / as Roll;

  rewrite A to
    F(50, w) [ C & F(50, 1) A ] /(d1)
    [ C & F(50, 1) A ] /(d2) [ C & F(50, 1) A ];
  rewrite F(length, width) to F(length * l, width * w);
  rewrite f(length) to F(length * w);
  rewrite C to f(-1) &(-90) f(1) &(90);  // correction

}

process all with SvgRenderer;

Figura replicada do código acima rodado no Processador L-systems.

A imagem será apresentada aqui.

...