O objetivo deste trabalho é desenvolver um programa em Haskell para gerar uma representação gráfica de dados conhecida como tag cloud ou "nuvem de tags". O gráfico é gerado a partir de uma lista contendo o número de ocorrências de cada tag. A imagem será gerada em formato SVG (Scalable Vector Graphics) e armazenada em um arquivo, usando um código-fonte em Haskell fornecido como ponto de partida.
Tag cloud
Existem vários tipos de nuvens de tags, com variações na origem dos dados e na representação gráfica utilizada. Neste trabalho, usaremos preferencialmente uma representação baseada em círculos, semelhante a um gráfico de bolhas (bubble chart).
Para gerar uma representação gráfica deste tipo, há um algoritmo publicado pelos autores do Wordle. O algoritmo pode ser aplicado no caso de tag clouds com círculos. Nesse caso, cada tag é colocada em um círculo cujo raio é proporcional à frequência da tag.
Uma vez definidos os raios de cada círculo, o problema se resume a posicioná-los no espaço de forma que fiquem próximos uns aos outros, sem sobreposição.
O algoritmo pode ser resumido da seguinte maneira:
Ordenar os círculos pelos seus raios, em ordem decrescente.
Para cada círculo:
Gerar uma posição inicial
Enquanto o círculo tiver intersecção com algum outro
Atualizar sua posição seguindo uma espiral, de dentro para fora
Requisitos e metodologia
Você pode usar como ponto de partida um esqueleto de programa em Haskell (tagcloud.zip), que possui algumas funções prontas e outras incompletas. Obs.: não é obrigatório o uso desse código.
O código fornecido (tagcloud.zip) é um projeto do Eclipse. Para usá-lo, copie-o para seu computador e importe o projeto no Eclipse: Project Explorer -> Import -> General -> Existing Projects into Workspace -> Next -> Select archive file -> Browse (procure o arquivo tagcloud.zip) -> Finish. Quem não estiver usando o Eclipse deve baixar o pacote e extrair somente o Main.hs.
Seu código deve implementar um algoritmo que gere os círculos com tamanho e posição conforme descrito acima, ou usando outro algoritmo semelhante. Você também deve implementar uma forma de variar a cor dos círculos (R,G,B). Por exemplo: tons de uma cor, com variações proporcionais ao raio dos círculos. Não é necessário colocar texto dentro dos círculos.
Você deve usar recursos de programação funcional. Evite soluções inspiradas na programação procedimental e imperativa. Sempre que possível, use funções de alta ordem e funções auxiliares pré-definidas em Haskell.
Você deve dividir o trabalho em iterações, desenvolvendo funções sucessivamente até produzir o programa final. O trabalho deve ser mantido em um repositório versionado e público (Assembla, Google Code, GitHub, etc.). Enquanto estiver desenvolvendo o trabalho, você deve fazer envios frequentes de código ao repositório.
Entrega
Conforme as instruções gerais para entrega de trabalhos, todos os arquivos deste trabalho devem ficar numa pasta nomeada t3.
Você deve entregar o código-fonte da última versão do trabalho. Se você usou Eclipse, pode entregar todo o arquivo do projeto.
Na página index.html dentro da pasta t3, você deve indicar o endereço do repositório público do código.
O trabalho deve ser entregue até as 23:59 do dia 26/11/2012.
Avaliação
Para receber nota, o trabalho deverá ser apresentado à professora no laboratório, em data a combinar.
Terá nota 10,0 quem completar todos os requisitos do trabalho até a data final de entrega e demonstrar conhecimentos da programação funcional em Haskell, tanto no código como na apresentação do trabalho. Além disso, o repositório deverá conter diversas revisões do código, demonstrando que o desenvolvimento se deu de forma incremental.
Nota extra: você pode conseguir alguma nota extra se demonstrar um esforço adicional de prática em programação funcional. Algumas ideias: colocar texto dentro dos círculos, usar diferentes esquemas de escolha de cores, desenvolver trechos do código em outras linguagens funcionais ou procedimentais e fazer comparativos com o código desenvolvido.