Tutorial de

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

Sitio web de GeoScript


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:

Sitio web de GeoScript