jueves, 28 de marzo de 2019

CTurtle: una buena forma de aprender C con la tortuga de LOGO

Ver CTurtle en mi GitHub
Es posible que algunos conozcáis el lenguaje de programación LOGO, puesto que se enseña/enseñó en algunas escuelas para empezar a aprender programación. Consiste en un lenguaje de programación donde básicamente mueves una tortuga con un lápiz en un entorno gráfico, con comandos como hacer avanzar la tortuga (fd) o hacer girar la tortuga (rt, lt). Esto esta muy bien, pero tiene un inconveniente: una vez dominas el lenguaje, no te va a servir para nada más aparte de mover la tortuga.
Aparte de esto, la mayoría de los interpretes de LOGO son antiguos, no tienen antialising en el dibujado, e incluso algunos ni siquiera son compatibles con los procesadores de 64 bit actuales.
Pues aprovechando estas vacaciones de navidad, he creado una librería para C muy fácil de utilizar que os permitirá hacer dibujicos de la misma manera que se hace en LOGO en el lenguaje de programación C.
Esta librería consta únicamente de 2 archivos turtle.cturtle.h aparte de la librería SDL, y tiene una implementación propia de antialising (En la cual dediqué gran parte del tiempo) y es compatible con Windows, Linux (Incluyendo Raspberry Pi), e imagino que en Mac también.

Ej:
El programa de la imagen sería el siguiente:

#include <stdio.h>
#include "turtle.h"
void fern(int size, int sign);
void fern(int size, int sign)
{
if (size<1) return;
t_penSize(size/4);
t_forward(size);
t_turnRight(70*sign);
fern(size/2,sign*-1);
t_penSize(size/4);
t_turnLeft(70*sign);
t_forward(size);
t_turnLeft(70*sign);
fern(size/2,sign);
t_penSize(size/4);
t_turnRight(77*sign);
fern(size-1,sign);
t_turnRight(173*sign);
t_penUp();
t_forward(size*2);
t_penDown();
t_turnLeft(180);
}
int main(int argc, char ** argv)
{
if (t_init(640,480,window)!=0) puts("Init error");
else {
t_autoframeOff();
t_moveSpeed(200);
t_turnSpeed(0);
t_penUp();
t_goTo(192,450);
t_setAngle(0);
t_penDown();
t_turColor(0,60,0);
fern(25,1);
t_frame();
t_saveBMP("fern.bmp");
t_idle();
}
}

Aparte de las instrucciones básicas como t_forward y t_turnRight también tenemos otras instrucciones opcionales como t_autoframeOff, t_moveSpeed y t_turnSpeed relacionadas con la animación, y otras instrucciones de utilidad interesantes como t_saveBMP que guarda en un archivo BMP el contenido de la pantalla.
La librería esta totalmente documentada en cualquier caso. Si aun así tenéis dudas o sugerencias, me las podéis comentar por aquí.