sexta-feira, 9 de maio de 2008

Gerando uma saída gráfica... sem complicações!

.
Imagine a cena: Você está estudando algum algoritmo, por exemplo o método de aprendizado de alguma rede neural. Resolveu programar o dito cujo na sua linguagem preferida, pra treinar e ver "na real" os resultados. Lá pelas tantas deu aquela vontade de gerar uma saída gráfica...

[ modo naftalina ON ]
Leitores com menos de 30 anos não precisam ler esse trecho - Nessa hora deu aquela saudade do velho BASIC do TK2000 ( clone do Apple ][ ), onde comandos como HGR, HCOLOR, HPLOT e HLIN resolviam sua vida? :-)
[ modo naftalina OFF ]

Soluções possíveis:

- usar um toolkit gráfico, tipo GTK, QT, WxWidgets... porém você não tem tempo pra isso!

- usar uma biblioteca gráfica mais simples: futucando na net, encontrei a EZXDISP. Me pareceu bem facinha. Mas... mesmo assim, não estava afim de gastar tempo estudando outra API.

Sobrou então....

- gerar um arquivo no formato HPGL! O formato de saída gráfica HPGL foi inventado para controlar as plotters da HP, nos idos de lá-vai-fumaça. O legal deste formato de arquivo é que ele é do tipo texto, ou seja, você não precisará de nenhuma biblioteca especial no seu programa para gerar a saída gráfica... basta gerar um arquivo texto, e inserir dentro dele alguns comandos de desenho.

O pequeno problema desta solução é que você vai ter que pensar como um ploter, ou seja, pra desenhar uma linha reta você vai precisar:

- mover a caneta para a posição inicial
- abaixar a caneta
- mover a caneta para a posição final
- levantar a caneta

Vejam um pequeno "hello world" em HPGL (arquivo extensão .plt):

IN;
inicializar a trapizonga

IP;
define o ponto de origem do desenho (0,0)
SC0,100,0,100;
define a escala do desenho
SP1;
select pen 1
PU0,0;
move a caneta para o ponto inicial
PD100,0,100,100,0,100,0,0;
abaixar a caneta ("Pen Down") e mover para varios locais, desenhando uma caixa
PU50,50;
levantar a caneta ("Pen Up") e mover para 50,50
CI25;
desenha um circulo de raio 25
SS;
seleciona a fonte padrao
DT*,1;
define o asteristico como limitador de texto
PU20,80;
levanta a caneta e move para 20,80
LBHello World*;
escreve Hello World

Faça o teste! copie o texto acima em um arquivo com extensão .plt.
Obviamente, os comentários não fazem parte do arquivo... :-)


Como visualizar o resultado? Infelizmente o visualizador de imagens padrão do Ubuntu/Gnome não entende este formato diretamente. Vamos precisar então converter para JPG ou PNG. Encontrei no repositório o programa HP2XX. Basta então, no seu programa em C, fazer uma chamada a este programa via system:
system("hp2xx -m jpg telecoteco.plt");
... para gerar o arquivo "telecoteco.jpg" , com a saida gráfica do seu programa.

Depois disso tudo, talvez você esteja pensando... "mas, mesmo assim terei que aprender como funcionam alguns comandos do HPGL ..."

É verdade .... tem sim .... mas você não está querendo moleza demais não?? :-)

Abraços!
Carlão

Nenhum comentário: