para casa :c
repite 4 [
avanza (20*:c) giraderecha 90 ]
avanza (20*:c)
giraderecha 30
repite 3 [
avanza (20*:c) giraderecha 120 ]
fin
para colocar :c
subelápiz
giraizquierda 30
retrocede (:c*20)
giraderecha 90
avanza (:c*22)
giraizquierda 90
bajalápiz
fin
para casas
borrapantalla
ocultatortuga
subelápiz
giraizquierda 90
avanza 200
giraderecha 90
bajalápiz
repitepara [n 3 7 2]
[ casa :n colocar :n ]
casa 10
fin
para rect :alto :largo si :alto = 0 | :largo = 0 [alto] repite 2 [ avanza :alto giraderecha 90 avanza :largo giraderecha 90 ] rect :alto -1 :largo -1 fin
Recordatorio: 5! = 5 * 4 * 3 * 2 * 1
para factorial :n si :n = 1 [devuelve 1] [devuelve :n * factorial (:n - 1)] fin
Ejemplo:
escribe factorial 5 --> 120.0 escribe factorial 6 --> 720.0
para copo :orden :lar si (:orden < 1) | (:lar < 1) [av :lar alto] copo :orden-1 :lar/3 giraizquierda 60 copo :orden-1 :lar/3 giraderecha 120 copo :orden-1 :lar/3 giraizquierda 60 copo :orden-1 :lar/3 fin para coponieve :orden :lar repite 3 [ giraderecha 120 copo :orden :lar ] finEj: coponieve 5 450
para escribir ocultatortuga repite 40 [ avanza 30 giraderecha 9 poncolorlapiz azar 7 rotula [XLogo es genial!] ] fin
para futuro :verbo
es frase "yo palabra :verbo "
é
es frase "t
úpalabra :verbo "
ás
es frase "
élpalabra :verbo "
á
es frase "nosotros palabra :verbo "emos
es frase "vosotros palabra :verbo "
éis
es frase "ellos palabra :verbo "
án
fin
Ejemplo: futuro "amar
yo amaré
tú amarás
él amará
nosotros amaremos
vosotros amaréis
ellos amarán
para futuro :verbo
haz "pronombres [yo
tú él nosotros vosotros ellos]
haz "terminaciones [
é ás á emos éis án]
repitepara [i 1 6]
[ es fr elemento :i :pronombres palabra :verbo elemento :i :terminaciones ]
fin
Ejemplo: futuro "amar
yo amaré
tú amarás
él amará
nosotros amaremos
vosotros amaréis
ellos amarán
para futuro :verbo
haz "pronombres [yo
tú él nosotros vosotros ellos]
haz "terminaciones [
é ás á emos éis án]
conjugar :verbo :pronombres :terminaciones
fin
para conjugar :verbo :pronombres :terminaciones
si vacio? :pronombres [alto]
es fr primero :pronombres palabra :verbo primero :terminaciones
conjugar :verbo mp :pronombres mp :terminaciones
fin
Ejemplo: futuro "amar
yo amaré
tú amarás
él amará
nosotros amaremos
vosotros amaréis
ellos amarán
Primero, algunas aclaraciones: Habrás visto en la sección 5.1.4 que el comando poncl puede tomar como argumento tanto un número como una lista. Aquí nos centraremos en codificar valores RVA. Cada color en XLOGO está codificado usando tres valores: rojo, verde y azul, de ahí RVA (RGB en inglés).
Estos tres números conforman una lista que es argumento de la primitiva poncl, por lo que representan respectivamente los componentes rojo, verde y azul de un color. Esta manera de codificar no es muy intuitiva, así que para tener una idea del color que obtendrás puedes usar la caja de diálogo Herramientas Elegir color del lápiz.
Sin embargo, usando esta forma de codificar colores, se hace muy fácil transformar una imagen. Por ejemplo, si quieres convertir una foto color en escala de grises, puedes cambiar cada punto (píxel) de la imagen a un valor promedio de los 3 componentes RVA. Imagina que el color de un punto de la imagen está dado por [0 100 80]. Calculamos el promedio: (0 + 100 + 80)/3 = 60, y asignamos el color [60 60 60] a este punto. Esta operación debe ser realizada para cada punto de la imagen.
Vamos a transformar una imagen color de 100 por 100 a escala de grises. Esto significa que tenemos 100 * 100 = 10000 puntos a modificar.
La imagen de ejemplo utilizada aquí está disponible en la siguiente dirección:
http://xlogo.tuxfamily.org/images/transfo.pngAsí es como vamos a proceder: primero, nos referiremos al punto superior izquierdo como [0 0]. Luego, la tortuga examinará los primeros 100 puntos (pixeles) de la primera línea, seguidos por los primeros 100 de la segunda, y así sucesivamente. Cada vez tomaremos el color del punto usando encuentracolor, y el color será cambiado por el promedio de los tres [r v a] valores. Aquí está el código principal: (No olvides cambiar la ruta del archivo en el procedimiento!)
para transform # Debes cambiar la ruta de la imagen transfo.png # Ej: cargaimagen [/home/usuario/imagenes/transfo.png] borrapantalla ocultatortuga pondirectorio "/home/usuario/imagenes cargaimagen "transfo.png escalagris fin para escalagris repitepara [y 0 -100 -1] [ repitepara [x 0 100] # asignamos el promedio de color del punto al color del lapiz [ poncolorlapiz pixel encuentracolor lista :x :y # convertimos el punto escala de grises punto lista :x :y ] ] fin para pixel :lista1 # devuelve el promedio de los 3 numeros [r v a] haz "r primero :lista1 haz "lista1 menosprimero :lista1 haz "v primero :lista1 haz "lista1 menosprimero :lista1 haz "a primero :lista1 haz "color redondea (:r+:v+:a)/3 devuelve frase :color frase :color :color fin
Para cambiar una imagen a su negativo, se puede usar el mismo proceso de la escala de grises, excepto que en lugar de hacer el promedio de los números [r v a], los reemplazamos por su complemento, o sea la diferencia a 255.
Ejemplo: Si un punto (píxel) tiene un color [2 100 200], lo reemplazamos con [253 155 55]. Podríamos usar el mismo código que en el ejemplo anterior, cambiando únicamente el procedimiento pixel, pero veamos un procedimiento recursivo:
para transform2 # Debes cambiar la ruta de la imagen transfo.png # Ej: c:\Mis Documentos\Mis imagenes\transfo.png borrapantalla ocultatortuga pondirectorio "c:\\Mis\ Documentos\\Mis\ imagenes cargaimagen "transfo.png negativo 0 0 fin para negativo :x :y si :y = -100 [ alto ] [ si :x = 100 [ haz "x 0 haz "y :y-1] [ poncolorlapiz pixel2 encuentracolor lista :x :y punto lista :x :y ] ] negativo :x+1 :y fin para pixel2 :lista1 # devuelve el promedio de los 3 numeros [r v a] haz "r primero :lista1 haz "lista1 menosprimero :lista1 haz "v primero :lista1 haz "lista1 menosprimero :lista1 haz "a primero :lista1 devuelve frase (255 - :r) frase (255 - :v) (255 - :a) fin
Supongo que apreciarás este hermoso programa:
para revertir :w si vacio? :w [devuelve "] [devuelve palabra ultimo :w revertir menosultimo :w ] fin para palindromo :w si :w = revertir :w [devuelve "cierto] [devuelve "falso] fin para palin :n si palindromo :n [escribe :n alto] [haz "texto suma :n revertir :n haz "texto frase "igual\ a :texto haz "texto frase revertir :n :texto haz "texto frase "mas :texto haz "texto frase :n :texto escribe :texto palin :n + revertir :n ] fin
Ejemplo: palin 78
78 mas 87 igual a 165 165 mas 561 igual a 726 726 mas 627 igual a 1353 1353 mas 3531 igual a 4884 4884
para roset pongrosor 2 repite 6 [ repite 60 [avanza 2 giraderecha 1] giraderecha 60 repite 120 [avanza 2 giraderecha] giraderecha 60 ] pongrosor 1 fin para roseton roset repite 30 [avanza 2 giraderecha 1] roset repite 15 [avanza 2 giraderecha 1] roset repite 30 [avanza 2 giraderecha 1] roset fin
Ejemplo:
borrapantalla ocultatortuga poncolorpapel 0 poncolorlapiz 5 roset subelapiz ponposicion [-300 0] bajalapiz ponrumbo 0 roseton