Mathématice, intégration des Tice dans l'enseignement des mathématiques  
Sommaire > N°36 - septembre 2013 > DGPad - (Parte 2) : Scripts geométricos

DGPad - (Parte 2) : Scripts geométricos
Moteur de recherche
Mis en ligne le 30 juin 2013, par Martin Acosta, Yves Martin

Después de un sobrevuelo goemétrico de DGPad parte 1 del artículo, abordamos ahora la extensión natural de su utilización que consiste en modificar los scripts de las figuras y escribir cripts interpretables por DGPad.
Este artículo propone un primer sobrevuelo de las posibilidades en forma de algunos ejemplos bastante usuales. En cada caso haremos las precisiones necesarias sobre la sintaxis.

Actualización Julio 2013
Ahora en Android el navegador estándar puede usarse de manera eficaz para DGPad.
Puede utilizarse Chrome o Firefox, aunque este último es menos rápido para el JavaScript.

Añadir JavaScript a las figuras de DGPad

Como la figura DGPad es en realidad un archivo JavaScript (puesto en forma .txt para poder exportarlo), toda modificación JavaScript de una figura es interpretable por DGPad. Por supuesto, en esta primera versión no hay gestión de los scripts como en CaRMetal, sino que hay que intervenir manualmente el archivo de la figura inicial.

Utilizando scripts muy clásicos para los programadores, ilustraremos algunos usos específicos de DGPad, y presentaremos sintaxis o técnicas específicas.

Sintaxis
La sintaxis contiene todas las palabras claves de la geometría, las mismas de los CaRScripts de CaRMetal (Point, Line, Segment, PerpendiculrBissector Circle, Circle3pts, etc). A este vocaulario JavaScript específicamente escrito para DGPad, utilizado por las construcciones geométricas, vamos a añadir manualmente todo complemento en JavaScript estándar, y en particular los tests y los bucles.

Script y exportación
Si un script produce una figura en DGPad, se exporta como una figura de DGPad. Esto significa que queda descrita con los objetos geométricos de base : no se exporta un bucle, sino el producto del bucle.

Podemos esperar que una versión futura traerá un editor de script.

Scripts geométricos
Como actualmente no pueden utilizarse números ni coordenadas dinámicas, el interés de algunos scripts presentados aquí es la mirada geométrica que se impone en situaciones en las que normalmente utilizaríamos el enfoque analítico.
El cambio de marco es a veces sorprendente ...


Organización de esta segunda parte del artículo (regresar a la parte geométrica)

1. Sierpinsky : dos tratamientos de la función Polígono..
2. Koch Geométrico : las sutilezas de un uso de macro dentro de un script.
3. Iteración de un cuadrado con un cursor : utilizar una macro para evitar el cursor que es necesariamente geométrico.
4. Cesàro geométrico : algoritmo de la curva de Cesàro, pero desde un punto de vista geométrico. Cursor circular.
5. Hilos recursivos : cuadro de hilos con función genérica recursiva. Aplicaciones.
6. Galeria : Otros ejemplos.

Sierpinsky

Script transferido de CaRMetal : el triángulo de Sierpinsky

Nos proponemos realizar la figura que aparece en esta copia de pantalla :

Un script de CaRMetal correspondiente

Es una versión monocroma. Los vértices son equivalentes, sólo se llama una vez la función principal.
Para obtener la figura coloreada hay que particularizar los vértices y llamar tres veces la función principal.

El script DGPad

Comentario sobre este script

• Parte 1 : los puntos iniciales
Comenzamos con 3 puntos y sus puntos medios, luego trazamos los segmentos marrón para diferencias los vértices por colores.
El comienzo de la figura se hace con el software. No es necesario nombrar los objetos "para el software" : sPQ recibirá un nombre automático de DGPad.
Igualmente el estilo de los objetos se redacta de manera mínima : "h:1" significa que el objeto está oculto (por "Hide=True").

• Parte 2 : la función Sierpinsky
Es estándar puesto que está completamente en JavaScritp como para la versión CaRMetal : tomamos los puntos medios de los tres puntos, construimos el polígono de esos tres puntos (ver parte siguiente), luego aplicamos Sierpinsky a uno de los vértices iniciales y a los otros dos puntos correspondientes, por permutación circular.
Como decidimos poner colores diferentes por vértice, diferenciamos los colores llamando tres veces el procedimiento Sierpinsky, una por cada vértice.

• Parte 3 : La cadena de caracteres para Polígono

En esta parte volvemos a las dos líneas que construyen y muestran el polígono, y mostramos otra manera de proceder.

vpol=i+","+j+","+k ;
LePoly=Polygon("LePoly",vpol) ;STL(LePoly,couleur) ;

La función Polígono espera una cadena de caracteres de punto, algo como Polygon("A, B, C, D").

Aquí vemos sólo una manera de construir una cadena de caracteres conforme a la sintaxis de la función Polygon que consiste en añadir variables puntos separadas por comas. Así se asigna a la variable vpol el tipo "string" (cadena de caracteres).

Otra manera de proceder - Precisión de los Scripts

Si, con variables JavaScript, colocamos datos en una cadena de caracteres, entonces hay que pasar esas variables por contenido, es decir, tradicionalmente, con la sintaxis _x para una variable x. También se dice que se parsó la variable.
Como para CaRMetal, al parsar una variable pasa por contenido al software, y en el caso de un punto, pasa su nombre - una cadena de caracteres.

Pero hay un problema en DGPad, por lo que tenemos que escribir este párrafo. Por el momento, y durante un tiempo, sólo se pueden parsar las variables globales (en todo caso para Polygon).

La solución sonsiste en inicializar variables globales (en 0 basta, aunque despues se volverán puntos) luego copiar las variables locales en esas variables globales y hacer el polígono con ellas. De manera que las dos líneas analizadas anteriormente pasan a ser :

ig=i ;jg=j ;kg=k ;
LePoly=Polygon("LePoly","_ig,_jg,_kg") ;STL(LePoly,couleur) ;

Y en el cuerpo del programa, antes de la primera llamada a Sierpinsky, debemos definir e inicializar esas tres variables globales por :

ig=0 ;jg=0 ;kg=0 ;

Es otra forma de escribir un polígono, que puede ser útil por ejemplo cuando una parte de los puntos es fija y debemos utilizar algo mixto como Polygon("A,_x,C,_y").

• Parte 4 : Tratamiento del nombre en los bucles

El nombre externo del polígono se construye a partir de la raíz LePoly que está automáticamente indexada por el software como todos los nombres de los otros objetos. Así que, incluso dando solamente el nombre LePoly se da la raíz de un nombre que será indexado en LePoly1, LePoly89, etc.
En otras palabras, no es necesario, como con los CarScripts de CaRMetal, dar un nombre del tipo "LePoly"+i donde i es una variable de bucle, por ejemplo un contador cualquiera.

Por supuesto, podríamos querer indexar objetos a su manera para tener acceso a ellos en un algoritmo, pero ese es otro tema.

Variante sobre ese script propuesto como ejercicio

Modificar el script para que los colores no estén en las regiones de los vértices A, B y C sino que esos vértices orienten a un color : cuando un triángulo intermedio esté en la dirección de un vértice, tomará el color de ese vértice. Esto produce :


Balance de este primer ejemplo

• hay que retener el método de construcción de cadenas de caracteres a partir de puntos para evitar la utilización de variables parsadas.
• vimos que si las variables locales de una función deben ser parsadas para ser utilizadas en un objeto geométrico - en una cadena de caracteres - se utilizan variables globales que toman los valores locales para la construcción de ese objeto geométrico.
• en una interación, basta con dar un nombre genérico - un prefijo - a los objetos geométricos, y quedarán indexados automáticamente por el software.

Regresar a la barra de pestañas

Koch Geom

Koch geométrico : ejecutar una macro en un script

Hemos visto que, en el uso estándar de las macros, éstas se aplican y no se llaman.

Por supuesto, si entramos al código de una figura, podemos llamar una macro y ejecutarla. La sintaxis es la siguiente :

t=$macros["NomDeLaMacro"].exec(LesObjetsInitiaux) ;

ejemplo : t=$macros["Div3AB_parC"].exec(P,Q,R) ;

La macro se llama con su nombre y se ejecuta con objetos iniciales dados.

Advertencia

Es importante tener una única variable para el retorno de los datos de la macro. Aquí la macro devuelve dos puntos, pero una sintaxis de estilo Python como

[u,v]=$macros["Div3AB_parC"].exec(P,Q,R) ;

funcionará correctamente en Firefox cuyo JavaScript sabe interpretar la afectación paralela, pero no funcionará en Chrome ni Safari.

Especificidad de una macro llamada por un script

.

En utilización estándar, habrán podido notar que las macros no contienen estilos de los objetos intermedios : en la aplicación de las macros, simplemente están ocultos. Eso significa que las macros no pueden conservar los atributos de los objetos (color, tamaño, etc) en el momento en que se construyen

Al llamar una macro en un script, ya no se pasa por el procedimiento estándar de construcción de objetos intermedios. Eso significa que hay que ocultar "a mano" todos los objetos intermedios en el cuerpo de la macro.

Veamos eso de manera concreta en esta otra figura clásica, la curva de Koch. El siguiente script produce esta figura :


Comentarios sobre el código

Para construir la curva de Koch hay que comenzar dividiendo el segmento en 3. Como no tenemos datos numéricos utilizables, la macro es geométrica (Tales) y necesita un punto exterior C para dividir el segmento AB : poner el punto exterior en el corazón de la macro evita construir muchos puntos intermedios si ese punto C tuviera que construirse a partir de A y B.

La macro Div3AB_parC devuelve los dos puntos de la división. Vemos que cada punto intermedio queda oculto en la macro. El conceptor de la macro debe añadirlos. En la práctica se hace la macro en DGPad, se recupera el código con la herramienta exportación, y se continúa en un tratamiento de texto.

La función KochGeom tiene tres parámetros, P y Q del segmento PQ al que se aplica y un punto R para utilizar la macro Div3AB_parC.
Comienza dividiendo PQ en 3. La variable t es una lista, los puntos se recuperan por t[0] y t[1]. Luego se construye un triángulo equilátero.
Siempre quedará orientado de la misma manera a causa de la selección 0 de las intersecciones de los círculos.

Llamado recursivo de KochGeom : luego se llama la función 4 veces, para cada segmento. Para esta llamada, utilizamos un tercer punto no alineado con los dos primeros para la aplicación de la macro.

El cuerop principal del script : construimos primero un punto C no alineado con A y B para poder aplicar la macro, y lanzamos la aplicación recursiva.

El cuerpo del texto parece mal organizado (como en el ejemplo 1), es solamente para mostrar que casi todo es posible.

Balance de este ejemplo

• En un script pueden llamarse macros. En este caso la sintaxis es del tipo : t=$macros["NomDeLaMacro"].exec(SesParametres) ;
• Por eso conviene ocultar a mano todos los objetos intermedios de la macro.
• Si la macro devuelve un solo objeto, t es ese objeto.
• Si no t es una lista que contiene los objetos, que se recuperan con t[0], t[1], etc.

Regresar a la barra de pestañas

Cursor

Iteración de una figura dependiente de un cursor

Ahora nos proponemos hacer la siguiente figura, en el contexto de DGPad de abril 2013 sin números y sin coordenadas :



Construcción preliminar

Por eso hacemos una primera construcción en DGPad : el cursor, el cuadrado inicial y el primer punto A1 para preparar la primera iteración.

El cursor va de 0 a 0,2 y cuando está en 0 queremos que el punto A1 esté en A. Comenzamos por una construcción como esta :

Advertencia : esto es solo una ilustración : no es posible usar números decimales como nombre de puntos !

Ver el código de la construcción preliminar

Macro-construcción "CarreItere" : determinación de A2

A partir del primer cuadrado y de A1 tratamos de construir el siguiente cuadrado, de centro O, de vértice A1 y sobretodo el punto A2 que prepara la siguiente iteración. La idea es no utilizar el cursor para evitar los puntos intermedios superfluos reconstruidos en cada iteración.

La figura está hecha en DGPad, transformada en macro, y luego adaptada para ser llamada en una iteración (adaptada = ocultar los objetos intermedios).

À partir del primer cuadrado (O, A, B, C, D), del segmento BC y del punto A1 construido anteriormente, la macro devuelve los puntos del siguiente cuadrado, lo dibuja (con un color preciso), y devuelve sobre A1B1 el siguiente punto A2.

Entonces basta con hacer una iteración de esta macro.

Iteración de la macro

Se hace en un simple bucle

Estas pocas líneas son el corazón de la figura, ese es el interés de la iteración.

En la práctica, en el corazón del programa(//Geometry) suprimimos la parte que sirvió para hacer la macro CarreItere para aplicar la iteración desde el comienzo.

La falta de números y coordenadas nos obliga a buscar otras estrategias : el cambio de marco nos obliga a reconsiderar nuestras prácticas.

Por ejemplo el método utilizado en CaRMetal : aunque es el mismo principio - construcción del nuevo cuadrado, iteración - el procedimiento es analítico y no geométrico. Es más corto, mas inmediato gracias al cálculo, no necesariamente más fácil.

Balance de este tercer ejemplo

Hemos visto :

• La utilización geométrica de un cursor, sin datos numéricos
• Una construcción preliminar que permitirá una iteración autónoma, en el interior de la figura, sin referencia al cursor.
• La construcción de una macro más compleja que utiliza los puntos de la figura para independizarse del cursor externo.
• El principio de iteración clásica
• La comparación con la versión analítica (CaRMetal) todavía no disponible en DGPad en el momento de la redacción de este artículo.

Regresar a la barra de pestañas

Cesàro Geom

Recursividad y cursor : Construcción geométrica de la curva de Cesàro

Se trata de una variante de la curva de Koch, en la que el triángulo equilátero se vuelve isósceles. Los 4 lados - antes y despues del triángulo y del triángulo - siempre son iguales, y variables y dependen del ángulo del triángulo isósceles.

La version CaRMetal - que l’on peut lancer en ligne ici - tiene algo especial : una vez comenzado el script, es posible modificar el ángulo durante la ejecución del script, posibilitando nuevas representaciones visuales de la recursividad. Aquí hay dos fotos de esto :

En este script calculamos las coordenadas de los tres extremos del triángulo. Noten la técnica que consiste en poner los cosenos, senos y longitudes en una cadena de caracteres y llamar luego en el script esas variables por contenido. Ese contenido no es un valor numérico como podría creerse, sino una expresión algebraica - el ’contenido’ de la cadena - y de esta manera se envían las expresiones al software, como lo ilustramos con un pantallazo de las coordenadas de un punto.

La version DGPad

Debe diseñarse geométricamente porque no contamos con coordenadas ni expresiones algebraicas utilizables dinámicamente.

Hay que tener una mirada diferente sobre la figura de base, que resulta ser más simple, aunque necesita muchos más objetos intermedios. Miremos la construcción en el primer nivel :

• El ángulo ya no es un cursor lineal, está definido por el ángulo IOM, con M variable sobre un cuarto de círculo.
. • El vértice V del triángulo del nivel 1 está sobre la mediatriz de AB.
• Como el ángulo WUV es el ángulo IOM y AUV es isósceles, el ángulo UAV es igual a IOM/2. Para construir la dirección AV, podemos dividir en cuatro IOM - es el ángulo IOP - y componer dos simetrías axiales de ejes que pasan por a y paralelos a OI - en verde - y OP - en rojo.
• Así encontramos V como intersección de dos rectas y U como intersección de AB y la mediatriz de A y U. W es simétrico de Y con respecto a la mediatriz de A y B ya construida para encontrar V.

Así tenemos una construcción geométrica del primer paso de la curva de Cesàro. Luego aplicamos una recursividad como en los CarScripts. Lo cual da :

La versión analítica (CarScript) permite ir a profundidad 4. Con la versión geométrica es mas prudente detenerse en profundidad 3.

Aquí está el resultado. Pero como no hay todavía un lanzador de scripts en DGPad, solo es posible ver y manipular la figura terminada, no podemos lanzar el script en línea como se hace en CaRMetal.



Ver el código completo del script

Regresar a la barra de pestañas

Hilos recursivos

Cuadros de hilos con función recursiva

Las versiones iterativas

Hacer cuadros de hilos es algo muy simple si se sabe álgebra. Puede hacerse con la elegancia de la notación de Grassmann con secuencias de Geogebra :

o de manera más clásica (escritura analítica estandarizada) con CarScripts :

La version DGPad iterativa de Alain Busser

Comme dans cette version de DGPad, on ne peu guère que prendre que des milieux, l’idée est venue à Alain Busser de faire des tableaux de fils en itérant les milieux : soit en partageant les segments en une puissance de 2. DGPad existait alors depuis deux semaines seulement ...

Como en esta versión de DGPad apenas podemos tomar los puntos medios, Alain Busser pensó en hacer cuadros de hilos iterando los puntos medios : dividiendo los segmentos en potencias de 2. DGPad sólo tenía dos semanas...

Tuvo que construir un algoritmo que escribía "horizontalmente" los nombres de los puntos mientras los construía "verticalmente". Hermoso ejercicio de estilo - para reutilizar en formación por ejemplo - que podemos ver en Este artículo IREM de La Réunion (segunda pestaña)

Yo le propuse una versión recursiva y redacté la siguiente pestaña, que retomo aquí desarrollándola un poco más.

Alain propone, en una cuarta pestaña, una versión genérica para un paso cualquiera utilizando el teorema de tales...

El principio de una estrategia recursiva

Sean tres puntos O, A, B, queremos construir un cuadro de hilos entre OA y OB. Para hacerlo :

Tomamos los puntos medios I y J de los dos segmentos, construimos el segmento IJ.
Luego iteramos - de manera recursiva - lo que acabamos de hacer utilizando los segmentos OI, JB, luego IA, OJ.

Lo que produce la función recursiva :

Et pour la figure associée


Algunas aplicaciones

Por supuesto a partir de esta primera construcción cualquiera puede dar curso libre a su fantasía :



Ejercicio de compilación

Podemos usar cuadros de hilos y cursores, como en esta figura :


Notese que estas figuras no están optimizadas pues la llamada recursiva de la función ’hilos’ crea dos veces cada punto de un segmento.

Podríamos rehacerla nombrando los puntos y economizar casi la mitad de los puntos creados.

Regreso a la barra de pestañas

Galeria

Iteración sobre pentágono


Ejemplo de cuadro de hilos sobre cubo en perspectiva caballera


Ejercicio de estilo : hacer esta nefroide...


... en vez de esta


regresar a la presentación del aspecto geométrico de DGPad

Advertencias de uso

Sitio : www.dgpad.net

En Android, puede usarse el navegador estándar de la tableta, o también Chrome o Firefox (que es menos rápido)
En iOS, utilizar Chrome o Safari
En un PC : Firefox, Chrome, Safari (no IE).

Descargar scripts de este artículo (13 de mayo 2013)


Documents associés à l'article
  Scripts DGPad Sesamath531   |   (Zip - 34.5 ko)
Réagir à cet article
Vous souhaitez compléter cet article pour un numéro futur, réagir à son contenu, demander des précisions à l'auteur ou au comité de rédaction...
À lire aussi ici
MathémaTICE est un projet
en collaboration avec
Suivre la vie du site Flux RSS 2.0  |  Espace de rédaction  |  Nous contacter  |  Site réalisé avec: SPIP  |  N° ISSN 2109-9197