La petita aplicació efecte lent va aparèixer com a resultat t'una Setmana Santa sense plans.
Per aquelles dates jo estava acabant de programar la primera versió de l'encriptador (File Encoder Application), i necessitava alguna cosa vistosa per a l'opció "Sobre l'aplicació ..."
La idea original no és meva, si no que la vaig implementar seguint un efecte que havia vist en una d'aquelles legendàries demos de DOS.
La forma d'implementació escollida va ser encapsular l'efecte dins d'un JPanel de Java swing.
Tot el que es fiqui dins del panel, pot ser "ampliat" amb la lent, que pot ser posada a les coordenades que s'escullin.
Va ser especialment costós aconseguir que els refrescos dels components de text (en concret quan es modifica la ubicació del text seleccionat), no afectés negativament a l'efecte visual.
Internament, la manera de funcionar és que quan es crea el LensJPanel, se li passa el JPanel que té el contingut al que es vol fer l'efecte, el radi de la lent i si serà una lent d'ampliació o de disminució.
Com tenim el radi i si la lent serà d'ampliació o de disminució, es crea una matriu quadrada de dues dimensions, amb un element per cada pixel del quadrat que conté la lent.
Per a cada un d'aquestos píxels (píxel destí), es calculen las coordenades de la imatge original (píxel origen) d'on s'haurà d'agafar el color per quan es faci la transformació.
La transformació és senzilla, això sí, en coordinades polars. Ara explicaré aquesta transformació pel cas de lent d'ampliació:
Per a una posició determinada del quadre de la lent, es calcula un píxel del que es recollirà el color quan s'hagi de fer la transformació. Aquest píxel, estarà també dins del quadre de la lent. A més, per a un píxel determinat, es calcula el radi (desde el centre de la lent) i l'angle.El píxel "origen" pel píxel que estem calculant tindrà aquest mateix angle, però canviarà el radi. El radi sempre varia del 0% al 100%, tant pels píxels "origen" com pels píxels "destí", on el 100% és la longitud del radi de la lent. És a dir, per a cada píxel destí, per a calcular el seu píxel origen, es manté l'angle i el radi es transforma, utilitzant una función amb derivada monòtona creixent en l'interval entre 0 i 1, on f(0) tindrà un valor de 0 i f(1) tindrà un valor de 1, on 0 es el 0% del radi de la lent i 1 es el 100% del radi de la lent. Això voldrà dir que els radis prendran el seu píxel origen d'un radi menor, cosa que farà l'efecte de que a prop del dentre de la lent s'amplia la imatge. Fora del cercle de la lent, la transformaciò serà la identitat (és a dir, els píxels destí en aquesta zona, seran iguals que els píxels origen).
L'explicació ha quedat una mica confusa, però si t'interessa el tema, te pots posar en contacte amb mí.
Espero que a algú li sigui d'utilitat :-)