UFSM > Informática > ELC117 - Paradigmas de Programação

Trabalho 3: Gerando tag clouds em Haskell

Objetivo

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:
    1. Ordenar os círculos pelos seus raios, em ordem decrescente.
    2. 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.

Material de apoio