Estruturas de Dados dos L-Systems

Um L-System é composto pelo seguinte conjunto de estruturas de dados:


Cadeia de módulos

A principal decisão no momento de projetar as classes que implementam L-Systems foi escolher a melhor estrutura de dados para implementar a cadeia de módulos que representa uma planta. As operações que o sistema precisa executar nesta estrutura são: Com isso, a decisão natural foi usar listas duplamente ligadas.


Módulos

Para armazenar as informações de cada módulo, foi criada a classe lModulo, que contém uma cadeia de caracteres (String), para armazenar o símbolo do módulo, e um array de parâmetros, expressões matemáticas (ver abaixo) que podem ser tanto valores numéricos dos módulos que estão na cadeia como expressões matemáticas dos cálculos feitos no momento da aplicação de uma regra de substituição.

Dois módulos são considerados iguais se possuírem o mesmo símbolo e o mesmo número de parâmetros. Esta comparação é feita no momento de aplicação de uma regra de substituição.


Regras de substituição

Uma regra de substituição é uma estrutura contendo os seguintes campos (conforme descrito aqui): Os parâmetros dos módulos nos campos da regra são expressões matemáticas, que são avaliadas no momento da substituição dos módulos.

As regras do L-System são armazenadas em um array, ordenadas de acordo com a ordem com que são aplicadas sobre os módulos da cadeia.


Expressões matemáticas

Neste projeto, expressões matemáticas são implementadas e armazenadas, ironicamente, em árvores. Cada nó da árvore é uma operação matemática, sendo que os filhos deste nó são os fatores da operação.

Para realizar a operação de um nó, primeiro se avaliam os valores dos filhos do nó, e em seguida se combinam estes resultados de acordo com o tipo de operação do nó. Por exemplo, caso um nó represente uma operação de soma, ele terá dois filhos. Para avaliar seu valor, primeiro se avaliam os valores dos dois filhos, depois esses valores são somados.

As folhas da árvore armazenam apenas números, não operações. O resultado da avaliação de uma folha é o próprio número que ela armazena.

Operações lógicas e booleanas (AND, OR, NOT, igualdade, comparação, etc.) também podem ser expressas com esta estrutura. Nessas operações, interpreta-se um resultado igual a 0 como FALSO, e um resultado diferente de 0 como VERDADEIRO.