• Macros en el editor de configuración Java y en el intérprete Java

    ¿Qué es una macro?

    Una macro es un archivo de texto que contiene parte del código de una escena de Descartes y que interpretado por Descartes actúa como un gráfico en una escena.

    Podemos distinguir dos tipos de macros: Macros del Sistema o Macros de usuario. Los primeros son macros que previamente se han construido y que están incorporados al código del intérprete de Descartes en Java Descartes5.jar, y los segundo son macros que puede definir el usuario y que no están integrados en el intérprete.

    objetos cartesianos debe colocarse en un sitio específico. Hay dos formas posibles de acomodar las macros: con direccionamiento general o con direccionamiento particular.

    1) Macros del Sistema

    Los macros del sistema tienen una organización interna en diversos subdirectorios y para su localización es necesario aportar el direccionamiento adecuado. Este direccionamiento es aportado por el editor de configuración de manera automática y ha de respetarse para que pueda ser accesible. En la figura siguiente puede observarse a un primer nivel el directorio macros, en un segundo nivel g2d y g3d (macros de gráficos 2d y 3d respectivamente) y un tercer nivel y sucesivos donde se agrupan los macros por su temática. Para un detalle completo de todos estos macros puede consultarse el artículo Relación de macros del sistema.

    Organización interna de los macros del sistema

    Organización interna de los macros del sistema

    Dado que los macros 2d están ubicados en el subdirectorio macros/g2d/ y los 3d en macros/g3d/ el editor de configuración presupone este direccionamiento y sólo aporta como parámetro en la escena el direccionamiento relativo a esos dos subdirectorios anteriores.

    Así pues el macro masa que está ubicado en macros/g2d/dinamica/masa en el parámetro expresión del código de la escena aparecerá referenciado como dinamica/masa.

    Todos estos macros son públicos y pueden ser utilizados por cualquier desarrollador de escenas.

    2) Macros de usuario o particulares

    Un usuario puede crear sus macros y ubicarlos en la misma carpeta donde se encuentra la página que contiene a la escena o en subcarpetas de ella. Para usarlos tendrá que indicar el direccionamiento adecuado para que el intérprete de Descartes pueda acceder a ese fichero y leer su contenido.

    ¿Qué contenido tiene una macro?

    Un archivo de texto que es una macro contiene varias líneas. La primera especifica si es de dos o tres dimensiones: tipo_de_macro=R2tipo_de_macro=R3. Luego vienen líneas que definen los objetos auxiliares del macro y, finalmente, las líneas que definen los gráficos del macro. Las líneas que definen auxiliares y gráficos son exactamente las que aparecen al pulsar las etiquetas azules Auxiliar o Gráfico en los respectivos paneles de configuración.

    Por ejemplo el contenido del archivo de texto que constituye el macro dinamica/masa que es uno de los utilizados en la segunda escena de arriba es éste:

    Nota: Cuando una escena se transforma en macro sólo se traspasan al macro los auxiliares y los gráficos. Los controles, la animación y las demás partes de una escena no pasan al macro.

    ¿Cómo utiliza los macros un autor de escenas de Descartes?

    La utilización de los macros para configurar escenas es como la de cualquier otro gráfico. Si se desea usar un macro del sistema, bastará buscarlo recurriendo a los menús que se encuentran en el panel de configuración de macros y seleccionarlo. Si se desea usar un macro que no es del sistema, es decir que no está registrado, entonces deberá ser un macro con direccionamiento particular y será necesario escribir su nombre explícitamente, incluyendo las posibles subcarpetas a partir desde donde esté la página web que contiene la escena.

    Todos los macros se pueden girar o trasladar utilizando los campos rotini y posini que aparecen en sus paneles de configuración. He aquí el panel de configuración de un macro de dos dimensiones:

    macro1

    y el de un macro de tres dimensiones:

    macro2

    Es importante poner un nombre diferente para cada instancia de cada macro que se utilice en una escena. Los auxiliares del macro (constantesvariablesvectoresfunciones y algoritmos) pueden utilizarse en la escena precediendo la llamada a uno de ellos por el nombre de la instancia del macro y un punto. Por ejemplo la masa del objeto definido por el macro dinamica/masa de nombre M es M.m

    ¿Cómo podemos conocer cuáles son los parámetros de un macro del sistema?

    Para obtener esta información basta pulsar el botón Aux que se encuentra a la derecha del campo de texto y de los menús desplegables que se usan para poner la trayectoria y el nombre del macro. Al hacerlo se abre una ventana como esta:

    macro3

    en la que aparecen todos los auxiliares con sus valores iniciales. Si se trata de algoritmos o de funciones con algoritmo sólamente aparece la palabra algoritmo entre paréntesis. En el caso de constantes y algoritmos que no son funciones, a la derecha aparece una-sola-vez o siempre, indicando cuándo se evalúa. A las constantes que se evalúan siempre no podrá modificarlas el usuario del macro desde una aplicación. En principio las funciones algorítmicas y los algoritmos son para ser usados desde las aplicaciones, tampoco deberían sobreescribirse en las aplicaciones, pues representan funcionalidad propia del macro. En cambio todas las variables que se evalúan una sola vez y las funciones no algorítmicas pueden sobreescribirse, siempre y cuando el autor de la aplicación entienda su significado.

    ¿Cómo puede saberse el significado de los auxiliares de un macro?

    En el caso de las macros del sistema, pulsando el botón Doc se abre la página web donde está la escena que define la macro, y la misma página en general debe tener una o varias escenas que muestran cómo se usa dicho macro, e ilustran el significado de cada uno de sus auxiliares. (El comentario anterior no tiene validez en la versión5 y se mantiene por si el desarrollador de escenas quiere aplicarlo a sus macros particulares, según se detalla en el siguiente párrafo)

    En el caso de los macros particulares, será responsabilidad del autor ofrecer esta documentación y deberá hacerlo en una página con el mismo nombre y dirección del macro, pero con extensión html o htm. Allí deberá poner la escena que usó para generar el macro y algún ejemplo de cómo puede utilizarse.

    ¿Qué escenas pueden convertirse en macros?

    Para que una escena pueda convertirse en un macro debe satisfacer las siguientes condiciones:

    1. Tener un solo espacio.
    2. No debe contener macros.

    Algunos gráficos como las ecuacionessucesionesrellenos e imágenes no son convenientes para utilizarse en un macro si se desea que éste pueda girarse y transladarse usando rotini y posini.

    ¿Cómo se convierte una escena en un macro?

    Es muy fácil. Cuando una escena tiene un solo espacio, se habilita el botón macro, que aparece arriba a la derecha de la ventana de edición de configuraciones, como puede verse en la imagen del panel de configuración de la escena donde se crearon los ejes.

    macro4

    Al pulsar este botón aparece otra ventana con el macro, es decir, con el texto del macro.

    macro5

    Para crear la macro basta copiar ese texto y guardarlo en un archivo de texto con cualquier nombre. Ése será el nombre de la macro y el directorio donde lo guardó será su trayectoria. Dicho archivo deberá colocarse como se indica arriba según vaya a tener direccionamiento general o particular. Hecho esto la nueva macro ya puede usarse en cualquier escena.

    Nota: Recuerde que cuando una escena se transforma en macro sólo se traspasan a la macro los auxiliares y los gráficos. Los controles, la animación y las demás partes de una escena no pasan al macro.

    Nota: A pesar de que el botón macro se habilita siempre que hay un solo espacio en la escena, esto no garantiza que la macro resultante sea un macro auténtico. Para ello es necesario asegurarse que no tiene macros y si es de dos dimensiones y se desea que gire con rotini y se translade con posini, tampoco debe tener ecuacionessucesiones,rellenos ni imágenes.

    ¿Qué ventajas y limitaciones tienen las macros como objetos gráficos?

    Las macros pueden trasladarse y girarse mediante unos atributos específicos que aparecen en su panel de configuración. Esto, junto con la posibilidad de tener parámetros y algoritmos propios, les da gran flexibilidad y aplicabilidad.

    Una  de sus limitaciones sin embargo, es que no se les pueden cambiar los colores, a menos que éstos se definan a través de sus cantidades de rojo, verde y azul y éstas se traten como parámetros del macro. Otra es que las macros no cuentan con controles gráficos propios.

    ¿Qué utilidad tienen las macros?

    En principio las macros fueron ideados para crear bancos de objetos gráficos específicos para un área de aplicación. Por ejemplo una librería para circuitos (eléctricos) como la que actualmente existe en el banco de macros del sistema.

    Cada autor puede desarrollar las macros que le convenga, ya sea para ahorrarse trabajo al observar que utiliza varias veces la misma construcción, para uniformizar la presentación de varias escenas o para organizar mejor su trabajo. Como ejemplos de aplicación de macros pueden verse Máquinas Térmicas y Espejos Esfericos , en especial se recomienda mirar y estudiar los ejemplos del macro dinamica/masa por ser, desde el punto de vista gráfico, uno muy sencillo, pero de una gran funcionalidad que hereda gracias a sus auxiliares.

  • Audios y vídeos interactivos con Descartes

    En la siguiente escena tenemos un ejemplo de cómo se puede hacer con Descartes que un vídeo sea interactivo, es decir, que no sea sólo un instrumento de comunicación pasiva sino que requiera la participación activa del usuario.

    (Puede descargar  esta escena desde este enlace)
    En el siguiente documento tenemos una descripción de cómo se puede desarrollar esta escena:
  • Audio y vídeo mediante espacios HTMLIframe

    HTML5 cuenta con etiquetas específicas para incorporar y gestionar los audios y vídeos. Una explicación de éstas puede encontrarla por ejemplo en este enlace. Ahí puede observar la alternativa de usar el elemento <source> para especificar múltiples fuentes de archivos con el fin de proporcionar vídeo o audio codificados en formatos diferentes para diferentes navegadores salvando posibles incompatibilidades (al final de este artículo puede leer el comentario acerca de la compatibilidad de formatos de audio y vídeo y los navegadores).

    Uso de diferentes fuentes para un vídeo

    Uso de diferentes fuentes para un vídeo

     

    El código anterior reproduce el archivo Ogg en navegadores que admiten el formato Ogg. Si el navegador no admite Ogg, el navegador usará el archivo MPEG-4. Obviamente el coste se centra en que es necesario contar con un mismo soporte en diferentes formatos, es decir una conversión previa a los formatos deseados, y el almacenamiento adicional necesario para cada fichero.

    Dado que Descartes cuenta con espacios HTMLIframe que permiten embeber código HTML5 una alternativa para incluir audios y vídeos en una escena y evitar esas posibles incompatibildiades puede ser construir una página html que gestione esos recursos utilizando el código HTML5 descrito y embeber esa página en un espacio de ese tipo. El control de esos recursos (reproducción, pausa y parada, etc.), vendrá aportado por el propio HTML y los parámetros que desee incluir en él. Aquí Descartes actúa como mero contenedor.

    En la siguiente escena puede observarlo:

    Obviamente esta estrategia también puede usarse para embeber otros audios y vídeos publicados en la red. Por ejemplo desde youtube, como podemos observar en la siguiente escena:

    (Puede descargar la escena anterior y ésta desde este enlace)

  • Funciones para gestión de cadenas

    Las funciones para gestión de cadenas de texto (strings) que reconoce el analizador de expresiones de Descartes son las siguientes:

    En español   En inglés
    _longitud_(str)  Devuelve el número de carácteres que tiene la cadena str _length_(str)
    _subcadena_(str,i,f) Devuelve la cadena formada por los carácteres desde el i (incluído) hasta el f (excluído). Por ejemplo, cuando str=’espuela’, para obtener ‘pue’ habría que llamar _subcadena_(str,2,5) y ‘puela’ habría que llamar _subcadena_(str,2,_longitud_(str)) _substring_(str,i,f)
    _letraEn_(str,n) Devuelve la letra que se encuentra en la posición n de la cadena, por ejemplo _letraEn_(‘espuela’,3) devolvería ‘u’

    _charAt_(str,n)

    _índiceDe_(str,substr) Devuelve la primera posición en la cadena en la que se encuentra la subcadena substr. Por ejemplo: _índiceDe_(‘espuela’,’el’) devuelve 4. Si la subcadena substr no aparece en la cadena str, entonces devuelve -1 _indexOf_(str,substr)

    También se cuenta con una función que transforma un número en una cadena

    En español   En inglés
    _NumACadena_(num,dec)  Devuelve el número num como una cadena de carácteres con dec decimales. _NumToStr_(num,dec)

    Un ejemplo de esta función puede observarse en la siguiente escena

    Esta función _NumToStr_ es imprescindible para controlar el número de decimales cuando en un texto con formato se concatena un número con una cadena. Podemos observarlo en la siguiente escena:

    (Puede descargar esta escena y la anterior desde este enlace)

     

    Otra función permite generar una cadena a partir de los elementos de un vector

    En español   En inglés
      Genera una cadena de caracteres formada al concatenar la etiqueta <vector>con lo valores de los elementos de ese vector separados por el carácter nueva línea y finalmente la etiqueta </vector>.Si a vector.long_usada se asigna un valor incluirá en la cadena los elementos de vector cuyo índice es inferior a ese valor con tope el tamaño del vector. Si no se especifica utilizará todo los elementos. _VectorToStr_(‘vector’)

    Un ejemplo de esta función puede observarse en la siguiente escena

    (puede descargarla desde aquí)

    De manera análoga a la anterior se dispone de una función que permite generar una cadena a partir de los elementos de una matriz

    En español   En inglés
      Genera una cadena de caracteres formada al concatenar la etiqueta <matriz> con lo valores de los elementos de esa matriz escritos cada columna en una línea del fichero separados por el carácter | y éstas separadas por el caracter nueva línea y finalmente la etiqueta </matriz>. Las variables matriz.filas_usadas y matriz.columnas_usadas  establecen el rango de los elementos a guardar. _MatrixToStr_(‘matriz’)

    Un ejemplo de esta función puede consultarse en el artículo Guardar ficheros.

  • Algoritmos

    Los algoritmos constituyen un sistema sencillo para inicializar vectores y para programar procesos de cálculo más o menos complejos.

    Los algoritmos hasta la versión 4 de Descartes eran auxiliares de la escena y podían definirse en el panel de configuración de Auxiliares el cual no existe en la versión 5. Por compatibilidad hacia atrás entre las versiones, si una escena anterior a la versión 5 es editada con el gestor de escenas de esta versión,  éste incorpora todos los algoritmos al panel de Programa, donde podrán editarse, pero no pueden incorporarse más salvo que la edición se realice directamente en el campo de edición de texto. No obstante, es aconsejable no incorporar más algoritmos sino definirlos como funciones algorítmicas.

    En la versión 5 hay dos únicos algoritmos, accesibles desde el panel de Programa, que son INICIO y CÁLCULOS.

    Los parámetros de un algoritmo son los siguientes (ver imagen):

    Parámetros de un algoritmo

    Parámetros de un algoritmo

    id
    Es el identificador del auxiliar. 

    En el caso de una función o algoritmo debe incluir los parámetros de los que dependa escritos entre paréntesis y separados por comas. Por ejemplo: f(x,y,x).

     

    evaluar
    Es un selector con dos posibles valores: siempre o una_sola_vez. 

    Permite definir si el algoritmo deben evaluarse cada vez que el usuario modifica un control o sólamente una vez al iniciarse la escena.

    Es importante seleccionar una_sola_vez cuando sea factible para que el funcionamiento de la escena sea más rápido.

    inicio
    En el campo «inicio» puede escribirse una serie de asignaciones y llamadas a otros algoritmos o funciones separadas por punto y coma (;). Todo lo que haya en este campo se ejecuta al inicio del cálculo.
    hacer
    En el campo «hacer» puede escribirse una serie de asignaciones y llamadas a algoritmos o funciones separadas por saltos de línea. 

    Lo que hay en «hacer» se ejecuta repetidamente hasta que la condición mientras deja de cumplirse o se ha llegado a 10000 repeticiones (este límite es un sistema de seguridad para proteger al autor y al usuario de errores que pudiesen bloquear el navegador). 

    mientras
    En el campo «mientras» se debe escribir una expresión booleana.  

    Si este campo se deja en blanco el algoritmo realiza las asignaciones especificadas en hacer, sólo una vez.

     

    La estructura de los algoritmos de Descartes es en realidad un bucle de programación, que corresponde al «do… while» de los lenguajes C y Java y al «repeat… while» de Pascal.

    Para realizar una asignación condicional se puede utilizar la construcción: A?a:b donde A es una expresión booleana y a y b son los dos valores que se asignarán según se cumpla o no la condición A. Por ejemplo y=(x>0)?sen(2*pi*x):0 asigna a y el valor sen(2*pi*x) si x>0 y asigna 0 si x<=0. Esta construcción corresponde (parcialmente) al «if… else» de los lenguajes de programación.

    La combinación de bucles  iniciohacermientras, las asignaciones condicionales   A?a:b y la posibilidad de llamar algoritmos desde otros algoritmos ofrece muchas posibilidades para la programación de procesos de cálculo relativamente complejos.

    El panel de algoritmos permite decidir si éstos se evalúan una sola vez o siempre. Los algoritmos pueden servir para inicializar vectores. Los que se evalúan una sola vez se ejecutan sólo al iniciarse la escena y cuando se pulsa el botón inicio, por lo que sirven para inicializar vectores que permanecen constantes durante toda la interacción del usuario con la escena. Los algoritmos que se evalúan siempre, se ejecutan cada vez que hay un cambio en un control, ya sea numérico o gráfico, con lo cual sirven para evaluar vectores que dependen de los parámetros de los controles. Cuando un algoritmo se llama desde otro, se ejecuta, independientemente de si está marcado como evaluar una sola vez o siempre.

    La estructura de bucles iniciohacermientras de los algoritmos se utiliza también en las funciones algorítmicas y en la animación. De hecho la animación es un algoritmo especial que refresca la escena después de cada paso por hacer.