Para información general, y referencia del lenguaje de programación GeoScript, vea el Manual de GeoScript.
Contenido:
Capítulo 1: Un triángulo sencillo
Capítulo 2: Dibujos básicos con rectas
Capítulo 3: Marcar objetos
Capítulo 4: Círculos
Capítulo 5: Líneas notables en un triángulo;
Mostrar texto
Capítulo 6: El procedimiento
"CONSTRUCTION"
Capítulo 7: Animaciones
Capítulo 8: El procedimiento
"INTERACTION"
Capítulo 9: Limitar movimientos en animaciones e
interacciones
Capítulo 10: Un menú
Capítulo 11: Cambiar los estilos y colores
predefinidos
Capítulo 1: Un triángulo
sencillo
(Introduciendo POINT, LINE, WAIT, END)
Comencemos con una construcción muy fundamental: un triángulo. Este es el programa que hace esto:
POINT A, 100,360 'Este punto recibe las propiedades predefinidas. POINT B, 400,360, 2,(255,0,0) 'Estilo 2, rojo, grosor predefinido. POINT C, 300,85, DEFAULT, DEFAULT, 40 'Grosor 40. a = LINE B,C 'Esta recta recibe las propiedades predefinidas. b = LINE A,C, &HF0F, (0,0,255) 'Recta con rayitas, azul, grosor predefinido. c = LINE A,B, &H101, DEFAULT, 5 'Recta punteada, grosor 5. WAIT 'El usuario tiene que hacer clic en un botón para salir. END |
Las partes después de una comilla ' son comentarios. La ' indica que lo que sigue no debe interpretarse como una instrucción del programa. El intérprete de GeoScript trata tales comentarios como si simplemente no estuvieran aquí.
Primero inicializamos tres puntos en la pantalla. Esto se hace con la instrucción POINT, que tiene la síntaxis siguiente:
POINT nombre, x, y [, estilo, color, grosor]
nombre puede ser cualquier nombre que eliges, excepto
una palabra clave de GeoScript. O sea, no puedes llamar
"point" a tu punto, por ejemplo. (Tampoco puedes
llamarlo "line"; pero supongo que de toda manera no
harías eso.) x y y son las coordenadas del
punto en la pantalla.
Si usaste algún otro lenguaje de programación anteriormente,
entonces sabes que los lenguajes de programación usan variables
para almacenar datos como números, cadenas de texto, etc. Para
asignar un valor numérico a una variable, escribirías algo
como: a = 5, donde "a" es el
nombre de la variable que recibe el valor 5.
Esto es exactamente lo que hace la instrucción POINT.
"A" (en el programa ejemplo) es el nombre de una
variable - en este caso un punto -, y el par de coordenadas
"100,360" es el valor que asignamos a A.
Pero GeoScript es un poco diferente porque no tiene variables
numéricas. Puesto que es un lenguaje para programas de
geometría, sus variables representan objetos geométricos. Hay
tres tipos de datos (o sea, tipos de variables) en GeoScript:
puntos, rectas y círculos. (Para una explicación más
detallada de estos tipos y sus propiedades, vea la sección
correspondiente en el Manual
de GeoScript.)
Un nombre y un par de coordenadas es todo lo que necesitamos para inicializar un punto. Nota que las coordenadas de la pantalla están "de cabeza": el valor de y aumenta desde arriba hacia abajo. - Sin embargo, hay tres valores adicionales que son opcionales:
- estylo define la forma como un punto se muestra en
la pantalla. Si no especificas estilo, el punto se
mostrará como una cruz delgada. El punto B en nuestro ejemplo se
mostrará como un círculo relleno (estilo 2).
- color en un conjunto de tres números (rojo, verde,
azul). Cada uno de estos tres componentes puede asumir un valor
desde 0 (oscuro) hasta 255 (intensidad máxima). Si no
especificas color, el punto se dibujará negro. - De
paso sea dicho, los valores de color son las únicas expresiones
en GeoScript que usan paréntesis.
- grosor es el tamaño del punto como es dibujado en la
pantalla. Para el estilo predefinido, indica el largo de las
líneas de la cruz. Para el estilo 2, indica el diámetro del
círculo.
(Para una explicación completa de los estilos, vea la sección
correspondiente en el Manual
de GeoScript.)
Si deseas especificar solamente el grosor, pero dejar el estilo y el color en su estado predefinido, puedes escribir DEFAULT en lugar de estos parámetros, como en la tercera línea del ejemplo arriba:
POINT C, 300,85, DEFAULT, DEFAULT, 40
Poner un valor de -1 tiene el mismo significado como DEFAULT.
Cuando ejecutas este programa, notarás que los puntos
aparecen en la pantalla uno por uno, con un tiempo de espera de
dos segundos entre punto y punto. Puedes saltar estos tiempos de
espera, presionando cualquier tecla. (Más tarde veremos maneras
de poner construcciones en la pantalla inmediatamente, cuando
hablaremos sobre los procedimientos CONSTRUCTION.)
Para más detalles sobre la interfaz del ususario de GeoScript,
vea la sección "Disposición
de la pantalla" del manual de GeoScript.
- Ahora unimos los puntos con rectas. Esto lo logramos con la instrucción LINE. Su síntaxis es:
recta = LINE punto1, punto2 [, patrón, color, grosor]
Notarás una diferencia entre la forma de esta
instrucción, y la anterior. En "PUNTO nombre ... "
tenemos primero la palabra clave y después el nombre de la
variable. Aquí tenemos primero el nombre de la variable y
después la palabra clave. (El signo "=" es opcional.)
La primera forma es la forma de una instrucción de
inicialización, donde definimos el tipo de una variable y le
asignamos valores numéricos (como p.ej. coordenadas). La forma
que tenemos aquí, es una operación (o construcción)
geométrica, donde usamos uno o más elementos ya existentes (dos
puntos, en este caso), para crear uno o más elementos nuevos
(una recta, en este caso).
La instrucción LINE existe también como instrucción de
inicialización, en la forma siguiente:
LINE nombre, x1, y1, x2, y2 [, patrón, color, grosor]
Aquí, x1,y1 y x2,y2 son las coordenadas de
dos puntos que definen la línea.
Entonces, en vez de hacerlo como en el ejemplo, podríamos
construir nuestro triángulo también inicializando tres rectas,
y entonces calculando los puntos de intersección. Pero es más
práctico hacerlo de la manera como en el ejemplo.
Notarás también que tenemos puntos con los nombres A,B,C y
rectas con los nombres a,b,c. Esto no es ningún problema, porque
GeoScript distingue entre mayúsculas y minúsculas; entonces A
no es lo mismo como a. Pero esto
significa que tienes que tipear con cuidado: si por ejemplo
llamas un punto Arriba y más tarde te
refieres a él con arriba, sucederá un
error.
Por el otro lado, las palabras claves no distinguen entre
mayúsculas y minúsculas. En vez de LINE
podríamos también escribir line, Line,
o incluso lInE.
Como con POINT, la instrucción LINE tiene también sus parámetros opcionales, que se explican en esta sección del Manual de GeoScript.
Para ejecutar el programa (bajo Windows), abre "GeoScript.exe", y en el cuadro de diálogo que aparece, selecciona el archivo del programa que quieres ejecutar ("tutorial1.geo" en este caso). Puedes también abrir el Explorador de Windows en la carpeta donde se encuentra tu archivo de programa, y arrastrarlo sobre el icono de GeoScript.
Este es el resultado del programa:
- Hay dos últimas instrucciones a explicar:
WAIT detiene la ejecución del programa hasta que el usuario haga clic en un botón, o presione una de las teclas predefinidas. Sin esta instrucción, la ventana del programa se cerraría inmediatamente después de que el triángulo esté terminado, y ni siquiera tendríamos tiempo para admirar el resultado de nuestro primer programa.
END termina el programa - no hay nada más que decir acerca de ello. End.
Ejercicios sugeridos:
A) Escribe un programa que dibuja un triángulo de la otra manera
sugerida en este capítulo (usando LINE como instrucción de
inicialización, y sin usar POINT).
B) Escribe un programa que dibuja una estrella.
C) Juega un poco con los diferentes estilos, patrones, colores y
grosores, y observa el resultado en la pantalla. (Consulta la
sección correspondiente en el Manual
de GeoScript.)
Capítulo 2: Dibujos
básicos con rectas
(Introduciendo LINEPOLAR, CROSS, STARTLINE,
ADVANCETO)
En el capítulo 1 conocimos la construcción geométrica LINE. Ahora añadiremos algunas construcciones más a nuestro primer programa:
hc = LINEPOLAR C, c, 90º, &HF0F
La instrucción LINEPOLAR dibuja una recta que pasa por un punto dado, y forma un ángulo especificado con una recta dada. Los ángulos se especifican en grados e incrementan en sentido contrario al reloj. (El signo de grados º después del número es opcional; pero hace que se entienda mejor tu programa. Para el caso que lo revises cincuenta años más tarde, cuando hayas olvidado lo que significa cada cosa.)
Aquí usamos LINEPOLAR para dibujar un ángulo recto con la base c, pasando por el punto C; o sea, la altura del triángulo. El valor &HF0F para el patrón produce una línea rayada.
Existe también una instrucción de inicialización LINEPOLAR, de la forma siguiente:
LINEPOLAR nombre, x1, y1, ángulo [, patrón, color, grosor]
Aquí x1,y1 son las coordenadas del origen de la recta, y ángulo es un ángulo absoluto: 0º significa una recta hacia la derecha, 90º hacia arriba, 180º hacia la izquierda, etc. Lo recordarás fácilmente si recuerdas que GeoScript sigue principios cristianos: Primero decides caminar por el camino derecho; después levantas tus ojos hacia arriba para obtener ayuda del Altísimo.
- Después dibujamos la altura a través del punto B de la misma manera:
hb = LINEPOLAR B, b, 90º, &HF0F
Después guardamos el punto de intersección de las dos alturas en una variable H:
H = CROSS hc, hb, 4, &HFF0000
El número 4 es un estilo de punto, que hace que el punto sea
dibujado como un cuadrado relleno. &HFF0000 es un valor de
color y significa un rojo intenso. - En el capítulo 1 hemos
visto otra forma de especificar colores; en aquella forma
escribirías (255,0,0). En lugar de aquella forma, puedes usar la
forma hexadecimal &HRRGGBB (dos dígitos para Rojo, dos para
Verde y dos para Azul.) Pero si los números hexadecimales te
causan dolor de barriga, preferirás la forma con paréntesis
(rojo, verde, azul).
Nota no muy importante:
Esta forma de escribir números hexadecimales corresponde a la
síntaxis de la familia de lenguajes de programación BASIC, en
la que GeoScript fue escrito. Para valores de color, también se
permiten las formas 0xFF0000 y 0FF0000h. Sin embargo, estas
últimas formas no se aceptan para patrones de líneas ni para
otros números que deseas expresar en hexadecimal. (Puedes
escribir también las coordenadas, ángulos, etc. en hexadecimal
si esto te hace feliz; pero entonces TIENES QUE usar el prefijo
&H.)
Cosa siguiente, solo para dar un ejemplo, inicializamos otro punto y otra recta con las instrucciones siguientes:
POINT X, 400, 280, -1, (0,128,0) x, Y = STARTLINE X, 0º, 180, -1, (0,128,0), 3
La instrucción STARTLINE sirve mayormente para propósitos
educativos: Inicializa una recta exactamente de la manera como
dibujarías una nueva recta de una longitud dada sobre papel.
Esta instrucción toma un punto que ya dibujaste, dibuja una
recta desde allí en una dirección dada (0º = hacia la derecha
en este ejemplo), y mide el largo deseado (180 píxeles en el
ejemplo) desde el punto inicial. Los tres últimos parámetros
son las propiedades gráficas de la recta: patrón predefinido,
color verde y grosor 3.
La síntaxis general de STARTLINE es:
recta, punto2 = STARTLINE punto, ángulo, distancia [, patrón, color, grosor]
Como ves, esta instrucción tiene dos resultados: una recta y un punto (el punto final). El punto final tendrá las mismas propiedades gráficas como el punto inicial.
Ahora queremos definir un tercer punto en esta recta x, a una distancia de 50 píxeles desde X hacia Y. Esto lo logramos con la siguiente instrucción:
Z = ADVANCETO X, Y, 50, 2
(El último parámetro, 2, es el estilo del
nuevo punto Z.)
Si ya tenemos una recta construída de X a Y, como en este
ejemplo, podríamos lograr el mismo resultado con la instrucción
siguiente:
Z = ADVANCEON X, x, 50, 2
La única diferencia entre ADVANCETO y ADVANCEON es que ADVANCETO usa como parámetros dos puntos, mientras ADVANCEON usa un punto y una recta.
Ahora, si usamos ADVANCEON, la pregunta es: ¿en cuál dirección avanzamos? Puesto que en una recta se puede ir en dos direcciones, ¿qué si GeoScript se equivoca y avanza hacia la izquierda, cuando queremos avanzar hacia la derecha? - La respuesta está en el formato vectorial que GeoScript usa internamente. Para una recta, guarda no solamente su ubicación, sino también su dirección. Esta dirección depende de la manera como la recta fue construida inicialmente. En nuestro caso la hemos construido utilizando un ángulo absoluto; por tanto podemos estar seguros de que la recta apunta hacia la derecha, no hacia la izquierda. Para una recta que fue construida uniendo dos puntos, su vector apunta desde el primer punto hacia el segundo, y no al revés.
Como último ejemplo, construiremos una recta que empieza en Z, en un ángulo de 30 grados con x:
z = LINEPOLAR Z, x, 30º, -1, (0,128,0), 3
Aquí podríamos preguntar nuevamente: ¿en qué dirección apuntará el ángulo? ¿Hacia la derecha o hacia la izquierda? - Nuevamente tenemos que mirar el vector de la recta, y recordar que los ángulos aumentan en sentido contrario al reloj. Así que hay una sola respuesta: esta recta señalará hacia arriba a la derecha.
Este es el programa entero:
POINT A, 100,360, -1, &H0000FF POINT B, 400,360, -1, &H0000FF POINT C, 300,85, -1, &H0000FF a = LINE B,C b = LINE A,C c = LINE A,B hc = LINEPOLAR C, c, 90º, &HF0F 'línea rayada hb = LINEPOLAR B, b, 90º, &HF0F H = CROSS hc, hb, 4, &HFF0000 POINT X, 400, 280, -1, (0,128,0) x, Y = STARTLINE X, 0º, 180, -1, (0,128,0), 3 'Una recta verde, grosor 3 píxeles Z = ADVANCETO X, Y, 50, 2 'Un punto a 50 píxeles desde X hacia Y. z = LINEPOLAR Z, x, 30º, -1, (0,128,0), 3 WAIT END |
Y este es el resultado:
Ejercicios sugeridos:
A) Escribe un programa que dibuja un triángulo con los ángulos
de 40º, 60º y 80º.
B) Escribe un programa que dibuja un rectángulo sobre un
segmento de recta dado, con una altura de 150 píxeles.
C) Escribe un programa que dibuja un cuadrado sobre un segmento
de recta dado. (Pauta: Usa las diagonales.)
Capítulo 3: Marcar objetos
(Introduciendo MARKPOINT, MARKLINE, MARKANGLE,
MARKNUMBERANGLE, MARKNUMBERLINE.)
Seguiremos usando el programa del capítulo anterior, y
añadiremos algunas cosas más a él. Puesto que nuestros puntos
y nuestras rectas tienen nombres, sería lindo ver estos nombres
también en la pantalla. Esto se hace con la familia de
instrucciones MARK...
Para marcar un punto, usamos:
MARKPOINT punto [, tamaño, posición]
tamaño es un parámetro opcional que
indica el tamaño (altura) de la letra en píxeles. Si lo omites,
se aplica el tamaño predefinido de 16 píxeles.Ç
posición indica donde exactamente quieres colocar el
rótulo de tu punto. Cuando dibujas en papel, puedes fácilmente
ver donde puedes escribir una letra, alejada de líneas que
interfieren; pero GeoScript no es tan listo. Si no indicas donde
exactamente colocar el nombre, lo pondrá siempre encima del
punto. Para los puntos A y B de nuestro triángulo, esto no se
vería bonito, porque las letras serían cruzadas por las rectas
a y b, respectivamente. Por tanto, indicamos con un valor de 2
que queremos poner la letra debajo del punto::
MARKPOINT A, -1, 2 MARKPOINT B, -1, 2
(Para más valores de posición, y otros detalles acerca de las instrucciones de marcado, vea el Manual de GeoScript.)
Para el punto C, la posición predefinida está bien. Pero como ejemplo, usaremos un tamaño de letra más grande para este punto:
MARKPOINT C, 24
Para marcar una recta, hay dos formas alternativas:
MARKLINE recta [, punto1, punto2, tamaño, posición]
MARKLINE recta [, tamaño, posición]
De alguna manera hay que indicar donde a lo
largo de la recta se debe colocar la etiqueta. Puedes especificar
dos puntos sobre la recta, y la etiqueta se colocará en el medio
entre los dos puntos. Ten cuidado, GeoScript no comprueba si
estos puntos están realmente en la recta. Si no lo son, tendrás
unos resultados extraños.
Si no especificas puntos, la etiqueta se dibujará en el medio
entre el origen de la recta (el punto de partida desde donde fue
construida), y el punto final de su vector empezando desde allí.
(En el capítulo 2 hemos explicado brevemente los vectores de
rectas.) Para nuestro triángulo esto está bien, puesto que
construimos las rectas desde las puntas del triángulo; por tanto
no necesitamos especificar puntos:
MARKLINE a, -1, 1 MARKLINE b MARKLINE c, -1, 1
Habrás vista que cambiamos el valor de posición para las rectas a y c, porque preferimos tener todas las etiquetas afuera del triángulo. Para rectas hay solamente dos valores de posición: El valor predefinido (0) es a la izquierda de la recta, si es una recta muy inclinada (más de 45º), y encima de la recta, si es menos inclinada. Un valor de 1 cambia esta posición a la derecha, resp. debajo de la recta.
Ahora para los ángulos. Las dos formas de la instrucción de marcado son:
MARKANGLE recta1, recta2, "texto" [, tamaño, posición, radio]
MARKANGLE punto1, punto2, punto3, "texto" [, tamaño, radio]
Puesto que los ángulos no se guardan en
variables, no tienen nombres, y tenemos que darles uno ahora.
Para esto sirve el parámetro "texto". Tienes
que encerrar este texto entre comillas dobles "". -
Además de la etiqueta, los ángulos se marcarán también con un
arco. Puedes especificar el tamaño de este arco con el
parámetro opcional radio.
En la primera forma de la instrucción, el ángulo se define por
dos rectas. Pero esto no es suficiente, porque hay por lo menos
cuatro ángulos diferentes (incluso más) que podrían marcarse
entre dos rectas:
Empecé a enumerar estas posibilidades con 0,
porque así es la costumbre de los programadores (muy útil para
tratar con computadoras, pero no para la vida diaria). Y también
porque estos números rojos corresponden al parámetro opcional posición.
La posición 0 (valor predefinido) marca el ángulo en sentido
contrario al reloj desde la recta1 hacia la recta2.
Posición 1 es el siguiente ángulo en sentido contrario al
reloj, etc.
Pero esto todavía no es todo. El vector de la recta2
podría señalar en la dirección opuesta. En este caso, ¿cuál
de los siguientes ángulos es el ángulo en sentido contrario al
reloj entre recta1 y recta2?
![]() |
Como ves, la Posición 0 escogerá siempre el ángulo más pequeño (<180º), sin considerar la dirección de la recta2. La Posición 4, en cambio, marcará siempre exactamente el ángulo desde el vector 1 hacia el vector 2, aun cuando es mayor a 180º. |
Entonces, si no tienes cuidado, esta instrucción puede fácilmente marcar un ángulo diferente del que quieres. Por tanto, siempre cuando tienes tres puntos conocidos que definen un ángulo, deberías usar la segunda forma de la instrucción MARKANGLE. Esta forma no necesita ningún parámetro de posición, porque siempre girará en sentido contrario al reloj desde punto1 hacia punto3, con el punto2 como origen del ángulo, como se muestra a la derecha: | ![]() |
Esto es lo que hacemos en nuestro programa ejemplo:
MARKANGLE B,A,C, "a" MARKANGLE C,B,A, "b" MARKANGLE A,C,B, "g", 24, 150
Verás que como resultado, se colocan letras griegas en los ángulos: en vez de una "a" latina, aparecerá una alfa griega. Gamma se representa con "g", no "c". - Con este tercer ángulo, usamos un tamaño de letra más grande (24) y un radio de arco más grande (150 píxeles).
Marcar tamaños de ángulos y rectas
A veces es desable no solamente indicar el nombre de un ángulo, sino también su tamaño. Esto se hace con la instrucción MARKNUMBERANGLE, que tiene exactamente la misma síntaxis como MARKANGLE (ambas formas), pero adicionalmente calculará y mostrará el tamaño del ángulo en grados. En nuestro programa ejemplo, indicaremos el tamaño del ángulo entre la altura hc y la base c, que debe ser 90º:
MARKNUMBERANGLE c, hc, "f"
Para rectas usamos MARKNUMBERLINE, que tiene la siguiente síntaxis:
MARKNUMBERLINE recta [, punto1, punto2, factor, tamaño, posición]
Esta instrucción indicará la distancia entre punto1
y punto2 en píxeles; o si no indicas puntos, el largo
del vector de la recta.
Aquí hay un parámetro adicional: factor. Este es un
número entero por el cual se dividirá el número de píxeles.
Así puedes definir tus propias unidades de medida; por ejemplo
con un factor de 10, una distancia de 10 píxeles se marcará
como 1, 50 píxeles como 5, etc.
Este es el programa completo:
POINT A, 100,360, -1, &H0000FF MARKPOINT A, -1, 2 POINT B, 400,360, -1, &H0000FF MARKPOINT B, -1, 2 POINT C, 300,85, -1, &H0000FF MARKPOINT C, 24 a = LINE B,C MARKLINE a, -1, 1 'Posición: derecha - abajo b = LINE A,C MARKLINE b c = LINE A,B MARKLINE c, -1, 1 'Posición: derecha - abajo 'Marcamos los ángulos del triángulo: MARKANGLE B,A,C, "a" MARKANGLE C,B,A, "b" MARKANGLE A,C,B, "g", 24, 150 hc = LINEPOLAR C, c, 90º, &HF0F MARKNUMBERANGLE c, hc, "f" hb = LINEPOLAR B, b, 90º, &HF0F H = CROSS hc, hb, 4, &HFF0000 POINT X, 400, 280, -1, (0,128,0) x, Y = STARTLINE X, 0º, 180, -1, (0,128,0), 3 Z = ADVANCETO X, Y, 50, 2 MARKNUMBERLINE x, X,Z 'Marcamos la distancia X-Z. z = LINEPOLAR Z, x, 30º, -1, (0,128,0), 3 WAIT END |
Y así se ve en la pantalla:
Ejercicios sugeridos:
Usa los programas de los ejercicios del capítulo 2 y marca los
puntos, las rectas y los ángulos de las figuras dibujadas.
Capítulo 4: Círculos
(Introduciendo CIRCLE, CROSS con círculos, TANGENT.)
Como POINT, LINE y LINEPOLAR, la instrucción CIRCLE tiene también dos usos. Para inicializar un círculo con valores numéricos, su síntaxis es:
CIRCLE nombre, x, y, radio [, color, grosor, inicio, fin]
x,y son las coordenadas del centro del círculo. Los parámetros opcionales inicio y fin indican el ángulo inicial y final del arco, en grados; o sea, permiten dibujar solamente un arco en vez de un círculo completo. - Estas propiedades se aplican solamente a la manera como el círculo se dibuja en la pantalla, pero no a las construcciones: Si construyes, por ejemplo, las intersecciones de un círculo con una recta, estos puntos se crearán aun cuando se encuentran en la parte invisible del arco.
Como construcción, CIRCLE tiene las siguientes dos formas:
círculo = CIRCLE centro, punto [, color, grosor, inicio, fin]
círculo = CIRCLE centro, recta [, color, grosor, inicio, fin]
En la primera forma, la circunferencia del
círculo pasará por punto. En la segunda forma, el
círculo será tangencial a recta.
El siguiente programa ejemplo usa todas las tres variaciones de
la instrucción CIRCLE:
CIRCLE c1, 200,200, 150, (128,128,0), 3 POINT C, 280,280 MARKPOINT C POINT A, 460,370 MARKPOINT A c2 = CIRCLE C, A, (128,128,0), 3 'CIRCLE con dos puntos: C es el centro, y la circunferencia pasa por A. LINEPOLAR t, 20,410, 0º c3 = CIRCLE A, t, (255,0,0), 1 'CIRCLE con un punto y una recta: A es el centro, y t es una tangente. 'Intersecciones entre un círculo y una recta: P,Q = CROSS t, c2 MARKPOINT P MARKPOINT Q 'Intersecciones entre dos círculos: R,S = CROSS c1, c2 MARKPOINT R MARKPOINT S a,b = TANGENT P, c1, &HF01, (0,160,0) WAIT END |
Aquí vemos también dos nuevas variaciones de la instrucción CROSS:
P,Q = CROSS t, c2 R,S = CROSS c1, c2
En el primer caso, se construyen las intersecciones de una
recta con un círculo; en el segundo caso, las intersecciones de
dos círculos. Puesto que puede haber dos intersecciones, tenemos
que poner los resultados en dos variables diferentes.
Pero ¿qué si hay una sola intersección (en el caso de una
tangente), o ninguna en absoluto? - En este caso, GeoScript
simplemente declarará los puntos P y Q (resp. R y S) como
"inválidos" y no los mostrará en la pantalla. Ningún
error interrumpirá tu programa; pero si utilizas tales puntos
inválidos en otras construcciones más adelante (por ejemplo,
uniéndolos con una recta), los resultados serán también
inválidos.
(Nota: No, en el caso de una tangente
resultó más práctico no declarar ningún punto de
intersección como inválido, pero asignar a ambos el mismo
valor. La versión actual de GeoScript debe funcionar de esta
manera.)
La última instrucción a explicar es:
a,b = TANGENT P, c1, &HF01, (0,160,0)
Esto dibuja las tangentes (nuevamente dos variables para los resultados posibles) desde el punto P al círculo c1. De los parámetros opcionales usuales (patrón, color, grosor), dos son dados: &HF01 dibuja una recta en raya-punto-raya, y su color es verde.
Este es el resultado del programa:
Hay dos elementos grises en la pantalla que posiblemente no
esperaste: una recta en ángulo recto desde A hacia la recta PQ,
y un círculo que pasa por P y por el centro del círculo c1.
Estas son líneas auxiliares que dibujarías también en el
papel, si hicieras estas construcciones con exactitud: ayudan a
encontrar los puntos exactos donde el círculo toca su tangente.
Por supuesto, la computadora no tiene necesidad de estas líneas
auxiliares para calcular círculos y tangentes. Son dibujadas
para fines puramente educativos. (Más adelante veremos como se
pueden realizar construcciones en modo FAST, donde estos
elementos auxiliares no aparecerán.)
Ejercicios sugeridos:
A) Escribe un programa que dibuja un triángulo equilátero sobre
un segmento de recta dado. (Sin usar LINEPOLAR, para que
necesites círculos para hacerlo...)
B) Escribe un programa que dibuja un hexágono regular sobre un
segmento de recta dado.
C) Escribe un programa que inscribe un hexágono regular en un
círculo.
D) Escribe un programa que circunscribe un hexágono regular
alrededor de un círculo dado.
E) Escribe un programa que circunscribe un triángulo alrededor
de un círculo dado, del cual se conoce también una esquina P, y
un punto Q en el lado opuesto a P.
F) Como E, pero en vez del punto Q es dado un ángulo del
triángulo (pero no el ángulo en P).
G) Escribe un programa que construye un círculo con un radio de
80 píxeles, que toca dos rectas que se intersectan.
(Si no estás seguro acerca de las construcciones, inténtalas primero sobre papel.)
Capítulo 5: Líneas
notables en un triángulo; Mostrar texto
(Introduciendo MIDDLE, MIDLINE, BISECTOR, REVERT; SCREEN,
WINDOW, TEXTWINDOW, TEXT, CLS)
Cuando mostramos unas construcciones geométricas con GeoScript, será bueno poner algún texto en la pantalla que explique al usuario qué estamos haciendo. Hay una serie de instrucciones de pantalla que hacen esto. Para mostrar un texto, necesitamos las siguientes instrucciones:
TEXTWINDOW x, y, ancho, alto
TEXT "texto" [, colorTexto, colorFondo, tamaño]
En vez de TEXTWINDOW, puedes también escribir TWINDOW. Esta
instrucción define un rectángulo dentro del cual aparecerá el
texto. No puedes usar la instrucción TEXT sin especificar
TEXTWINDOW en alguna parte anterior del programa.
El "texto" para mostrar tiene que ser encerrado entre
comillas dobles "", y tiene que permanecer en la misma
línea del programa. (GeoScript se encarga del ajuste de línea -
aunque no perfectamente - para hacer encajar el texto dentro del
marco de TEXTWINDOW.)
Así que ponemos una instrucción TEXTWINDOW y una
instrucción TEXT en alguna parte entre las instrucciones de
construcción del ejemplo anterior. ¿Qué sucede? El texto
aparecerá solamente por un breve momento. Quizás ni siquiera lo
puedes ver. Tan pronto como el siguiente elemento se dibuja, el
texto desaparece. Esto es porque el marco de TEXTWINDOW se
encuentra dentro del área donde se dibujan los gráficos.
Entonces será cubierto tan pronto como se actualizan los
gráficos.
Hay dos maneras de evitar esto:
- Detener la ejecución del programa con WAIT, si un texto tiene
que aparecer en medio de una construcción.
- Restringir el área de gráficos, de manera que ya no
interfiere con el marco de texto.
En nuestro programa ejemplo usaremos el segundo método. Fíjate en estas líneas:
SCREEN 600,460 WINDOW 600, 380 TWINDOW 2,380, 596,60
La instrucción SCREEN define el tamaño de la ventana de la
aplicación (aquí 600x460 píxeles). Si omites esta instrucción
(como en los ejemplos anteriores), la ventana se inicializará
con el tamaño predefinido de 640x480.
La instrucción WINDOW define el tamaño del área donde se
dibujan los gráficos. Este área será recortada a la derecha y
abajo si es más pequeña que la ventana de la aplicación.
Entonces en nuestro ejemplo, los gráficos llenarán el ancho
completo de 600 píxeles de la ventana, pero solamente 380 de su
altura, entonces 460-380=80 píxeles se quedarán libres para
texto.
Por tanto, nuestro marco de texto comienza a una coordenada y de
380, y tiene una altura de 60 píxeles. (Toma en cuenta que los
últimos 20 píxeles serán ocupados por los botones
predefinidos. Ellos cubrirán un texto que se muestre allí.)
Por supuesto que puedes cambiar el tamaño y la ubicación del
marco de texto durante el programa. Pero en nuestro ejemplo
usaremos el mismo marco durante el programa entero.
Después de esta inicialización, construimos un triángulo y marcamos sus elementos como el el capítulo 3. No hay necesidad de repetir esta parte aquí. Después de esto, ponemos un texto para explicar lo que hacemos:
TEXT "Uniremos cada punta del triángulo con el medio del lado opuesto. Las rectas resultantes se intersectan en el centro de gravedad.", (0,0,255)
(Nota que este texto entero debe escribirse en una sola línea. Lo estoy partiendo en dos aquí solamente para que no necesites desplazar la ventana entera para leerlo.)
Después construimos y marcamos el centro de gravedad con estas líneas:
D = MIDDLE B,C E = MIDDLE A,C F = MIDDLE A,B d = LINE A,D, -1, (0,0,255) e = LINE B,E, -1, (0,0,255) f = LINE C,F, -1, (0,0,255) G = CROSS d, e, -1, (0,0,255) MARKPOINT G
La instrucción MIDDLE coloca simplemente un punto exactamente
en el medio entre dos otros puntos. Opcionalmente puedes
especificar el estilo, el color y el grosor del punto resultante.
Ahora queremos que el usuario realmente vea esta imagen; por
tanto detenemos el programa con WAIT. Pero antes de esto, ponemos
un texto para informar al usuario de lo que debe hacer ahora:
TEXT "Presiona 'Continuar' para continuar.", (255,255,0), (160,0,0) WAIT
Después construimos la circunferencia circunscrita del triángulo. Escribimos nuevamente un texto explicativo, y entonces realizamos la construcción siguiente:
h = MIDLINE B,C, -1, (255,0,0) i = MIDLINE A,C, -1, (255,0,0) j = MIDLINE A,B, -1, (255,0,0) M = CROSS h,i, -1, (255,0,0) MARKPOINT M c1 = CIRCLE M,A, (255,0,0)
La instrucción MIDLINE dibuja la mediatriz entre dos puntos,
y tiene los mismos parámetros opcionales como todas las
instrucciones de construcción (patrón, color y grosor, en el
caso de una recta.) Verás nuevamente aparecer algunas líneas
auxiliares que simulan la construcción verdadera en papel.
Aquí está el resultado:
Ahora ya tenemos bastantes líneas en la pantalla, y dibujar
más sobre esto se vería bastante desordenado. Por tanto,
después de un WAIT, limpiamos la pantalla con la instrucción
CLS. Opcionalmente puedes especificar un color de fondo; por
ejemplo CLS (0,0,100) llenará la pantalla con un azul oscuro.
Pero ahora tenemos que volver a dibujar el triángulo, entonces
tenemos que copiar aquí las mismas instrucciones como al inicio.
Después de esto podemos hacer una construcción nueva en el
triángulo. Esta vez construimos la circunferencia inscrita:
d = BISECTOR c,b, -1, (0,190,0) REVERT c e = BISECTOR a,c, -1, (0,190,0) REVERT a REVERT b f = BISECTOR b,a, -1, (0,190,0)
M = CROSS d,e, -1, (0,190,0) c2 = CIRCLE M, a, (0,190,0)
La instrucción BISECTOR dibuja la bisectriz del ángulo entre
dos rectas. ¿Y para qué sirve el REVERT? - Esto tiene que ver
nuevamente con la dirección de los vectores de las rectas. En un
capítulo anterior hablamos de que hay varias maneras de
interpretar cuál es el ángulo entre dos rectas; y por tanto hay
varias maneras de construir una bisectriz entre dos rectas.
BISECTOR usará siempre el ángulo en sentido contrario al reloj,
desde la recta1 hacia la recta2. Si los vectores de estas rectas
no señalan en la dirección deseada, tenemos que invertirlos con
REVERT. Esta instrucción no cambia nada en la ubicación y
apariencia de una recta; simplemente voltea su vector en la
dirección opuesta.
Si deseas saber qué diferencia hace esto, simplemente quita las
instrucciones REVERT (o conviértelos en comentarios, poniendo
una comilla ' antes de ellas), ejecuta el programa nuevamente y
mira.
Hay una última parte en este programa que construye las alturas. No hay nada nuevo en esa parte. Aquí está el programa completo:
SCREEN 600,460 WINDOW 600, 380 TWINDOW 2,380, 596,60 POINT A = 70,340 POINT B = 530,340 POINT C = 140,40 c = LINE A,B b = LINE A,C a = LINE B,C MARKPOINT A, -1, 2 MARKPOINT B, -1, 2 MARKPOINT C MARKLINE a MARKLINE b MARKLINE c, -1, 1 TEXT "We will join each point of the triangle with the middle of the opposite side. The resulting lines intersect in the gravity center of the triangle.", (0,0,255) D = MIDDLE B,C E = MIDDLE A,C F = MIDDLE A,B d = LINE A,D, -1, (0,0,255) e = LINE B,E, -1, (0,0,255) f = LINE C,F, -1, (0,0,255) G = CROSS d, e, -1, (0,0,255) MARKPOINT G TEXT "Presiona 'Continuar' para continuar.", (255,255,0), (160,0,0) WAIT TEXT "Ahora dibujaremos las mediatrices de cada lado. Ellas se intersectan en el centro de la circunferencia circunscrita del triángulo.", (255,0,0) h = MIDLINE B,C, -1, (255,0,0) i = MIDLINE A,C, -1, (255,0,0) j = MIDLINE A,B, -1, (255,0,0) M = CROSS h,i, -1, (255,0,0) MARKPOINT M c1 = CIRCLE M,A, (255,0,0) TEXT "Presiona 'Continuar' para continuar.", (255,255,0), (160,0,0) WAIT CLS 'Now we must draw the triangle again. c = LINE A,B b = LINE A,C a = LINE B,C MARKPOINT A, -1, 2 MARKPOINT B, -1, 2 MARKPOINT C MARKLINE a, -1, 1 MARKLINE b MARKLINE c, -1, 1 TEXT "Dividimos cada ángulo del triángulo en la mitad. Las bisectrices se cruzan en el centro de la circunferencia inscrita.", (0,190,0) d = BISECTOR c,b, -1, (0,190,0) REVERT c e = BISECTOR a,c, -1, (0,190,0) REVERT a REVERT b f = BISECTOR b,a, -1, (0,190,0) M = CROSS d,e, -1, (0,190,0) c2 = CIRCLE M, a, (0,190,0) TEXT "Presiona 'Continuar' para continuar.", (255,255,0), (160,0,0) WAIT TEXT "La altura del triángulo es una recta en ángulo recto desde una punta hacia el lado opuesto. Hay tres alturas, y se intersectan en un solo punto.", (160,0,160) hc = LINEPOLAR C,c, 90º, -1, (160,0,160) ha = LINEPOLAR A,a, 90º, -1, (160,0,160) hb = LINEPOLAR B,b, 90º, -1, (160,0,160) H = CROSS hc, ha, -1, (160,0,160) MARKPOINT H TEXT "Presiona 'Continuar' o 'Salir' para terminar el programa.", (255,255,0), (160,0,0) WAIT END |
Y aquí está el resultado de la segunda mitad del programa:
Ejercicios sugeridos:
A) Escribe un programa que construye un círculo que pasa por dos
puntos dados y tiene un radio de 120 píxeles.
B) Añade al programa del ejercicio A un poco de texto que
explica lo que el programa hace.
C) Escribe un programa que construye un cuadrado sobre un
segmento de recta dado, y lo divide en cuatro cuadrados iguales.
D) Escribe un programa que construye un ángulo de 75º, sin usar
LINEPOLAR. Añade un texto explicativo.
Capítulo 6: El
procedimiento "CONSTRUCTION"
(Introduciendo CONSTRUCTION, REPEAT, CALL / CONSTRUCT, FAST,
PACE, SLOW / TOOLS, IPOINT)
En el último ejemplo tuvimos que dibujar dos veces el mismo triángulo. En vez de copiar las mismas instrucciones otra vez, hay una manera más conveniente de hacerlo. Podemos poner estas instrucciones en un procedimiento (a veces también llamado "subrutina") del tipo CONSTRUCTION. Entonces necesitamos una sola línea, la instrucción CALL, para llamar a este procedimiento. Todas las instrucciones en el procedimiento se ejecutarán, y después el programa continuará normalmente con la línea que sigue la instrucción CALL.
Los procedimientos tienen que colocarse después de todas las otras instrucciones (que se llaman también el "módulo principal"). Entonces ponemos el siguiente bloque de instrucciones al final de nuestro programa:
CONSTRUCTION Triangulo A,B,C c = LINE A,B b = LINE A,C a = LINE B,C MARKPOINT A, -1, 2 MARKPOINT B, -1, 2 MARKPOINT C MARKLINE a MARKLINE b MARKLINE c, -1, 1 REPEAT
La palabra CONSTRUCTION le dice al intérprete de GeoScript que un procedimiento del tipo "CONSTRUCTION" empieza aquí. "Triangulo" es el nombre del procedimiento. (Cada procedimiento debe tener un nombre, porque tenemos que llamarlo (CALL) por su nombre desde otras partes del programa.) A,B y C son los parámetros del procedimiento.
Pasar parámetros es un concepto importante de la
programación. Cuando llamas el procedimiento
"Triangulo" (con CALL), el procedimiento espera que le
des tres puntos para que trabaje con ellos. No es necesario que
sean los puntos A,B,C del módulo principal; pueden ser puntos
cualesquieras. Por ejemplo, puedes escribir "CALL Triangulo
D,E,F"; entonces el procedimiento construirá un triángulo
de los puntos D, E y F. En cualquier parte del procedimiento
donde aparece la variable A, usará D en vez de A, y de la misma
manera E en vez de B, y F en vez de C.
Tienes que asegurarte de que llames el procedimiento con el tipo
correcto de parámetros. Si intentas, por ejemplo, "CALL
Triangulo ha, hb, hc", recibirás un error de que "los
tipos no coinciden", porque ha, hb y hc son definidos como
rectas, no puntos, en el resto del programa.
Dentro de un procedimiento, cada variable que no está declarada
como parámetro, es una variable global. O sea, es la misma
variable como la del módulo principal con el mismo nombre. Así
por ejemplo en nuestro procedimiento "Triangulo", las
rectas a, b y c son variables globales. Después de llamar
"CALL Triangulo", las rectas a, b y c habrán cambiado.
(Otros lenguajes de programación usan "variables
locales" en sus procedimientos. Pero en GeoScript no hay
variables locales.)
Por el otro lado, los parámetros A,B,C, como ya mencionamos, no
son lo mismo como A,B,C en el módulo principal. Supongamos que
el procedimiento cambia los valores de los parámetros A, B y C.
Cuando llamas "CALL triangle D,E,F", los puntos A,B,C
no cambiarán en absoluto; pero los puntos D,E,F cambiarán.
Nota que los nombres de procedimientos distinguen entre
mayúsculas y minúsculas: Si llamas "CALL triangulo",
"Triangulo" no responderá, porque no reconoce su
nombre en esta forma.
Cada procedimiento termina con la instrucción REPEAT. Después de REPEAT puedes opcionalmente poner un número que indica cuántas veces se repetirá el procedimiento. Por ejemplo, si escribes "REPEAT 5", el procedimiento se repetirá cinco veces antes de volver a la línea después de CALL. Si omites el número, el procedimiento se ejecutará una sola vez y después regresará.
(No hay ejemplos para CONSTRUCTIONes repetidas en este tutorial. Pero puedes encontrar algunos en los otros programas ejemplo, como en "Espiral.geo" y en "Conicas.geo").
En vez de CALL, cuando llamas una CONSTRUCTION, puedes también escribir CONSTRUCT.
Modos de ejecución
Hay tres diferentes modos con los que puedes llamar un procedimiento: SLOW, PACE y FAST.
PACE (por pasos) es el modo que has visto hasta ahora. Los elementos se dibujan en la pantalla uno por uno, con un tiempo de espera de dos segundos entre elemento y elemento. (Aunque el usuario puede saltar estos tiempos de espera, presionando cualquier tecla excepto "R", [Esc] y [RePág].) Si no especificas ningún modo, una CONSTRUCTION se ejecutará en este modo. El módulo principal se ejecuta siempre en modo PACE.
El modo FAST (rápido) dibuja la CONSTRUCTION entera de una vez, tan rápido como lo permite el rendimiento de tu computadora.
El modo SLOW (lento) es para animaciones educativas. No solo
muestra los elementos geométricos, sino también una animación
sencilla de las herramientas que usarías para dibujar estos
elementos en papel (regla, compás, etc.) Esto demora, por
supuesto, pero es interesante mirarlo, especialmente para
principiantes. - En vez de SLOW puedes también escribir TOOLS.
Esta es una imagen de una tal animación del ejemplo que sigue
más abajo:
En una instrucción CALL, la palabra clave que indica el modo debe colocarse después del nombre del procedimiento, pero antes de los parámetros. Por ejemplo:
CALL Triangulo FAST, X, Y, Z
El siguiente programa muestra ejemplos para todos los tres modos. Es esencialmente el mismo como en el capítulo anterior. Pero puesto que estamos practicando procedimientos, las otras construcciones (centro de gravedad, circunferencia circunscrita, etc.) fueron también puestas en procedimientos, y llamadas con CALL desde el módulo principal. Y verás que el triángulo se inicializa con puntos diferentes en medio del programa.
- Hay un cambio más en este programa: Al inicializar los puntos A,B,C, verás que en vez de POINT usamos la instrucción IPOINT. La "I" significa "Invisible". Puntos inicializados con IPOINT no aparecerán en la pantalla, y por tanto tampoco consumirán tiempo de espera. (Probablemente ya te habrás aburrido con ver los tres puntos aparecer lentamente en los ejemplos previos.) - Aun los puntos inicializados con IPOINT, podrás marcarlos más adelante en el programa si deseas.
De manera similar puedes poner una "I" delante de casi todas las instrucciones de inicialización y construcción: ILINE, ICIRCLE, ICROSS, IMIDLINE, etc.
SCREEN 600,460 WINDOW 600, 380 TWINDOW 2,380, 596,60 IPOINT A = 70,340 IPOINT B = 530,340 IPOINT C = 140,40 TEXT "Construcción de un triángulo en modo PACE. Este es el modo predefinido." CALL Triangulo PACE A,B,C TEXT "Construcción del gravicentro en modo FAST. Presiona 'Continuar' para continuar." CALL Gravicentro FAST A,B,C WAIT 'Limpia la pantalla y vuelve a dibujar el triángulo: CLS CALL Triangulo FAST A,B,C TEXT "Construcción de la circunferencia circunscrita en modo SLOW." CALL Circumcirculo SLOW A,B,C CLS TEXT "Construcción de la circunferencia inscrita en modo predefinido (PACE)." 'Ahora inicializamos el triángulo con otros puntos: POINT X, 100,80, 3,(0,160,0) POINT Y, 400,80, 3,(0,160,0) POINT Z, 250,300, 3,(0,160,0) 'No es necesario llamar "Triangulo" aquí: "Incirculo" dibuja las rectas. CALL Incirculo X,Y,Z WAIT 4000 'Espera 4 segundos. CLS TEXT "Construcción de alturas en modo SLOW." Markpoint X Markpoint Y Markpoint Z 'No es necesario llamar "Triangulo" aquí: "Alturas" dibuja las rectas. CONSTRUCT Alturas SLOW X,Y,Z TEXT "Presiona 'Continuar' o 'Salir' para terminar el programa.", (255,255,0), (160,0,0) WAIT END ' El módulo principal termina aquí. Los procedimientos comienzan aquí. CONSTRUCTION Triangulo A,B,C c = LINE A,B b = LINE A,C a = LINE B,C MARKPOINT A, -1, 2 MARKPOINT B, -1, 2 MARKPOINT C MARKLINE a MARKLINE b MARKLINE c, -1, 1 REPEAT CONSTRUCTION Gravicentro A,B,C D = MIDDLE B,C E = MIDDLE A,C F = MIDDLE A,B d = LINE A,D, -1, (0,0,255) e = LINE B,E, -1, (0,0,255) f = LINE C,F, -1, (0,0,255) G = CROSS d, e, -1, (0,0,255) MARKPOINT G REPEAT CONSTRUCTION Circumcirculo A,B,C h = MIDLINE B,C, -1, (255,0,0) i = MIDLINE A,C, -1, (255,0,0) j = MIDLINE A,B, -1, (255,0,0) M = CROSS h,i, -1, (255,0,0) MARKPOINT M c1 = CIRCLE M,A, (255,0,0) REPEAT CONSTRUCTION Incirculo A,B,C c = LINE A,B b = LINE A,C a = LINE B,C d = BISECTOR c,b, -1, (0,190,0) REVERT c e = BISECTOR a,c, -1, (0,190,0) REVERT a REVERT b f = BISECTOR b,a, -1, (0,190,0) M = CROSS d,e, -1, (0,190,0) c2 = CIRCLE M, a, (0,190,0) REPEAT CONSTRUCTION Alturas A,B,C c = LINE A,B b = LINE A,C a = LINE B,C hc = LINEPOLAR C,c, 90º, -1, (160,0,160) ha = LINEPOLAR A,a, 90º, -1, (160,0,160) hb = LINEPOLAR B,b, 90º, -1, (160,0,160) H = CROSS hc, ha, -1, (160,0,160) MARKPOINT H REPEAT |
Ejercicios sugeridos:
A) Vuelve a usar el programa del capítulo 5, ejercicio C.
Escríbelo en forma de una CONSTRUCTION que acepta como
parámetros los dos puntos extremos del segmento de recta dado, y
construye sobre estos puntos el cuadrado y lo divide. Llama esta
CONSTRUCTION desde el módulo principal varias veces con
diferentes puntos como parámetros.
B) Escribe una CONSTRUCTION que acepta como parámetros un punto,
una recta y un círculo, y que construye un círculo del mismo
radio como el círculo dado, que pasa por el punto dado y es
tangencial a la recta dada. (Quizás querrás usar aquí la
instrucción MOVECIRCLE;
aunque existen otras alternativas.)
Capítulo 7: Animaciones
(Introduciendo ANIMATION, STEP, TRACE)
En el capítulo anterior vimos procedimientos del tipo CONSTRUCTION. Hay dos otros tipos de procedimientos. Uno de ellos es ANIMATION. Permite repetir la misma construcción muchas veces, mientras sus puntos iniciales se están moviendo. En el modo FAST, esto da la impresión de una figura geométrica que cambia su forma constantemente.
El siguiente ejemplo usa las CONSTRUCTIONes "Triangulo" y "Circumcirculo", que ya conocemos del capítulo anterior. Pero ahora llamamos estos dos procedimientos desde adentro de otro procedimiento del tipo ANIMATION, que se ve así:
ANIMATION Circum STEP A, 4,-1 TRACE M CALL Triangulo FAST A,B,C CALL Circumcirculo FAST A,B,C REPEAT 150
Primero tenemos la palabra clave ANIMATION y el nombre del procedimiento. Las animaciones no pueden recibir parámetros. - Después encontramos dos instrucciones nuevas:
STEP A, 4,-1
La instrucción STEP indica que el punto A se moverá durante
la animación. Los números son la distancia, en píxeles, que el
punto se moverá después de cada repetición: 4 píxeles hacia
la derecha y 1 píxel hacia arriba.
Con STEP se pueden mover no solo puntos, también círculos (pero
rectas no.) Consulta el Manual de
GeoScript.
TRACE M
La instrucción TRACE indica que el punto M será "trazado" durante la animación. Esto significa que mientras los otros elementos se borran y se crean de nuevo con cada repetición, el punto M dejará detrás de sí una "huella" de todas sus posiciones desde el inicio de la animación. - Después de TRACE, puedes especificar varios puntos en la misma línea (hasta 14).
Las instrucciones STEP y TRACE se aplican al procedimiento entero de manera general, sin importar donde en el procedimiento se encuentran.
- Después de estas, llamamos nuestras construcciones
"Triangulo" y "Circumcirculo" con CALL. Nota
que una ANIMATION puede llamar otros procedimientos, pero una
CONSTRUCTION no puede llamar a ningún otro procedimiento.
(Nota: Esto ha sido
ligeramente mejorado. En la versión actual, una CONSTRUCTION que
no recibe parámetros puede llamar a otra CONSTRUCTION (con
o sin parámetros)).
- Finalmente, con "REPEAT 150" indicamos que el
procedimiento entero debe repetirse 150 veces.
Desde el módulo principal llamamos nuestra animación "Circum" en modo FAST. (Este es el modo predefinido para una ANIMATION.) ¡Ejecuta el programa y mira como se mueven!
WINDOW 640,400 TWINDOW 2,400, 636,60 IPOINT A = 70,340 IPOINT B = 530,340 IPOINT C = 140,40 TEXT "Mira como la circunferencia circunscrita cambia, mientras el punto A se mueve hacia la recta a." CALL Circum FAST TEXT "Presiona 'Continuar' o 'Salir' para terminar el programa.", (255,255,0), (160,0,0) WAIT END CONSTRUCTION Triangulo A,B,C c = LINE A,B b = LINE A,C a = LINE B,C MARKPOINT A, -1, 2 MARKPOINT B, -1, 2 MARKPOINT C MARKLINE a MARKLINE b MARKLINE c, -1, 1 REPEAT CONSTRUCTION Circumcirculo A,B,C h = MIDLINE B,C, -1, (255,0,0) i = MIDLINE A,C, -1, (255,0,0) j = MIDLINE A,B, -1, (255,0,0) M = CROSS h,i, -1, (128,0,0) MARKPOINT M c1 = CIRCLE M,A, (255,0,0) REPEAT ANIMATION Circum STEP A, 4,-1 TRACE M CALL Triangulo FAST A,B,C CALL Circumcirculo FAST A,B,C REPEAT 150 |
Este es el resultado después de algunas repeticiones:
Ejercicios sugeridos:
A) De la misma manera como en el ejemplo, anima también las
otras construcciones del capítulo 6 (Centro de gravedad,
circunferencia inscrita, alturas).
B) Escribe un programa que comienza con un cuadrado pequeño y
aumenta gradualmente su tamaño, mientras el centro del cuadrado
permanece en el mismo lugar.
C) Como B, pero adicionalmente dibuja los trazos de las esquinas
del cuadrado con TRACE.
Capítulo 8: El
procedimiento "INTERACTION"
(Introduciendo INTERACTION, CLICKABLE)
El tercer tipo de procedimientos en GeoScript es INTERACTION.
Es similar a ANIMATION en que vuelve a dibujar la misma
construcción desde diferentes puntos de partida. Pero mientras
ANIMATION mueve los puntos automáticamente, INTERACTION permite
que el usuario arrastre los puntos, usando el ratón.
Veamos este nuevo tipo de procedimiento:
INTERACTION Circum CLICKABLE A, B CALL Triangulo FAST A,B,C CALL Circumcirculo FAST A,B,C REPEAT
No tenemos las instrucciones STEP y TRACE aquí. En lugar de
ellas, tenemos la instrucción CLICKABLE. Ella especifica cuáles
puntos pueden ser arrastrados con el ratón (en nuestro ejemplo
son A y B). Como con TRACE, después de CLICKABLE puedes escribir
varios puntos en la misma línea (hasta 14). Solo puntos pueden
ser CLICKABLEs, pero rectas y círculos no.
Los puntos arrastrables no serán marcados de ninguna manera
especial en la pantalla. Entonces, tú mismo tienes que
resaltarlos, dándoles un estilo especial, o poniendo un texto
que dice al usuario cuáles puntos puede arrastrar, o ambas
cosas.
Una INTERACTION se repite infinitamente, hasta que el usuario haga clic en "Salir" o presione la tecla [Esc]. Por tanto, es inútil especificar un número de REPEAT para una INTERACTION.
En modo FAST, una INTERACTION actúa diferente de los otros
modos: En modo FAST, mientras el usuario está todavía
arrastrando un punto, la construcción se actualiza
constantemente. Esto se ve como si estuvieras arrastrando la
figura entera, cambiando su forma dinámicamente. Así lo verás
al ejecutar el ejemplo abajo.
En los modos PACE y SLOW, en cambio, cuando arrastras un punto,
la construcción se actualizará solamente después de que
sueltes el botón del ratón.
Ahora inténtalo y ejecuta este programa de ejemplo:
WINDOW 640,420 TWINDOW 2,420, 636,40 'Ponemos la inicialización de puntos en una CONSTRUCTION, 'de manera que podemos llamarla FAST. CALL Init FAST TEXT "Arrastra el punto A o B con el ratón y mira como cambia la circunferencia circunscrita. Haz clic en 'Salir' o presiona [Esc] para salir." CALL Circum FAST END CONSTRUCTION Init POINT A = 70,340, 4, (255,0,0) POINT B = 530,340, 4, (255,0,0) IPOINT C = 140,40 REPEAT CONSTRUCTION Triangulo A,B,C c = LINE A,B b = LINE A,C a = LINE B,C MARKPOINT A, -1, 2 MARKPOINT B, -1, 2 MARKPOINT C MARKLINE a MARKLINE b MARKLINE c, -1, 1 REPEAT CONSTRUCTION Circumcirculo A,B,C h = MIDLINE B,C, -1, (0,0,255) i = MIDLINE A,C, -1, (0,0,255) j = MIDLINE A,B, -1, (0,0,255) M = CROSS h,i, -1, (0,0,255) MARKPOINT M c1 = CIRCLE M,A, (0,0,255) REPEAT INTERACTION Circum CLICKABLE A, B CALL Triangulo FAST A,B,C CALL Circumcirculo FAST A,B,C REPEAT |
Ejercicios sugeridos:
A) De la misma manera como en el ejemplo, convierte también las
otras construcciones del capítulo 6 (centro de gravedad,
circunferencia inscrita, alturas) en INTERACTIONes.
B) Escribe un programa que permite al usuario cambiar el tamaño
de un rectángulo, arrastrando una de sus esquinas (mientras su
centro permanece en el mismo lugar).
C) Escribe un programa que permite al usuario cambiar el tamaño
de un cuadrado, y rotarlo, arrastrando una de sus esquinas
(mientras su centro permanece en el mismo lugar).
Capítulo 9: Limitar
movimientos en animaciones e interacciones
(Introduciendo ALONG, COPY, FILL)
A veces es útil mover un punto (o dejar que el usuario lo arrastre), pero no a cualquier parte de la pantalla, sino solamente a lo largo de una línea predefinida. Por ejemplo, en este capítulo queremos ilustrar visualmente la ley de que todos los ángulos dibujados sobre la misma cuerda en un círculo son iguales. Para este propósito necesitamos un círculo, una cuerda, y un punto que se mueve - pero solamente a lo largo de la circunferencia del círculo. La palabra clave ALONG nos permite domesticar un punto movible de tal manera que obedecerá a esta orden. El ejemplo siguiente muestra el uso de ALONG tanto en una ANIMATION como en una INTERACTION.
En la ANIMATION tenemos la línea siguiente:
STEP P ALONG c1, 3
Esto le dice al punto P que tiene que moverse a lo largo de la
circunferencia del círculo c1. (En vez de un círculo, se puede
también especificar una recta después de ALONG.) - Ahora,
puesto que el movimiento del punto está confinado a una
circunferencia, ya no podemos darle un par de coordenadas x y y
para su movimiento. Podemos darle un solo parámetro: la
distancia que se moverá (3 píxeles en nuestro ejemplo); y la
dirección es dada por el círculo resp. por la recta en la cual
se mueve.
Para círculos, un valor positivo de movimiento significa en
sentido contrario al reloj, y un valor negativo significa en
sentido del reloj. Para líneas, un valor positivo significa
moverse en la dirección del vector de la línea, y un valor
negativo significa en dirección contraria.
Ahora mira el procedimiento INTERACTION. Aquí tenemos una línea similar:
CLICKABLE P ALONG c1
Con esta instrucción, el usuario puede arrastrar el punto P, pero no podrá alejarlo de la circunferencia del círculo. Si ejecutas el programa y lo pruebas, verás el efecto.
Aquí está el programa entero:
WINDOW 640,420 TWINDOW 2,420, 636,40 TEXT "Todos los ángulos sobre la misma cuerda en un círculo son iguales." CONSTRUCT Init FAST ANIMATE MoverAngulo FAST TEXT "Ahora arrastra tú mismo el punto P alrededor del círculo." INTERACT InteractAngulo FAST END CONSTRUCTION Init CIRCLE c1, 320,200, 170, (0,0,255) FILL c1, (0,0,255), 20 ILINE invisible, 0,310, 600,310 A,B = CROSS invisible, c1 chord = LINE A,B P = COPY B REPEAT ANIMATION MoverAngulo 'Restringimos el movimiento del punto P al círculo c1: STEP P ALONG c1, 3 MARKPOINT P a = LINE P,A, -1, (128,0,0) b = LINE P,B, -1, (128,0,0) MARKNUMBERANGLE a,b, "a" REPEAT 250 INTERACTION InteractAngulo 'Restringimos el movimiento del punto P al círculo c1: CLICKABLE P ALONG c1 MARKPOINT P a = LINE P,A, -1, (128,0,0) b = LINE P,B, -1, (128,0,0) MARKNUMBERANGLE a,b, "a" REPEAT |
Dos otras instrucciones en este programa necesitan una explicación, ambas en la CONSTRUCTION Init:
FILL c1, (0,0,255), 20
Esta instrucción no realiza ninguna construcción.
Simplemente llena el círculo c1, que
ya existe, con un color. El número 20 indica la opacidad del
relleno en una escala de 0 a 255. 0 is completamente transparente
(no verás nada del relleno); 255 es intensidad completa. Si el
círculo es un círculo parcial (o sea un arco), solamente el
sector que corresponde al arco será rellenado.
Existe otra forma de la instrucción FILL que rellena un
triángulo; en este caso tienes que indicar las tres puntas del
triángulo:
FILL punto1, punto2, punto3, color, opacidad.
FILL es una operación relativamente lenta. Si la pones en un
procedimiento que será llamado repetidamente en modo FAST, la
pantalla puede parpadear si tienes una computadora un poco
antigua.
La otra instrucción nueva en este programa es:
P = COPY B
Queremos que el punto movible P comienze en el mismo lugar
como el punto B en el círculo. Por esto hacemos una
"copia" de B y la ponemos en la variable P. Entonces P
tendrá exactamente las mismas coordenadas y la misma apariencia
como B.
Puedes copiar puntos, rectas y círculos. Pero si intentas
"A = COPY a", donde A es un
punto y a una recta, el intérprete se
quejara de que "los tipos no coinciden".
Este es el resultado del programa en dos momentos diferentes:
Ejercicios sugeridos:
A) Escribe una ANIMATION que simula el movimiento de las manillas
de un reloj. Pon también los números de I a XII en su lugar
correspondiente en la pantalla.
B) Escribe una ANIMATION que dibuja una cicloide (la trayectoria
de un punto en la circunferencia de una rueda que rueda sobre el
suelo).
C) Escribe una INTERACTION que permite al usuario arrastrar la
punta superior de un triángulo, pero sin cambiar la altura del
triángulo. Explica con un texto que el área de todos estos
triángulos es igual. Rellena el triángulo con un color.
Capítulo 10: un menú
(Introduciendo MENU, MENUITEM, EXITMENU, ENDMENU, REPEATMENU)
Es práctico tener un menú en un programa. (Excepto de que te
hace pensar en comida cuando deberías estar pensando en
programar.) El usuario puede ver a primera vista lo que el
programa ofrece, y puede escoger las opciones que desea.
Una ventana de GeoScript no tiene menú, solamente tres botones
predefinidos, como has visto en los ejemplos anteriores. Pero
puedes programar unas listas de menú emergentes sencillas dentro
de un programa de GeoScript. Este es un ejemplo de un menú
sencillo:
MENU MENUITEM "Opción 1" TEXT "Seleccionaste la opción 1." MENUITEM "Opción 2" TEXT "Seleccionaste la opción 2." MENUITEM "Opción 3" TEXT "Seleccionaste la opción 3." ENDMENU WAIT END
Claro que este menú no hace nada interesante. Pero te
demuestra como funciona. Ves que comienza con MENU (sin
parámetros), seguido por una lista de MENUITEMs. Después de
MENUITEM tienes un texto. Este es el texto que aparecerá en la
lista del menú.
De hecho, MENU tiene dos parámetros opcionales:
Puedes darle dos argumentos de color. El primero será el color
del texto, y el segundo el color de fondo, de la opción resaltada
del menú. No es posible (todavía) cambiar los colores de las
opciones no resaltadas; estas aparecerán siempre en negro sobre
gris.
Después de una línea MENUITEM colocas las instrucciones que
deben ejecutarse para la opción correspondiente. GeoScript
ejecutará las instrucciones que encuentra después del MENUITEM
que fue seleccionado por el usuario. Tan pronto como encuentra un
nuevo MENUITEM o un ENDMENU, saltará a la línea después de
ENDMENU y continuará allí.
El usuario puede navegar por el menú con las teclas de flechas y
seleccionar la opción resaltada con [Enter]. O puede hacer clic
en una opción, por supuesto. - Para no seleccionar nada, el
usuario puede presionar la tecla [Esc], o hacer clic con el
ratón afuera de la lista del menú. El programa continuará
entonces después de ENDMENU sin ejecutar ninguna de las
opciones.
Pero la instrucción MENU tiene más capacidades que esta. Por ejemplo, supongamos que nuestro usuario ha seleccionado una opción del menu, ésta se ha ejecutado, y entonces el usuario desea seleccionar otra opción del mismo menú. Pero la lista del menú ya desapareció. ¿Cómo volvemos a ella? - Puedes hacerlo con terminar la lista con REPEATMENU en vez de ENDMENU. Esto hace que el menú aparecerá repetidamente, cada vez que la ejecución de una opción termina. Pero entonces tenemos otro problema: ¿cómo puede el usuario salir de este menú? Se repetirá infinitamente. O sea, lo haría - si no existiera la instrucción EXITMENU. Pon EXITMENU al fin de las instrucciones de una opción, y el programa saltará a la línea después de REPEATMENU. Entonces cambiamos ligeramente nuestra primera lista de menú:
MENU MENUITEM "Opción 1" TEXT "Seleccionaste la opción 1." MENUITEM "Opción 2" TEXT "Seleccionaste la opción 2." MENUITEM "Opción 3" TEXT "Seleccionaste la opción 3." MENUITEM "¡Quiero salir de este menú aburrido!" TEXT "Decidiste salir del menú." EXITMENU REPEATMENU WAIT END
Este menú se repetirá hasta que el usuario seleccione la cuarta opción (o hasta que presione [Esc] o haga clic fuera de la lista del menú).
Pero hay aun más. Puedes también anidar menús: un MENUITEM puede a su vez contener una nueva lista MENU. Verás esto en el ejemplo siguiente. Contiene la misma animación e interacción como el programa del capítulo 9, pero ahora el usuario puede escoger entre animación e interacción, y puede seleccionar el modo de ejecución.
WINDOW 640,420 TWINDOW 2,420, 636,40 CALL Init FAST MENU MENUITEM "Animar la construcción automáticamente" TEXT "Todos los ángulos sobre la misma cuerda en un círculo son iguales." MENU MENUITEM "Modo FAST (animando)" ANIMATE MoverAngulo FAST MENUITEM "Modo PACE (muestra los pasos de construcción)" ANIMATE MoverAngulo PACE MENUITEM "Modo SLOW (muestra las herramientas de dibujo)" ANIMATE MoverAngulo SLOW ENDMENU MENUITEM "Mostrar la construcción de manera interactiva" TEXT "Ahora arrastra tú mismo el punto P alrededor del círculo." MENU MENUITEM "Modo FAST (animando)" INTERACT InteractAngulo FAST MENUITEM "Modo PACE (muestra los pasos de construcción)" INTERACT InteractAngulo PACE MENUITEM "Modo SLOW (muestra las herramientas de dibujo)" INTERACT InteractAngulo SLOW ENDMENU MENUITEM "Salir del programa" EXITMENU REPEATMENU END CONSTRUCTION Init CIRCLE c1, 320,200, 170, (0,0,255) FILL c1, (0,0,255), 20 ILINE invisible, 0,310, 600,310 A,B = CROSS invisible, c1 chord = LINE A,B P = COPY B REPEAT ANIMATION MoverAngulo STEP P ALONG c1, 3 MARKPOINT P a = LINE P,A, -1, (128,0,0) b = LINE P,B, -1, (128,0,0) MARKNUMBERANGLE a,b, "a" REPEAT 250 INTERACTION InteractAngulo CLICKABLE P ALONG c1 MARKPOINT P a = LINE P,A, -1, (128,0,0) b = LINE P,B, -1, (128,0,0) MARKNUMBERANGLE a,b, "a" REPEAT |
Así aparece la lista del menú principal en la pantalla: | ![]() |
Ejercicios sugeridos:
Crea tu propio proyecto que demuestra un principio geométrico de
tu elección. Añade un menú al programa, con el cual el usuario
puede elegir entre diferentes partes de tu programa.
Capítulo 11: Cambiar los
estilos y colores predefinidos
(Introducendo DEFAULTS, TOOLDEFAULTS)
GeoScript tiene ciertos valores predefinidos para colores,
propiedades de puntos y rectas, etc, que aplica a cada elemento
cuyas propiedades no se indican explícitamente en el programa.
Si deseas que un elemento aparezca de manera diferente, tienes
que indicar explícitamente su color, estilo y grosor.
Pero hay también una manera de cambiar la apariencia predefinida
de los elementos para el programa entero de una vez. Esto se hace
con la instrucción DEFAULTS, que tiene la siguiente síntaxis:
DEFAULTS colorFondo [, colorDibujo, colorTexto, colorAuxiliar, grosorLinea, patrón, grosorPunto, estilo, posicionAngulo, anchoArco]
Los parámetros significan lo siguiente:
ColorFondo = Color de fondo de la ventana de la
aplicación.
ColorDibujo = El color con el cual se dibujan los
elementos geométricos.
ColorTexto = El color predefinido del texto.
ColorAuxiliar = El color de las líneas auxiliares que
aparecen en las construcciones detalladas predefinidas en los
modos PACE y SLOW.
grosorLinea = Grosor predefinido de rectas y círculos.
patrón = Patrón predefinido de las rectas.
grosorPunto = Grosor predefinido de puntos.
estilo = Estilo predefinido de puntos.
PosicionAngulo = Valor predefinido del parámetro
opcional "posición" en MARKANGLE.
anchoArco = Ancho predefinido (en grados) de los arcos
auxiliares que aparecen en las construcciones detalladas
predefinidas en los modos PACE y SLOW.
La instrucción DEFAULTS cambia estos valores como los indicas, para todas las instrucciones de dibujo siguientes. Recuerda que NO cambia la apariencia de la ventana y de los objectos ya dibujados. Por tanto, usar DEFAULTS tiene sentido solamente cuando estás inicializando una construcción nueva.
Existe también una instrucción TOOLDEFAULTS que cambia la apariencia de las herramientas que se dibujan en modo SLOW / TOOLS. Su síntaxis es:
TOOLDEFAULTS tamañoLápiz [, tamañoEscuadra, anchoRegla, colorLápiz, colorCompás, colorEscuadra, colorTransportador, colorRegla]
Los parámetros se explican por sí mismos. tamañoLápiz
se aplica no solamente al lápiz, sino también al compás. tamañoEscuadra
se aplica no solamente a la escuadra, sino también al
transportador. (Escuadra y transportador aparecen solamente con
la instrucción LINEPOLAR.)
Un valor de -1 en los parámetros de color de TOOLDEFAULTS tiene
un significado especial: hace que la herramienta correspondiente
aparezca en el mismo color como el elemento que está dibujando.
GeoScript pone este valor inicialmente para el lápiz: habrás
notado en los ejemplos anteriores que el lápiz aparece siempre
en el mismo color como la recta o el punto que dibuja.
El siguiente ejemplo demuestra el efecto de los cambios aplicados con DEFAULTS y TOOLDEFAULTS. Adicionalmente cambiamos el color de las opciones resaltadas en el menú.
DEFAULTS 0, (255,180,255), (255,255,0), (0,0,128), 3, &HF01, 20, 2, 0, 45º TOOLDEFAULTS 50, 100, 20, (0,255,0), (0,160,0), (160,160,0), (160,0,0), (50,90,50) CLS 0 '¡DEFAULTS no cambia el fondo que ya está dibujado! 'excepto si tienes una instrucción SCREEN después de DEFAULTS. WINDOW 640,420 TWINDOW 2,420, 636,40 CALL Init FAST MENU (255,255,0), (190,0,0) MENUITEM "Animar la construcción automáticamente" TEXT "Todos los ángulos sobre la misma cuerda en un círculo son iguales." MENU MENUITEM "Modo FAST (animando)" ANIMATE MoverAngulo FAST MENUITEM "Modo PACE (muestra los pasos de construcción)" ANIMATE MoverAngulo PACE MENUITEM "Modo SLOW (muestra las herramientas de dibujo)" ANIMATE MoverAngulo SLOW ENDMENU MENUITEM "Mostrar la construcción de manera interactiva" TEXT "Ahora arrastra tú mismo el punto P alrededor del círculo." MENU MENUITEM "Modo FAST (animando)" INTERACT InteractAngulo FAST MENUITEM "Modo PACE (muestra los pasos de construcción)" INTERACT InteractAngulo PACE MENUITEM "Modo SLOW (muestra las herramientas de dibujo)" INTERACT InteractAngulo SLOW ENDMENU MENUITEM "Salir del programa" EXITMENU REPEATMENU END CONSTRUCTION Init CIRCLE c1, 320,200, 170, (0,0,255) FILL c1, (0,0,255), 20 ILINE invisible, 0,310, 600,310 A,B = CROSS invisible, c1 chord = LINE A,B P = COPY B REPEAT ANIMATION MoverAngulo STEP P ALONG c1, 3 MARKPOINT P a = LINE P,A, -1, (128,0,0) b = LINE P,B, -1, (128,0,0) c = BISECTOR a,b MARKNUMBERANGLE a,b, "a" REPEAT 250 INTERACTION InteractAngulo CLICKABLE P ALONG c1 MARKPOINT P a = LINE P,A, -1, (128,0,0) b = LINE P,B, -1, (128,0,0) c = BISECTOR a,b MARKNUMBERANGLE a,b, "a" REPEAT |
Este es un ejemplo del resultado:
Ahora que dominas los fundamentos de GeoScript, ¡nada te detendrá de escribir los programas más fabulosos!
Si escribes un programa GeoScript interesante y deseas
compartirlo con otros usuarios, envíalo a: