A ver posts de Março de 2010

Na continuação desta posta, venho agora falar-vos de sombras.

O Imagick tem uma instrução própria para gerar sombras, shadowImage, que aceita quatro parâmetros: opacidade, sigma, x e y. Uma das vantagens mais fascinantes é que, se a imagem passada tiver transparência, a sombra segue o contorno da mesma. Ideal para usar com botões, ícones…

O que é?

A extensão Imagick é uma extensão para PHP para criação e modificação de imagens, que usa a API ImageMagick. Está disponível através do PECL ou, apenas para Windows, no site do seu criador, Mikko Koppanen. A API ImageMagick, que é de instalação obrigatória, está disponível no site oficial, para vários sistemas operativos.

Em relação à extensão GD2, bastante comum, o Imagick é mais rápido nalgumas das operações mais comuns: redimensionamentos, filtro sharpen, rotações, cortes, etc. Além disso, tal como está no nome, aplica alguma magia nalgumas operações: sombreados, cantos arredondados, composição de texto e imagem… Apesar de nada disto ser inacessível à extensão GD2, no Imagick será possível fazer a maior parte destas operações em poucas linhas – nalgumas operações, apenas uma linha!

Recentemente, inserido num projecto extenso – e não quero falar sobre isso! – uma das fases consistia em dividir um círculo em fatias, de forma dinâmica. O grafismo é relativamente simples, basta usar uns lineTo’s e uns curveTo’s, tudo pintalgado com uns fills, e a coisa ia fluida. Quanto à matemática inerente, também me parecia bastante simples, basicamente é dividir um círculo completo pelo número de fatias.

O Actionscript, como quase todas as linguagens de programação, trabalha em radianos, o que acaba por ser, até, intuitivo. Aprende-se para aí no 7º ano que um círculo são 2 x PI, que corresponde aos 360 graus. Posto isto, o código era, aparentemente, trivial e croquetes:

// gráfico onde vamos desenhar as fatias
var gfx:Graphics = container.graphics;
// raio da tarte
var raio:Number = oMeuRaio;
// angulo de cada fatia
var angulo:Number = (Math.PI * 2) / numFatias;

// i é incrementado o angulo correspondente às fatias a cada passagem
for(var i:Number = 0; i < (Math.PI * 2); i += angulo)
{
    // mover para o centro do círculo
    gfx.moveTo(0, 0);
    // linha até ao limite da tarte
    gfx.lineTo(raio * Math.cos(i), raio * Math.sin(i));
}

Parece bastante simples e intuitivo, certo? Durante algumas horas, a coisa rolou maravilhosamente. Até que reparei que, nalgumas situações, era desenhada uma fatia extra por cima da primeira. Uma das situações onde isso acontecia era quando a quantidade de fatias era igual a seis. Alguns trace’s mais tarde, dei com o gato e, depois de praguejar durante alguns minutos contra a Adobe, a solução foi feita com um mínimo de esforço. Mas vamos ao gatinho primeiro…

Adoro datas. Sério, é uma das áreas mais fascinantes da programação. Se não acreditam, vejam lá o filme que foi o chamado bug do ano 2000. Até arranjaram um acrónimo fixolas e tudo: Y2K. Mas sobre isso falarei noutro dia, ou então não – até porque vem aí um problema bem mais grave em 2038 (a que alguns já chamam Y2K38 – c’mon, really?).

Aqui há dias relembraram-me o quanto eu gosto de datas. Um tipo – que eu não conheço de lado nenhum – pediu ajuda num fórum para fazer uma função em C que calculasse o número de dias entre duas datas; provavelmente, e tendo em consideração o pedido, para um trabalho da escola, ou coisa que o valha. Devo dizer que fui um bocadinho totó e disponibilizei logo ali a função inteira, quando a ideia de um fórum não é fazer por, mas sim ajudar a fazer.

Seja como for, só me decidi ajudá-lo por considerar o problema interessante; não é algo que seja muito comum hoje em dia, até porque a maior parte das linguagens de programação tem bibliotecas específicas para trabalhar com datas, e esta função é disponibilizada de forma directa. Além disso, vi que as orientações que já lhe tinham dado não eram, nem de perto, nem de longe, o mais eficaz que se podia ser. O problema no meio disto tudo, como não podia deixar de ser, é a existência ou não de anos bissextos no intervalo. Como Arthur C. Clarke colocou de forma hilariante em 3001 – Odisseia Final, “um dia, um dos menores erros de Deus será corrigido e o ano terá 12 meses de 30 dias exactamente iguais”.

Para finalizar a primeira fase desta minha incursão pelas tries, vamos agora colocá-la a fazer alguma coisa de útil. Convenhamos que verificar se uma palavra existe ou não é trabalho fraquinho, tendo em consideração as potencialidades desta estrutura de dados. E uma dessas potencialidades é precisamente construir listagens a partir de verificações parciais. Estas podem servir para auto-completar palavras (como nos telemóveis, motores de busca) e para sistemas de correcção ortográfica, com listas de palavras semelhantes a palavras erradas, isto é, não constantes da lista. A implementação específica deste tipo de sistema está fora do âmbito desta posta, visto que não é trabalho específico da trie; esta, apenas devolve uma lista de palavras partindo de uma incompleta, usando wildcards1.

Começando pelo caso do wildcard ‘?’, correspondente a um caracter naquela posição, uma aproximação naïve seria iterar por todas as letras do alfabeto, incluindo as acentuadas, colocá-las na posição correcta e verificar a existência das palavras resultantes na trie. Salta à vista a inocência deste processo: em primeiro lugar, iterar por todos os caracteres possíveis para a posição incluiria muito mais do que os 26 normais do alfabeto – só em caracteres com diacríticos, seria bem mais do dobro; em segundo lugar, a ocorrência de palavras que obviamente não existem, com quatro consoantes seguidas, por exemplo; em terceiro e último lugar, quando quiséssemos implementar a pesquisa com o wildcard ‘*’, representando vários caracteres, os nossos problemas aumentariam exponencialmente.

 Categorias
 Arquivo
 Projectos em Destaque
 Últimas Postas no Blog
 Últimos Comentários do Blog