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
40 visitas
perguntada Jul 5, 2018 em Ciência da Computação por Edmar Rocha Pereira (21 pontos)  
editado Jul 6, 2018 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, 2018 por Edmar Rocha Pereira (21 pontos)  
editado Jul 6, 2018 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.

...