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

Como replicar a Curva de Hilbert usando os conhecidos L-Systems (Lindenmayer-Systems)?

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

Figura 1.16 (a) 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

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:
A imagem será apresentada aqui.

\[\]

# 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:

A imagem será apresentada aqui.

\[\]

# 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:

A imagem será apresentada aqui.

...