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 ]
fin
Ej: 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 [yotú é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 [yotú é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