Gráficos en la terminal

Como estoy un poco cansado de Linux From Scratch y me apetecía hacer una fricada, os traigo este script para que os entretengáis con él. Para que veáis que en la terminal de linux también se pueden hacer gráficos… aunque no sirvan para nada práctico.

#!/bin/bash

declare -A buf

plot()
{
	local x=$1 y=$2
	local row=$((y / 2 + 1)) col=$((x + 1))
	local pix=${buf[$row,$col]} m=$((y % 2))

	echo -ne "\e[$row;${col}H\e[3$((((x + 1) / (y + 1)) % 8))m"
	if ((pix != 1 + m && pix != 3)); then
		buf[$row,$col]=$((pix + 1 + m))
		if ((pix != 0)); then
			echo -ne "\xe2\x96\x88"
		else
			if ((m == 0)); then
				echo -ne "\xe2\x96\x80"
			else
				echo -ne "\xe2\x96\x84"
			fi
		fi
	fi
}

circle()
{
	local xc=$1 yc=$2 r=$3
	local x=0 y=$r
	local p=$((1 - r))
	local s s1 s2

	echo -ne "\e[s"
	for s in + -; do
		plot $xc $((yc $s r))
		plot $((xc $s r)) $yc
	done
	while ((x < y)); do
		((x++))
		if ((p < 0)); then
			((p += 2 * x + 1))
		else
			((y--))
			((p += 2 * (x - y) + 1))
		fi
		for s1 in + -; do
			for s2 in + -; do
				plot $((xc $s1 x)) $((yc $s2 y))
				plot $((xc $s1 y)) $((yc $s2 x))
			done
		done
	done
	echo -ne "\e[m\e[u"
}

if [ $# == 3 ]; then
	xc=$1; yc=$2; r=$3
else
	read rows cols <<< $(stty size)
	xc=$((cols / 2)); yc=$((rows))
	r=$((2 * rows / 3))
fi

circle $xc $yc $r

Podéis guardarlo en un fichero llamado circle, que es el nombre más adecuado, y darle permisos de ejecución. Para la primera prueba basta con que lo ejecutéis sin parámetros.

chmod +x circle
./circle

Una vez hayáis visto lo que hace, podéis pasarle parámetros. Los parámetros que recibe son tres: coordenadas X e Y del centro y radio. Las coordenadas están basadas en cero y empiezan en la esquina superior izquierda de la terminal. X es la columna e Y es la fila. El número de filas es igual al doble de las que tenéis en la terminal. Por ejemplo, para una terminal de 80×25 caracteres, el script os proporciona 80 pixels de ancho por 50 de alto. No es que sea una resolución deslumbrante, no sirve para jugar al Quake, pero para entretenerse un rato haciendo chorradillas sí que vale. 🙂

Algunas cosas curiosas que podéis probar:

clear; for ((x = 10; x <= 70; x += 8)); do ./circle $x 24 10; done

clear; for((y = 10; y <= 40; y += 12)); do for ((x = 9; x <= 70; x += 12)); do ./circle $x $y 6; done; done

clear; for ((r = 2; r < 18; r++)) do ./circle 40 24 $r; done

Podéis cambiar coordenadas y tamaños para adaptarlas a vuestra terminal. ¡Que lo disfrutéis! 🙂

EOF

Anuncios

2 pensamientos en “Gráficos en la terminal

    1. hexborg Autor de la entrada

      😀 Está my bien. Me ha gustado mucho. Lo que más me ha llamado la atención es que aprovechas un fallo conocido del script. Y es que no guarda memoria del estado de la pantalla entre distintas ejecuciones.

      Para otra vez a lo mejor hago una animación.

      Saludos y gracias por pasarte por aquí.

Los comentarios están cerrados.