• Aplicaciones de la comunicación para integrar cálculo simbólico en Descartes

    En este artículo se describe como interactuar con aplicaciones Geogebra desde Descartes aprovechando la comunicación escena-html y la posibilidad de comunicación javascript con los applets de Geogebra. Para ello basta realizar los tres pasos siguientes:

    1. Enviar el comando considerado desde Descartes a una página html que contiene el applet Geogebra.
    2. Enviar este comando de la página html al applet Geogebra y obtener por la página html su resultado.
    3. Enviar el resultado desde la página html a la escena Descartes.

    Para el paso 1 y 3 se requiere que la escena «madre» incluya un espacio HTMLIframe que permita embeber la página html contenedora del applet Geogebra (ver artículo comunicación de una escena con el html embebido en un HTMLframe).

    Para el paso 3 se utiliza el método evalCommandCAS(string) que envía el comando a ejecutar por el CAS de Geogebra en un string y devuelve su resultado también en una cadena de caracteres.

    Para más información sobre los métodos que se pueden utilizar para interactuar con Geogebra mediante programación javascript se puede consultar la página siguiente: https://wiki.geogebra.org/en/Reference:JavaScript.

    El siguiente modelo muestra un ejemplo en el que se envía un comando cuyo resultado es utilizado por la escena Descartes. En concreto, dada una función, se obtiene su derivada e integral definida en un intervalo considerado además de obtener la circunferencia que pasa por tres puntos.

    (Puede descargar esta escena desde este enlace)

    A continuación se presenta la documentación que explica cómo se puede modificar esta escena.

    Con el siguiente modelo se puede ver cómo almacenar en un vector de Descartes el resultado de aquellos comandos que Geogebra da como resultado una lista. En el ejemplo se obtiene los puntos de corte de dos curvas.

    (Puede descargar esta escena desde aquí)

    A continuación se presenta la documentación que explica cómo se puede modificar la escena.

    El siguiente modelo muestra cómo obtener en una matriz Descartes los valores que Geogebra devuelve como una lista de listas. En el ejemplo se calcula la matriz traspuesta de una matriz 3×3.

    (Puede descargar esta escena desde este enlace)

    A continuación se presenta la documentación que explica cómo se modifica esta escena.

    La siguiente escena muestra la sintáxis de algunos comandos para su envío desde Descartes a la página html que contiene el applet Geogegra. Se incluye también un ejemplo de cada uno de ellos viendo cuál es el resultado que se obtiene.

    Puede descargar esta escena desde aquí.

  • Funciones para la comunicación

    Se dispone de dos funciones que permiten el envío/recepción de los valores de una variable hacia/desde una escena o hacia/desde la página html que contiene una escena o hacia/desde la página html contenida en un espacio HTMLIframe. En estos dos últimos casos es necesario combinarlo con el manejador de eventos y el interfaz de comunicación de javascript. En otros artículos se detalla cada una de estas situaciones.

    Las funciones indicadas son:

    Sintaxis  Descripción Ejemplo
    Id.set(‘variable_a_actualizar,variable_que _actualiza Asigna a la variable denominada variable_a_actualizar en el espacio de identificador Id el valor actual de la variable denominada variable_que_actualiza en la escena que incluye la llamada a esta función.Si en Id se indica parent con ello se estará indicando que la variable_a_actualizar se ubica en la escena padre, es decir, aquella que ha abierto a la escena que incluye esta llamada.Obviamente la necesidad de esta función acontece cuando una escena padre lleva embebida a través de un espacio HTMLIframe otra escena. Dentro de una escena la asignación de valores es mediante el operador de asignación = E1.set(‘v1’, v2)A la variable v1 del espacio E1 se le asigna el valor de la variable v2.
    Id.update() En el espacio de identificador Id se actualizan los valores asignados previamente mediante la función set.Puede utilizarse el identificador parent. E1.update()Actualiza en el espacio E1 las variables previamente asignadas con set

    Un ejemplo de utilización de estas funciones puede observarse en la siguiente escena (puede consultarse este artículo) donde tenemos una escena madre que contiene dos espacios HTMLIframe y en cada uno de ellos se tiene una escena de Descartes (Escena hija 1 y Escena hija 2). Puede comprobarse como al cambiar el valor de var1 en la Escena hija 1 se actualiza el valor en la Escena hija 2, y análogamente ocurre con var2.

  • 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.

  • Palabras reservadas

    Hay varios identificadores reservados que tienen un significado especial para los espacios de una escena.

    Para espacios 2-D los identificadores reservados son: escalaO.x, O.y

    Para espacios 3-D los identificadores reservados son: escalaobservadorrot.y y rot.z. La tabla que sigue explica su significado y el de otras palabras reservadas.

    Cuando hay más de un espacio estas variables deben ir precedidas por el identificador del espacio y un punto, es decir sus nombres son: <id>.escala<id>.O.x,   <id>.O.y,   <id>.observador,   <id>.rot.y,   <id>.rot.z,  donde  <id> es el identificador del espacio.

    Palabras reservadas

    Para espacios en general

    escala

    Es el tamaño de la escala de la escena y se expresa en pixeles.
    Su valor por defecto en escenas 2-D es 48.

    O.x

    Es la distancia horizontal del centro de la escena al origen en pixels.
    Los valores positivos desplazan el origen hacia la derecha.
    El valor por defecto es 0.

    O.y

    Es la distancia vertical del centro de la escena al origen en pixels.
    Los valores positivos desplazan el origen hacia abajo.
    El valor por defecto es 0.
    _x
    La abcisa del vértice superior izquierdo del espacio (en pixeles)
    _y
    La ordenada del vértice superior izquierdo del espacio (en pixeles)
    _w
    El ancho del espacio (en pixeles)
    _h
    La altura del espacio (en pixeles)
    ratón_apretado (mouse_pressed)
    Vale 1 si el botón izquierdo del ratón está apretado y cero en cualquier otro caso.
    ratón_x (mouse_x)
    Abcisa del punto en donde está el cursor del ratón, en las coordenadas propias del espacio. Sólo se registra el valor cuando el ratón está apretado o si el espacio tiene activada la casilla de _sensible_a_los_movimientos_del_ratón.
    ratón_y (mouse_y)
    Ordenada al origen del punto en donde está el cursor del ratón, en las coordenadas propias del espacio. Sólo se registra el valor cuando el ratón está apretado o si el espacio tiene activada la casilla de _sensible_a_los_movimientos_del_ratón.
    clic_izquierdo (mouse_clicked)
    Vale 1 sólo cuando se ha hecho un clic izquierdo sobre el espacio. Vale cero en cualquier otro caso.
    _selected_control_()
    Da el número del control gráfico que está seleccionado. La numeración corresponde al orden en que los controles gráficos aparecen en la lista de controles.

    Para cadenas

     _AnchoDeCadena_(str, font, style, size)  Da el ancho en número de píxeles de la cadena str, font especifica el tipo de letra que se usa (‘Monospaced’, ‘Serif’ o ‘SansSerif’), style indica si la letra esta en negritas o italica (‘PLAIN’, ‘ITALIC’, ‘BOLD’, ‘ITALIC+BOLD’ y ‘BOLD+ITALIC’) y size es el tamaño de la letra en pixeles
     &sup2  Al incluirla en una cadena, devuelve la expresión adjunta como el cuadrado; por ejemplo, la cadena ‘x&sup2’, es mostrada en el navegador como x2.
     &sup3  Al incluirla en una cadena, devuelve la expresión adjunta como el cuadrado; por ejemplo, la cadena ‘x&sup3’, es mostrada en el navegador como x3.

    Para controles de audio y vídeo

    ID.play()

    Inicia el vídeo o el audio, donde ID es el identificador del control.

    ID.pause()

    Hace una pausa en el vídeo o el audio, donde ID es el identificador del control.

    ID.stop()

    Detiene el vídeo o el audio, donde ID es el identificador del control.

    Para espacios 3D

    observador

    Distancia (en pixeles) aparente del origen al observador.

    rot.y

    Ángulo de giro (en grados) del espacio respecto al eje y a partir de la posición por defecto en la que el eje x apunta hacia el observador (ligeramente hacia abajo), el eje y hacia la derecha y el eje z hacia arriba.

    rot.z

    Ángulo de giro (en grados) del espacio respecto al eje z a partir de la posición por defecto en la que el eje x apunta hacia el observador (ligeramente hacia abajo), el eje y hacia la derecha y el eje z hacia arriba

    Para espacios algebráicos

    _reiniciar_
    Es una variable para que el programador de la escena, cuando lo encuentre conveniente, ordene una reinicialización del espacio algebraico, eliminando todas las manipulaciones que hubiera hecho el usuario hasta entonces. Para ello basta asignar a esta variable el valor 1. Una vez hecha la reinicialización la variable recupera automáticamente el valor de 0 que tiene de inicio.
    _ecuación_
    Es una variable que contiene la cadena que define la ecuación que se propone para ser manipulada en la primera línea del espacio algebraico. Si se asiga una nueva cadena (entre comillas sencillas) con otra expresión o ecuación, el programa automáticamente reinicializa el espacio algebraico proponiendo la nueva ecuación.

    Para controles númericos

    _TexT_

    (En desuso) Si se asigna la cadena ‘_TexT_’ como valor inicial a un control de texto, éste interpreta todo lo que se escriba en él como texto y no como un número o una expresión a evaluar, que es el comportamiento por omisión. Ya no es necesario usar esto pues ahora hay un atributo de los campos de textos específico para tal propósito: solo texto.
    _._ o _nada_ o _void_
    Cualquiera de estas cadena, por ejemplo ‘_nada_’, asignada como nombre a un pulsador, hace que la etiqueta del pulsador desaparezca. Esto sólo es necesario es pulsadores, en los otros controles numéricos basta dejar el atributo del nombre vacío. Si se deja vacío el nombre en un pulsador, la etiqueta toma el nombre del id.
    _no_
    VACIO.GIF
    Si se da este nombre a una imagen de un botón, el botón se vuelve totalmente transparente, aunque no haya tal imagen.

    Para controles gráficos

    .activo (.active)
    Sufijo que agregado al nombre de un control gráfico produce una variable que vale 1 si el control gráfico en cuestión está seleccionado y cero si no está seleccionado.
    Para el Registro de Actividades de Descartes (RAD)
    _ACIERTOS_
    Es el número de aciertos en una actividad y es una variable que se registra en el RAD después de cada actividad. Si el creador de la escena no le asigna ningún valor, queda con valor 0.
    _ERRORES_
    Es el número de errores en una actividad y es una variable que se registra en el RAD después de cada actividad. Si el creador de la escena no le asigna ningún valor, queda con valor 0.
    _NOTA_
    Se registra en el RAD. Se calcula como

    100*_ACIERTOS_/_TOTAL_.

    Si el autor de la escena le asigna otro valor, en el RAD se registrará ése valor asignado por el autor.

    _TOTAL_
    es una variable a la que se le asigna la suma de _ACIERTOS_ y _ERRORES_
    Aunque _TOTAL_ está reservada, su valor no se registra en el RAD.
    _EQUIPO_
    Adquiere un valor de cadena con el nombre del ordenador que se está usando. A continuación se presentan algunos ejemplos de los valores que adquiere la variable _EQUIPO_ en diferentes circunstancias.
    _CONECTADO_AL_RAD_
    Adquiere el valor 1 cuando la escena está conectada al RAD y está registrando los detalles de la actividad.
    _ALUMNO1_
    _ALUMNO1_, _ALUMNO_2, etc… son los nombres de los alumnos registrados como equipo de trabajo que se supone están realizando la actividad. Son los alumnos a quienes se les va a registrar como protagonistas de la actividad.

    Otros

    e
    2.7182818284590452653602874…
    pi (o la letra griega Pi)
    3.14159…
    _Eval_( c )
    Si el argumento c es una constante cuyo valor es una cadena que representa una expresión matemática, esta función devuelve la evaluación de esa expresión. Por ejemplo, si c=’sen(pi/6)’ entonces _Eval_(c)=0,5 .

    En el argumento de esta función se contempla que puedan aparecer números bien con coma o bien con punto decimal.

    _Num_( var )
    Si el argumento c es una constante cuyo valor es una cadena que representa una expresión decimal, esta función devuelve el número correspondiente a dicha expresión decimal. En cualquier otro caso devuelve NaN (No es un número). Por ejemplo, si c=’3.14159′ entonces _Num_(c)=3,14159 . Sirve para saber si el usuario escribió un resultado numérico directamente sobre un campo de sólo texto, para evitar que use el campo de texto como calculadora.

    En el argumento de esta función se contempla que puedan aparecer números bien con coma o bien con punto decimal.

    .long
    Sufijo que agregado al nombre de un vector devuelve el número de elementos del vector.
    .filas
    Sufijo que agregado al nombre de una matriz, devuelve el número de filas de la matriz.
    .columnas
    Sufijo que agregado al nombre de una matriz, devuelve el número de columnas de la matriz.

    Las literales x,y,n,u y v tienen un significado especial dentro de las expresiones que definen algunos objetos gráficos.

    x e y juegan el papel de la abscisa y la ordenada de puntos en el plano en el objeto gráfico «ecuación»
    También estas mismas literales juegan el mismo papel en las expresiones que determinan las constricciones de los controles gráficos.

    n juega el papel de la variable de una sucesión en el objeto gráfico «sucesión» y toma sólo valores enteros.

    u y v juegan el papel de parámetros en la definición de las ecuaciones paramétricas de las superficies en 3D donde toman valores reales entre 0 y 1. Las literales x, y y z en este caso también tienen el significado especial de ser las coordenadas de los puntos de la superficie.
    x, y y z se expresan paramétricamente en términos de u y v para representar todos los puntos de una superficie.

    t y s no son literales reservados.

    El literal t suele usarse para definir las ecuaciones paramétricas de una curva en el plano o de una curva en el espacio. Sin embargo, a diferencia de u y v para las ecuaciones paramétricas de una superficie, este literal puede cambiarse por cualquier otra letra o palabra y su rango de definición puede ser cualquiera y no necesariamente el intervalo [0,1].

    Análogamente el literal s que se usa para definir las familias de gráficos en 2 D no es obligatorio, el autor de una escena puede cambiarla a su antojo y por tanto no es una variable reservada.