APLICACIÓN DE LA LINGÜÍSTICA MATEMÁTICA A LA GENERACIÓN DE PAISAJES.

www.fgalindosoria.com/ecuaciondelanaturaleza/linguistica_matematica_generacion_paisajes/paisaje1.htm

 

Fernando Galindo Soria

UPIICSA    IPN

Calle de Te #950 , Col Granjas México, D.F. , 08400 México

Diciembre de 1992

fgalindo@ipn.mx    www.fgalindosoria.com

 

Ir a la Página de la Ecuación de la Naturaleza  S->e*S*

http://www.fgalindosoria.com/ecuaciondelanaturaleza/

Ciudad. de México 1992

Construcción de la Página   29 de abril del 2001

Ultima modificación 30 de Julio del 2005

 

RESUMEN

Dentro del área de tratamiento de imágenes existe una gran cantidad de problemas en los que se requiere manejar objetos de la naturaleza como: árboles, nubes, estrellas y montañas, ya sea, para generar paisajes o construir animaciones de crecimiento de árboles o nubes entre otros.

 

Desde hace algún tiempo y en particular desde el surgimiento de la teoría de Fractales se han desarrollado métodos y técnicas orientados a resolver este tipo de problema y ya se cuenta con una gran cantidad de herramientas para resolverlos. Ahora bien, comúnmente se utilizan técnicas distintas para resolver los diferentes problemas, el método que permite generar las montañas no se aplica para generar árboles y por un lado se tienen métodos para generar nubes, por otro estrellas o árboles y por otro peces o caracoles, siendo cada método diferente y especifico y la construcción de un paisaje involucra el uso de múltiples métodos diferentes.

 

Por lo que, en este trabajo se presenta una herramienta general basada en la Lingüística Matemática y los fractales y en particular en una ampliación semántica de las Gramáticas Generativas, específicamente se presenta una ecuación lingüística de la forma S-->a*S*, con la cual se puede representar la estructura de múltiples elementos de la naturaleza, incluyendo arboles, nubes, estrellas, montañas, caracoles y ríos y que proponemos como una de las ecuaciones fundamentales de la naturaleza.

 

Dado que una regla lingüística o producción es fácil de representar mediante un programa de computo, se mostrara como representar la ecuación S-->a*S* mediante un pequeño programa, al que cambiándole el valor de un parámetro puede generar por ejemplo un bosque de helechos, o una nube en forma de perro, finalmente se muestra como con la misma rutina y simplemente cambiándole parámetros se pueden construir múltiples tipos de paisajes incluyendo: montañas nevadas, paisajes marinos, playas y muchos otros.

 

INTRODUCCIÓN

 

Dentro del área del tratamiento de imágenes es común encontrar problemas donde se requiere generar paisajes en los que se incluyan montañas, árboles, nubes, ríos y muchos otros elementos de la naturaleza, por lo que, desde hace algún tiempo y en particular desde el surgimiento de la teoría de Fractales se han desarrollado métodos y técnicas orientados a resolver este problema y específicamente ya se cuenta con una gran cantidad de herramientas que permiten generar montañas, nubes, plantas y otros elementos de un paisaje.

 

Ahora bien, comúnmente se utilizan técnicas distintas para resolver los diferentes problemas y es así que por un lado se tienen métodos para generar nubes y por otro estrellas o árboles, siendo cada método diferente y especifico.

 

Por ejemplo, en el caso de las plantas es común encontrar métodos en los cuales a partir de un elementos inicial y mediante un algoritmo recursivo se producen ejemplos de plantas muy naturales, por otro lado, desde los años 70's ya se encontraban aplicaciones de los Sistemas-L a la generación de plantas con muy buenos resultados.

 

Tanto los sistemas-L como los métodos basados en un Iniciador-Generador se han aplicado a construir además de plantas también ríos, rayos y otros elementos de la naturaleza que tienen una estructura dendrítica (formada por múltiples ramas que se entrecruzan como una red neuronal o de vasos capilares).

 

Por otro lado, en el caso de nubes o montañas se ha tenido también un gran desarrollo y así existen métodos para generar montañas mediante particiones sucesivas de una curva o mediante el expediente de generar en 3D la imagen de un objeto y colocando en el eje Z la densidad del objeto (Por ejemplo tomar la fotografía de una galaxia y graficar en Z la densidad de estrellas).

 

Sin embargo estos métodos por lo común son independientes unos de otros y el que produce por ejemplo las montañas no se aplica para generar árboles, por lo que la construcción de un paisaje involucra el uso de múltiples métodos diferentes.

En este trabajo se presenta un herramienta basada en la Lingüística Matemática y en particular en una ampliación semántica de las Gramáticas Generativas, con la cual es relativamente fácil representar la estructura de múltiples elementos de la naturaleza, por lo que prácticamente la misma rutina genera árboles, nubes, montañas, caracoles, estrellas y muchos otros componentes de la naturaleza.

 

 

1. UNA ECUACIÓN FUNDAMENTAL.

 

Las gramáticas generativas surgieron en 1957 a partir de los Trabajos de Noam Chomsky y desde principios de los 60's se han aplicado para representar la estructura de los múltiples lenguajes de programación que existen y poder construir los compiladores o intérpretes de estos lenguajes.

 

Por otro lado también desde los 60's ha sido la base de los métodos de reconocimiento sintáctico de patrones en los cuales se ve a una imagen o fenómeno que se repite cotidianamente (voz, movimiento de los planetas, jugada de ajedrez, etc.) como una 'oración' del lenguaje de imágenes o del fenómeno repetitivo, a partir de ahí se encuentra la regla gramatical o producción que representa la estructura general de este lenguaje y se asume entonces que por ejemplo, la regla gramatical de un conjunto de imágenes representa su patrón general o rasgos característicos.

 

Lo anterior permite desarrollar una herramienta que, a partir de la gramática de una familia de imágenes, es capaz de reconocer si una imagen en particular pertenece a la familia o no (como un compilador es capaz de reconocer si una oración pertenece o no a un lenguaje dado). Por otro lado, si se invierte el orden de entradas y salidas se puede tener un sistema capaz de general imágenes específicas a partir de una gramática dada.

 

Un enfoque particular de lo anterior se presentó durante los 80's, al aplicar la Lingüística Matemática al reconocimiento y generación de componentes de la naturaleza como árboles, montañas y nubes con el fin de construir Sistemas Evolutivos de la Naturaleza (en donde un sistema evolutivo es un mecanismo capaz de encontrar, construir y mantener actualizada una representación del medio que lo rodea y usar esa representación para mantenerse y resolver problemas dentro de ese medio).

 

Específicamente el propósito consistió en lograr que un Sistema Evolutivo tomara la imagen de una familia de objeto de la naturaleza (árbol, montaña, etc.) encontrará la regla gramatical o producción que representaba a la familia de objetos y fuera capaz de reconocer si un nuevo objeto pertenece o no a la familia. Como otro resultado además se encontró que esta era una forma muy simple de compactar objetos y de generar nuevas imágenes de la naturaleza.

 

En un principio las producciones encontradas eran diferentes unas de otras pero conforme se siguió atacando el problema se detectó que en muchos casos la regla gramatical encontrada era un caso particular de una regla mas general.

 

En principio esto no fue tan extraño, ya que, por ejemplo se detectó que diferentes tipos de árboles generaban reglas gramaticales diferentes, pero que se podían agrupar en una regla gramatical mas general, por otro lado con las montañas sucedía algo parecido y otro tanto con las nubes, por lo que al final se tenia una producción general para arboles (para estructuras dendríticas) otra para montañas y otra para nubes.

 

La sorpresa surgió cuando se detecto que a su vez todas esas producciones generales eran un caso particular de una regla gramatical mas general aun, que las englobaba a todas.

 

Encontrándose que prácticamente la estructura gramatical de cualquier elemento de la naturaleza se puede ver como un caso particular de una regla general a la que llamamos Ecuación Fundamental y es de la forma:

 

    S --> e* S*

 

Donde S significa Sistema, e es cualquier elemento del sistema (una rama un tronco, una ladera etc.), e* significa que se pueden tener tantos elementos como se quieran y S* indica que el sistema se puede llamar tantas veces como se quiera. Observe que estamos utilizando el signo * como un factor de repetición, lo cual no es una notación común dentro de las reglas de producción, pero en este caso facilita la representación.

 

Ejemplos particulares de la ecuación fundamental son:

 

S --> e

S --> e S

S --> e SS

S --> e SS ... S

S --> e SeeSe... S

 

2. ÁRBOLES, ESTRELLAS Y CARACOLES.

 

En particular la ecuación

 

S --> e

 

que se lee como el Sistema S llama a e

 

representa la estructura de un programa que llama a un elemento, por ejemplo la rutina que gráfica un tronco:

 

Sistema

{

  tronco

}

 

o mas específicamente

 

Sistema (x0,y0,long,w)

{

  tronco(x0,y0,long,w)

}

 

donde x0,y0 representan el punto inicial del tronco, long su tamaño y w el ángulo con el que crece.

 

Como otro ejemplo podemos ver que la ecuación

 

S --> e S

 

es equivalente a un sistema que genera un elemento y se llama recursivamente, con lo que, vuelve a generar otro elemento y así sucesivamente.

 

Sistema

{

   elemento

   sistema

}

 

Esta ecuación engloba por ejemplo a la familia de las estrellas ya que la rutina

 

Sistema(x0,y0,long,w)

{

   elemento(x0,y0,long,w)

   sistema(x0,y0,long,w+w1)

}

 

Gráfica una recta a partir de un punto (x0, y0), con un ángulo w y tamaño t y el ángulo se cambia entre llamadas; por lo que al final la rutina genera una estrella.

 

 

Por otro lado y con un cambio mínimo se genera la familia de los caracoles, para lo cual, únicamente se necesita que el punto inicial (x, y) de la nueva recta sea el punto final de la recta anterior.

 

 

 

Es importante observar que en el caso de un sistema recursivo el proceso continua indefinidamente, por lo que el llamado recursivo únicamente representa la posibilidad de que surja una nueva rama o el sistema siga creciendo, sin embargo si esto se genera en una computadora es importante introducir algún mecanismo que permita detener el proceso como por ejemplo una tecla de Escape, o por otro lado detener el proceso cuando se cumpla alguna condición explícita como por ejemplo que se cumplió un numero prefijado de llamados.

 

En muchos casos es preferible una estructura iterativa en lugar de la recursiva, sin embargo existen problemas en los cuales la representación más simple es mediante procesos recursivos.

 

En el caso de rutinas que dibujan árboles, la estructura iterativa ya no es funcional y en cambio la estructura recursiva es muy simple, por ejemplo la ecuación:

 

S --> e S S

 

representa una familia de arboles de 2 ramas

 

y el programa es de la forma

 

main()

{

  árbol(x0, y0,long, ángulo, nivel);

}

 

árbol(x,y,long,wg,nivel)                                     /*S*/

{

   if (nivel> 0) /* condición de terminación*/

  {

     rama(x,y,long,wg,x1,y1);                /*e*/

     árbol(x1,y1,long/lon1,wg+w1,nivel-1);         /*S */

     árbol(x1, y1, long/lon2,wg + w2, nivel -1); /*S*/

   }

}

 

 

Donde lon1, lon2, w1 y w2 son parámetros que indican los cambios de tamaño y ángulo de las ramas.

 

Ahora bien, si se quiere dibujar un árbol con tres ramas, simplemente se pondría una llamada recursiva más y así sucesivamente, construir árboles con tres, cuatro, cinco o más ramas se vuelve trivial, ya que su estructura queda:

 

S --> e SSS

S --> e SSSS

          ..

 

S --> e SS.....S

 

y en general la estructura de cualquier árbol es de la forma

 

S --> e S*

 

y los programas son muy simples.

 

 

3. UN PROGRAMA GENERALIZADO.

 

Construir un programa para cada tipo de árbol puede llegar a ser tedioso porque al final todos los programas son prácticamente idénticos y es más fácil pensar en un programa general al cual simplemente se le indique cuantas ramas se quieren y se llame a la rutina tantas veces como se necesite.

 

Por ejemplo, la rutina

árbol(x,y,long,wg,nivel)

{

  if (nivel>0)

  {

    rama(x,y,long,wg,xl,yl)

    ind=1

    while  ind <= n

       árbol(x1,y1,long/lon[ind],wg+w[ind++],nivel--)

   }

}

 

representa precisamente a la ecuación

 

S --> e S*

 

Y dibuja árboles con n ramas (donde n es una variable que representa el número de ramas).

 

Otra forma alternativa de representación sería que en lugar de pasarle el número n de llamadas a la rutina, se le pasará una lista de la forma eSeeSSSeS con tantas e's y S's como se quiera.

 

La ventaja de este enfoque es que el sistema se puede generalizar para representar llamados a árboles 'raros' como por ejemplo

 

S -->eSe

 

S -->eSSe

 

S -->eeSeSS

 

S -->eSSeeSe

 

y cualquier combinación de elementos y llamadas, para lo cual únicamente se necesita preguntar si el comando es una e o una S como se ve a continuación:

 

gramática[]= "eSeeSS"

main()

{

  árbol(x0,y0,l0,w0,nivel)

}

árbol(x,y,long,wg,nivel)

{

  si (nivel>0)

  {

    i=l

    mientras (gramática[i] != fin de renglón)

     {

        si (gramática[i]='e') linea(x,y,l,w,x1,y1)

        si (gramática[i]='S')

                 árbol(x1,y1,long/lon[i],wg+w[i],nivel--)

        i++

     }

  }

}

 

El anterior es un Sistema Generador de Árboles y representa a la estructura

 

S --> e*S*

 

Si en el arreglo llamado gramática se almacena:

 

S --> e

         El sistema genera una línea.

 

S --> eS

         El sistema genera caracoles o estrellas

 

S --> eSS

         El sistema genera árboles con dos ramas

 

S --> eSSS

         El sistema genera árboles con tres ramas

 

y así sucesivamente.

 

De donde resulta que el mismo programa que gráfica líneas, gráfica caracoles y árboles y todos son un caso particular de la estructura

 

S --> e* S*

 

Al anterior sistema se le pueden hacer múltiples modificaciones como:

 

   Sustituir la rutina línea por una rutina que genere troncos de diferentes anchos, largos, colores, texturas, en forma de arco, etc.

 

   Parametrizar el máximo de elementos como li, wi. y pasar diferentes valores para cada caso o aún más introducir secuencias aleatorias basadas en la distribución estadística de los elementos de una planta y en sus probabilidades de crecimiento, muerte o reproducción.

   Introducir más de un tipo de elemento y generar con líneas, arcos, troncos círculos, triángulos, esferas u otros elementos.

 

   Introducir múltiples estructuras y permitir que unas se llamen a otras, por ejemplo, tener la estructura de árbol, hoja y flor y que en cierto momento árbol llame a hoja o flor.

 

Con lo que un programa de este tipo es capaz de generar plantas de múltiples tipos únicamente cambiando la gramática que representa la estructura de la planta. Y para lograr lo anterior simplemente se requiere generalizar el programa para que pueda llamar al i-esimo elemento (tronco, línea, arco, etc.) y a la i-esima estructura o producción de la gramática.

 

En general la estructura de cualquiera de los sistemas anteriores es de la forma

 

Si --> ej* Sk*

 

donde ej es cualquier elemento del sistema y Sk cualquier producción de la gramática que representa al sistema.

 

Lo anterior nos proporciona una herramienta generalizada para el desarrollo de sistemas y en particular de árboles a partir de la Lingüística Matemática, ya que únicamente es necesario encontrar la gramática del sistema que se quiera producir y proporcionárselo al generador para que este obtenga el sistema específico con la estructura que se desee.

 

 

 

4. ÁRBOLES, NUBES, MONTAÑAS Y PAISAJES.

 

Sin embargo el asunto no queda ahí ya que no se ha dicho prácticamente nada de los parámetros del sistema (En este caso x,y,l,w).

Al empezar a jugar con los parámetros el efecto que se obtiene es precioso, ya que, cada uno de ellos al ser modificado puede ocasionar cambios radicales en la forma de los objetos generados, con lo que, dos objetos con la misma estructura interna (gramática) pueden tener una forma radicalmente diferente.

 

Por ejemplo si tomamos el siguiente caso particular

 

main()

{

  w0=c0; w1=c1; w2=c2; w3=C3; ind=cd;

  árbol (x0,y0,l,w0,ind)

}

árbol(x1, y1, l, w, ind)

{

   si ind>0

  {

      linea(x,y,l,w,x1,y1)

      árbol(x1,y1,l/1.2,w+w1,ind-1)

      árbol(x1,y1,l/1.55,w+w2,ind-1)

      árbol(x1,y1,l/1.8,w+w3,ind-1)

  }

}

 

donde w0, w1, w2, w3 son el ángulo inicial y los incrementos de ángulos para cada llamada recursiva.

 

Podemos encontrar que si fijamos

w0=-72   w2=72   w3=144

 

y  modificamos  w1 entre 1 y 360 grados

podemos generar una familia completamente diferente, ya que si por ejemplo

 

   w1=24          tenemos un bosque de helechos

 

   w1=4            tenemos una nube en forma de perro

 

   w1=139        tenemos una nube

 

   w1=169        tenemos un fractal de dragón

 

y así sucesivamente hasta regresar a los helechos.

 

Si el cambio del ángulo se realiza con saltos muy pequeños se puede observar como un elemento se transforma en otro , con lo que para generar un bosque de helechos o una nube solo es necesario cambiar el valor de un solo parámetro de todo un sistema.

 

El anterior efecto se produce si mantenemos fijos w0, w2, w3 y modificamos w1, ahora bien si modificamos cualquiera de los 4 ángulos la cantidad de elementos que se pueden generar es enorme e incluye nubes, árboles y montañas entre otros.

 

En general las ecuaciones de la forma

 

     S --> eSS ... S

 

permiten generar múltiples familias de árboles, montañas, nubes, ríos y prácticamente cualquier elemento de la naturaleza.

 

 

Por ejemplo si :

 

   Fijamos  w0=-27   w1=6   w2=172

y modificamos w3 se genera una familia de laderas de montaña. 

 

   Fijamos  w0=-7   w1=6   w2=72

modificamos w3 se genera una familia de árboles en una ladera y árboles con reflejo.

 

   Fijamos  w0=-72   w2=172  w3=144

y modificamos  w1 se genera una familia de alacranes

 

Como se puede ver, con una rutina de unos cuantos renglones y cambiando solo los ángulos se tiene prácticamente todos los elementos de un paisaje, por lo que, un programa que genera un paisaje se limita a un conjunto de llamados a la misma rutina, a la cual le pasan solo las modificaciones de los parámetros, como se puede ver en el siguiente ejemplo:

 

int w0,w1,w2,w3,color;

main()

{

   /*estrella */color=3;

    wl=37; estrella(450,90,1,27,47);

   /*nube */ color=2;

   w1=238; w2=273; w3=144; paisaje(100,80,37,-72,9);

   w1=188; w2=243; w3=144; paisaje(340,110,59,-72,9);

   w1=238; w2=273; w3=125; paisaje(S50,80,23,-23,7);

   w1=287; w2=103; w3=144; paisaje(l90,60,19,-92,9);

   /*montaña*/

   color=3;w1=6;w2=172;w3=186;       paisaje(425,350,63,173,7);

   color=5;w1=6;w2=172;w3=1;           paisaje(210,320,63,169,7);

   color=9;w1=6;w2=172;w3=186;       paisaje(280,325,63,8,7);

   color=6;w1=6;w2=172;w3=1;w0=172;             paisaje(380,335,63,w0,7);

   color=6;w1=6;w2=172;w3=1;w0=173;             paisaje(380,335,63,w0,7);

   /*árbol */ color=l;

     w1=8; w2=72; w3=17;                                                                     paisaje(225,315,43,-17,7);

    w1=-12; w2=352; w3=97; paisaje(340,315,43,15,7):

   w1=8; w2=72; w3=351;                                                                     paisaje(443,340,43,0,7);

}

 

paisaje(int x0, int y0, int l, int an, int ind)

{

  int x1,y1;

  if  (Ind >0)

  {

     setcolor(ind+color);

     recta(x0,y0,l,an,&x1,&y1);

     paisaje(x1 ,y1,l/1 .2,an+w1,ind-1);

     paisaje(x1,y1,l/1.55,an+w2,ind-1);

     paisaje(x1 ,y1,l/1.8,an+w3,ind--);

  }

}

 

estrella(int x0,int y0,int l,int an,int ind)

{

   int x1,y1;

   if  (Ind > 0)

   {

     setcolor(ind+color);

     recta(x0,y0,l,an,&x1,&y1);

     estrella(x0,y0,l+1,an+w1,ind--);

   }

}

 

 

CONCLUSIÓN.

En este documento se presento una aplicación de la Lingüística Matemática a la generación de paisajes, para lo cual: en primer lugar se planteo que existe una ecuación fundamental de la naturaleza de la forma

 

S--> e*S*

que engloba a las ecuaciones que representan la estructura de troncos, caracoles, estrellas, árboles, nubes y montañas, entre otros. Lo anterior es fundamental ya que nos muestra que múltiples fenómenos de la naturaleza tienen la misma estructura.

 

Mas adelante se vio como a partir de la estructura Lingüística se obtiene directamente un programa y en particular se presento un sistema basado en la ecuación fundamental y se mostró como cambiándole simplemente algunos parámetros genera una gran cantidad de elementos.

 

Este enfoque generaliza y engloba dentro de la lingüística matemática múltiples herramientas como los métodos iniciador-generador y los de los sistemas-L, con lo que, se puede aprovechar todo el poderío de esta herramienta que se utiliza desde hace muchos años para construir compiladores, reconocer formas, medir la complejidad de sistemas y en general para encontrar y representar la estructura de múltiples problemas de la Informática, por lo que este documento es también una invitación al uso de la Lingüística Matemática dentro de la graficación y animación.

 

Como se puede ver estamos llegando a que la estructura de una cantidad enorme de elementos de la naturaleza es la misma, ya que, por ejemplo únicamente cambiando algunos ángulos dentro de una rutina se pueden generar nubes, laderas de montañas, árboles, alacranes, hojas y paisajes en generar.

 

AGRADECIMIENTOS.

 

Muchas gracias a Marina Vicario Solórzano y Francisco Aguilar Vallejo de TECCIZ de México, Cuitlahuac Cantu de ORSA, Sergio Rivera, Francisco Molina C. y Cruz Luna Reyes de UPIICSA -IPN por su ayuda y contribución a este trabajo.

 

 

REFERENCIAS.

 

1. Kenton Musgrave, Craig E. KoIb y Robert S. Mace. The Synthesys and Rendering of Eroded Fractal terrains. In Computer Graphics, Vol 23(3), julio 1989.

 

2. Przemyslaw Prosinkiewicz, Aristid Lindenmayer y James Hanan. Developmental Models of Herbaceous Plants for Computer Imagery Purposes. Computer Graphics, Vol 22(4), Agosto 1988

 

3. Sofia Bueno Peralta y Antonio Simancas López. Generador de Árboles Fractales. en Memorias del III Congreso Nacional sobre Informática y Computación, Jalapa, Ver. México, Octubre 1990.

 

4. Peter E. Oppenheimer. Real Time Design and Animation of Fractal Plants and Trees. In Computer Graphics, Vol 20(4) SIGGRAPH'86, August 1986.

 

5. Heinz-Otto Peitgen and Dietmar Saupe (Editores). The Science of Fractal Images. Ed. Springer-Verlag, 1988.

 

6. Fernando Galindo Soria. Sistemas Evolutivos: Nuevo Paradigma de la Informática. en Memorias XVII Conferencia Latinoamericana de Informática, Caracas Venezuela, julio de 1991.

 

7. Fernando Galindo Soria. Sistemas Evolutivos. en Boletín de Política Informática. México, Septiembre de 1986.

 

8. Rafael C. Gonzalez y Michael C. Thomason. Sintactic Pattern Recognition. Ed. Addison-Wesley.

 

9. Fernando Galindo Soria. Aplicaciones de la Lingüística Matemática y los Fractales a la Generación de Imágenes. en Memorias Simposium Nacional de Computación. México, Nov. de 1991.

 

10.Emmon Bach. Teoría Sintáctica. Ed. Anagrama.

 

11.Salomaa. Formal Languages. Ed. Academic Press.

 

12.Herbert. A. Simon. Las Ciencias de lo Artificial. Ed. ATE

 

13.Noam Chomsky. Estructuras Sintácticas. Ed. Siglo XXI

 

14.Hopcroft y Ullman. Formal Languages and Their Relation to Automata. Ed. Addison-Wesley