Ejemplos de CindyScript
Uno de los elementos más atractivos de Cinderella 2, es la inclusión de Cindyscript, un lenguaje de programación orientado a la integración con el entorno de geometría.
Si bien la mayoría de las herramientas de construcción permiten ya una gran variedad de posibilidades, Cindyscript permite ampliar significativamente el espectro de acciones posibles, y además añade un componente sumamente interesante de un punto de vista pedagógico.
A continuación incluyo algunos ejemplos, para en un futuro cercano elaborar más sobre los alcances didácticos.
Cindyscript es un potente lenguaje, relativamente simple de aprender y sumamente integrado al entorno de geometría. Fue diseñado principalmente para permitir mayores niveles de interacción con las construcciones geométricas, como también para permitir a los usuarios extender sus funcionaidades, sin embargo, también puede ser utilizado como un lenguaje de programación independiente para resolver problemas.
La lógica y sintaxis es muy similar a Javascript, aunque existen una serie de elementos muy propios de la geometría dinámica. Por ejemplo, se cuenta con típicas estructuras de control como los “if” y “while”, pero también cuenta con ideas más específicas como “connect”, que permite conectar un conjunto de puntos.
En fin, en este post no intentaré describir el detalle de Cindyscript, de manera que recomiendo por mientras la documentación oficial, en la siguiente dirección: http://doc.cinderella.de/tiki-index.php?page=CindyScript.
1. Teselación radial
Recargar applet (si se demora en cargar o para reiniciar la construcción)
vertices=[A,B,C,D];
repeat(10,j,
repeat(24,i,
drawpoly(vertices,color->hue(i/24));
rotate(15°););
scale(0.8);)
Este es un buen ejemplo de cómo de puede interactuar con los objetos geométricos. A partir de los puntos A, B, C y D, se dibuja el polígono asociado, se rota en 15º (24 veces) y luego se reduce a un 80%.
Como consecuencia, se forma una especie de teselación radial
2. Conectar puntos
Recargar applet (si se demora en cargar o para reiniciar la construcción)
n:=round(20*dist(C,B)/dist(A,B))+3;
f(x):=[5*sin(x),5*cos(x)];
steps=2*pi*(1..n)/n;
pts=apply(steps,f(#));
segs=pairs(pts);
drawall(segs,alpha->0.9);
drawall(pts,size->4);
Text0.text=”n = “+n;
La primera línea de este código redondea la razón en la que C divide al segmento AB, de manera que C es una especie de deslizador. Luego, los puntos verdes se distribuyen circularmente.
Lo más notable de este ejemplo, es la posibilidad de conectar todos los puntos, con el comando “pairs”, que crea todos los pares de objetos (puntos) posibles y con “drawall” que dibuja todos los objetos de una determinada lista.
3. Animación de una reflexión
Recargar applet (si se demora en cargar o para reiniciar la construcción)
iniciales=[A,B,C,D];
anim=[G,H,K,L];
finales=[M,N,O,P];
repeat(100,r, start->0,stop->1,
repeat(4,i,
take(anim,i).xy = r * ( take(finales,i).xy – take(iniciales,i).xy ) + take(iniciales,i).xy;);
repaint();
);
Los dos ejemplos anteriores están asociados a un evento llamado “move”, que se ejecuta al mover algún objeto. Este caso es distinto, está asociado al “clic” sobre el botón “animar”.
Esta es otra característica sumamente potente, pues permite que distintos objetos en una escena generen distintas acciones en una misma construcción.
En este caso, al hacer clic en el botón, los puntos de la lista “anim” [G,H,K,L] se trasladan desde los de la lista “iniciales” [A,B,C,D] hacia los de la lista “finales” [M,N,O,P].
4. Traslación triple
Recargar applet (si se demora en cargar o para reiniciar la construcción)
r=(G.x – E.x);
Text0.text=”r = “+r;
iniciales=[H,K,L,M,N,O];
finales=[P,Q,R,S,T,U];
if(r<1,v=r*(B.xy-A.xy),
if(r<2,v=(r-1)*(C.xy-B.xy)+(B.xy-A.xy),v=(r-2)*(D.xy-C.xy)+(C.xy-A.xy)));
repeat(6, i, take(finales,i).xy = take(iniciales,i).xy+v);
En años anteriores mostré cómo realizar animaciones compuestas en Geogebra, en el sentido de con un sólo deslizador mover una figura siguiendo una ruta descrita por varios vectores.
Aquí tenemos una alternativa, básicamente la lógica consiste en, dependiendo del valor del deslizador, trasladar según el vector AB, BC ó CD.
5. Curva de Bézier
Recargar applet (si se demora en cargar o para reiniciar la construcción)
Px=[A.x,5*B.x,10*C.x,10*D.x,5*E.x,F.x];
Py=[A.y,5*B.y,10*C.y,10*D.y,5*E.y,F.y];
f(x):=sum(0..5,i,take(Px,i+1)*((1-x)^(5 – i))*(x^i));
g(x):=sum(0..5,i,take(Py,i+1)*((1-x)^(5 – i))*(x^i));
plot([f(x),g(x)],start->0,stop->1,steps->100,color->(1,0,0),size->2);
Las Curvas de Bézier son un tanto complejas de construir, especialmente cuando se trata de muchos puntos iniciales.
En este caso, las ecuaciones (funciones “f” y “g”) paramétricas están definidas a partir de las coordenadas Px y Py, de manera que adaptarla a más puntos, requeriría sólo modificar las dos primeras líneas de código.
6. Algoritmo de De Casteljau
Recargar applet (si se demora en cargar o para reiniciar la construcción)
Q=[A,B,C,D,E,F];
n=6;
r=dist(A,G)/dist(A,B);
repeat(n,i,
connect(Q,color->[1,1 - i/n,1 - i/n]);
P=Q;
repeat(n – i,j,
Q_j=r * (take(P,j+1) – take(P,j)) + take(P,j);
draw(Q_j,color->[1,1 - i/n,1 - i/n]);
);
);
H.xy=take(P,1).xy;
Otra aproximación a las curvas de Bézier, es el Algoritmo de De Casteljau, que se basa en la división sucesiva de los segmentos del polígono de control en una razón dada.
Esta implementación del algoritmo trae como resultado final el punto H, que describe una curva de Bézier de grado 5.
Nuevamente tenemos la ventaja de que el código se adapta a cualquier cantidad de puntos iniciales, tan sólo modificando la primera línea.
Bueno, con estos ejemplos trato de ilustrar cómo la inclusión de programación en un procesador geométrico tiene varias ventajas. En primer lugar podemos resolver problemas nuevos, ampliando las funcionalidades del procesador geométrico a un rango mayor de problemas. Por otro lado, es posible enfrentar los problemas matemáticos de otras perspectivas, como numéricas o algebraicas, pudiendo, como se ilustra en los últimos ejemplos, buscar soluciones más genrales a problemas matemáticos interesantes.
Es interesante, y quizás aun un poco nuevo en términos escolares, el enfoque que se le puede dar al estudio de la geometría y afines, ahora incorporando la potencia de la programación (estructurada, al menos), ideas que ya están apareciendo en otros procesadores geométricos como Geogebra 4.0 Beta.
En siguientes posts espero indagar un poco más en este último punto.







