L-systems
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.
Curva de Hilbert
A curva de Hilbert, também conhecida como curva de preenchimento de espaço de Hilbert, é uma curva contínua de preenchimento de espaço fractal, que foi primeiramente descrita pelo matemático alemão David Hilbert em 1891, como uma variante das curvas de preenchimento de espaço descobertas por Giuseppe Peano em 1890, que preenchiam completamente um espaço bidimensional (como um quadrado) ou tridimensional.
\[\]
# Código L-systems indentado:
lsystem HilbertCurve {
set symbols axiom = L;
set iterations = 3;
interpret F as DrawForward(8);
interpret + as TurnLeft(90);
interpret - as TurnLeft(-90);
rewrite L to L F + R F R + F L - F - L F L F L - F R F R +;
rewrite R to - L F L F + R F R F R + F + R F - L F L - F R;
}
process all with SvgRenderer;
\[\]
Figura replicada do código acima rodado no Processador L-systems:

\[\]
# Código indentado ascii:
\[\]
lsystem HilbertCurveAscii {
set symbols axiom = L;
set iterations = 3;
set rightAngleSlashMode = true;
interpret F as DrawLine;
interpret + as TurnLeft;
interpret - as TurnRight;
rewrite L to L F + R F R + F L - F - L F L F L - F R F R +;
rewrite R to - L F L F + R F R F R + F + R F - L F L - F R;
}
process all with HexAsciiRenderer;
\[\]
Figura replicada do código acima rodado no Processador L-systems:

\[\]
# Código R indentado que gera uma Curva de Hilbert:
\[\]
hilbert.curve <- function(n){
Double <- function(A){
#The matrix for “H(n)” is equal to “Double(H(n-1))”.
m <- dim(A)[1];
n <- dim(A)[2];
N <- m*n;
B <- A+N;
C <- B+N;
D <- C+N;
E <- cbind(rbind(B,skew.transpose(A)),rbind(C,t(D)));
return(E);
}
Rotate <- function(A){
#Rotates the matrix A clockwise.
m <- dim(A)[1];
n <- dim(A)[2];
N <- m*n;
B <- matrix(0,m,n);
for (i in 1:m) for (j in 1:n) B[j,n+1-i] <- A[i,j]
return(B);
}
skew.transpose <- function(A){
return(Rotate(Rotate(t(A))));
}
rowofx <- function(A,x){
#Returns the row index of the matrix A for entry equal to x.
m <- dim(A)[1];
n <- dim(A)[2];
for (i in 1:m) for (j in 1:n) if (A[i,j]==x) return(i);
}
colofx <- function(A,x){
#Returns the column index of the matrix A for entry equal to x.
m <- dim(A)[1];
n <- dim(A)[2];
for (i in 1:m) for (j in 1:n) if (A[i,j]==x) return(j);
}
Draw <- function(A){
#Draws a graphical representation of the matrix A.
A <- Rotate(A);
m <- dim(A)[1];
n <- dim(A)[2];
N <- m*n;
plot( (rowofx(A,1)-1)/n, (colofx(A,1)-1)/n, pch=19,cex=0.5,ylim = c(0,1), xlim =c(0,1), ylab=character(1),xlab=character(1),axes=FALSE);
d <- 1/n;
for (i in 1:(N-1)) lines(c((rowofx(A,i)-1)/n,((rowofx(A,i+1)-1)/n)), c((colofx(A,i)-1)/n,((colofx(A,i+1)-1)/n)),lwd=1);
points((rowofx(A,N)-1)/n, (colofx(A,N)-1)/n, pch=19,cex=0.5);
}
H <- function(n){
#H(1) is shown in Figure 2.
if (n==0) return(matrix(c(2,1,3,4),2,2));
return(Double(H(n-1)));
}
Draw(H(n));
}
hilbert.curve(n=3);
\[\]
Figura replicada do código acima rodado no R:
