Transiciones con efecto disolver en Silverlight 3
El efecto de transición entre imágenes disolver o ‘dissolve’ consiste en una interpolación desde la imagen inicial hasta la imagen final en un periodo de tiempo determinado.
Para ello se definirá un parámetro t, que representa el progreso de la transición y cuyo rango es de 0 a 1. Un valor de cero significa que la transición aún no ha comenzado, es decir, aún se muestra completamente la imagen de origen, mientras que un valor de 1 significa que se ha completado el 100% de la transición, es decir, se mostrará la imagen de destino. Un valor de 0.5 significaría que la transición está al 50% por lo que se mostraría una mezcla a partes iguales de la imagen de origen y la imagen de destino.
Para su implementación se utilizará un WriteableBitmap. Los pixeles de un WriteableBitmap en Silverlight se representan como valores pargb lo que implica que el canal alpha, encargado de representar el nivel de opacidad, debe ir premultiplicado por lo que para representar un color rojo 50% transparente el pixel debería contener los valores [0.5,0.5,0,0]. De todas formas, para el caso que nos ocupa simplemente realizaremos la interpolación entre cada uno de los componentes de cada pixel de la imagen.
Si representamos cada pixel como un vector de cuatro componentes, siendo tr el vector que representa a un pixel de la transición, o a uno de la imagen de origen y d a uno de la imagen de destino el calculo de cada uno de los pixeles de la transición para un t dado se realiza mediante la siguiente expresión:
![]()
siendo x,y las coordenadas del pixel.
El siguiente programa en Silverlight muestra el efecto de transición con dos imagenes predefinidas.
El código fuente del programa se encuentra adjunto al artículo.
Mapas de bits dinámicos en Silverlight
Una de las novedades introducidas en la versión 3 de Silverlight es la clase WriteableBitmap que nos permite la generación dinámica de mapas de bits o bitmaps.
Su funcionamiento es muy sencillo, basta con pasar en el constructor el número de pixels de ancho y de alto que queremos que tenga la imagen para generarla y una vez generada podemos acceder a su contenido a través de la propiedad Pixels.
En el siguiente fragmento de código se construye un bitmap de 320x200 pixels y se establece el pixel en la posición (x, y) al color (r,g,b). Una vez modificado el bitmap se debe llamar a la función Invalidate para actualizar su contenido.
1: var bitmap = new WriteableBitmap(320,200);
2: var pixelColor = BitConverter.ToInt32(new byte[] { (byte)b, (byte)g, (byte)r, 255 }, 0)
3: bitmap.Pixels[x + y * bitmap.PixelWidth] = pixelColor; 4: bitmap.Invalidate();Por supuesto es necesario asignar el bitmap a la propiedad Source de un control Image para representarle en pantalla.
Una funcionalidad interesante añadida es el método Render que permite representar en el bitmap un control gráfico descendiente de UIElement después de aplicarle una transformación (rotación,escala,posición) lo que abre la puerta a la generación de interesantes efectos.
La siguiente ilustración muestra la generación dinámica de bitmaps. Si posa el cursor sobre la imagen podrá ver una representación de metaballs construida sobre un WriteableBitmap.
Fiji – Silverlight en el escritorio
Fiji es un proyecto experimental que permite ejecutar aplicaciones Silverlight fuera del navegador, es decir, como aplicaciones de escritorio en su propia ventana. Su objetivo final es coger los archivos de aplicación (.xap) de Silverlight y utilizarles para generar un archivo ejecutable que no necesite del navegador para funcionar.
Para ello se utiliza el mismo mecanismo que algunos navegadores utilizan para cargar sus plugins, NPAPI (Netscape Plugin API).
Para utilizar Fiji solo es necesario pasarle como parámetro la ruta completa del archivo .xap que contiene la aplicación Silverlight, por ejemplo, “fiji.exe C:\AplicacionSilverlight.xap”.

El modelo Kuramoto
El fenómeno de la sincronización nos rodea: nuestro corazón, los ritmos circadianos, aplausos, generadores eléctricos... Ciertas especies de luciérnagas han cautivado a muchos viajeros en el Sudoeste Asiático, los cuales regresaban a sus lugares de origen contando historias de poblaciones inmensas de luciérnagas emitiendo luz intermitente de forma totalmente sincronizada creando grandes franjas de luz parpadeante en la oscuridad.
Su estudio se remonta a 1665, cuando Christiaan Huygens yacía enfermo en la cama con la compañía de dos relojes de péndulo. Después de unos días se dio cuenta de que los péndulos se movían de tal forma que cuando uno estaba completamente a la izquierda, el otro se encontraba completamente a la derecha, y viceversa.
Intrigado, modifico manualmente el ritmo de los péndulos pero con el tiempo siempre volvían a sincronizarse. La explicación que dio a lo que el llamaba “simpatía de dos relojes” fue que cada uno de los péndulos causaba un movimiento imperceptible en la pared de la que colgaba cada reloj y que dicho movimiento tendía a forzar la sincronización de de cada uno de los péndulos con el otro. El tiempo le daría la razón.
En el siguiente video se puede observar una versión de este fenómeno (con sonido se aprecia mejor).
El modelo Kuramoto fue motivado por el comportamiento de ciertos osciladores químicos y biológicos y permite modelar la sincronización y desincronización en grupos de osciladores acoplados. La ecuación que gobierna el sistema es la siguiente:
La limitada variedad de estados en los que el modelo se puede encontrar lo hace apropiado para el modelado de algunos sistemas utilizados en neurociencia.
En la siguiente aplicación, cuyo código se encuentra adjunto, puede observar como varía el comportamiento de 25 osciladores en función de la constante de acoplamiento (K). Al reiniciar la simulación se asignarán velocidades y fases iniciales aleatorias a cada uno de los osciladores.
Referencias
Kit3D
Aunque hasta la siguiente versión de Silverlight no se dispondrá de aceleración hardware y soporte 3D, existen alternativas en desarrollo que implementan un motor de representación tridimensional vía software.
Una de ellas es Kit3D, un proyecto OpenSource que se encuentra en sus primeros estadios de desarrollo y cuya API es similar a la que presenta WPF para la representación tridimensional.
La siguiente demo ha sido construida en base a Kit3D. Se puede observar que debido a que la representación no es acelerada por hardware, el programa consume bastante CPU cuando se activa.
Aquí se puede utilizar una demo basada en Kit3D que muestra escenas más complejas y permite controlar la cámara y la iluminación.
El autor de la libreria también tiene unas cuantas demos de sus posibilidades aquí.
El camino hacia Silverlight 3
Apenas un mes después de la salida de Silverlight 2 Scoth Guthrie ha publicado algunas de las nuevas características que tendrá la siguiente versión, prevista para el año que viene:
- Múltiples mejoras gráficas incluyendo soporte 3D y aceleración hardware en la GPU.
- Múltiples mejoras en la reproducción de video y sonido, incluyendo soporte para nuevos formatos como H.264.
- Nuevos controles y mayores posibilidades de enlazado a datos (Data Binding).
El potencial y nivel de rendimiento alcanzado en la versión 2 es muy elevado tal y como evidencian proyectos como QuakeLight, un port de Quake para Silverlight 2. Su rendimiento es sorprendente teniendo en cuenta que la versión 2 Silverlight no incluye soporte directo para la manipulación de Bitmaps y hay que recurrir a técnicas poco óptimas desde un punto de vista de rendimiento (en las que se basa este proyecto para representar el juego).
En su post también se mencionan algunas estadísticas interesantes, entre las cuales se destacan:
- Durante las últimas 4 semanas la versión final de Silverlight 2 ha sido instalada en más de 100 millones de ordenadores.
- NBC Olympics utilizó Silverlight 2 para retransmitir los juegos olímpicos (en directo y bajo demanda) a 60 millones de visitantes únicos este verano. Cada espectador visualizó un promedio de 27 minutos de video. En dicho sitio se utilizó el nuevo sistema adaptativo que permite aumentar o disminuir la calidad del video de forma dinámica dependiendo del ancho de banda disponible y de la capacidad de proceso del ordenador del espectador.
- En la edición de Agosto de 2008 de ‘Web Designer Magazine’ un representante de NOS publicó que había sido capaz de servir video a 100000 usuarios simultáneos utilizando 40 servidores Windows Media en vez de los 270 servidores que hubieran sido necesarios si hubiesen utilizado servidores Flash Media.
Regresión a la media
El hecho de que dos variables estén relacionadas puede servir para pronosticar o predecir cómo se comportará una variable tomando en consideración como se comporta la otra. Esto es lo que se consigue con los denominados modelos de regresión y sirven para representar la dependencia lineal de una variable, llamada variable dependiente o variable respuesta, respecto de otra variable, llamada variable independiente o variable predictora.
Este tipo de modelos, utilizados en primer lugar en el campo de la Astronomía y de la Física, deben su nombre genérico, modelos de regresión, a los trabajos que efectuó Francis Galton (1822-1911) a finales del siglo XIX. En ellos, Galton estudió la dependencia entre las alturas de los hijos y las de los padres y encontró un efecto que denominó “regresión a la media” y que consistía en los siguiente: los padres altos tienen en general hijos altos, pero en promedio, un poco menos altos que los padres; por el contrario, los padres bajos tienen hijos bajos, pero en promedio algo menos bajos que los padres. También comprobó que los descendientes de sujetos situados en las partes extremas de la distribución se aproximan, en promedio, más a la media que sus padres, y a este fenómeno, general en todos los seres vivos, lo denomino regresión a la media .
La siguiente herramienta permite calcular y representar gráficamente el polinomio de regresión (hasta grado 4) para un conjunto arbitrario de puntos.
[[Una aplicación Silverlight se muestra a continuación]]
El código fuente de la herramienta anterior se encuentra adjunto a este artículo.
Fuentes | Analisis de datos en psicología I - UNED
Servicios Web ASP.NET en Linux vía Mono
Mono, la implementación OpenSource de .Net, es ya una plataforma madura siendo actualmente una interesante opción a la hora de desarrollar en diversas plataformas entre las que se incluyen Linux, Windows, iPhone, Wii, etc. En teoría, al disponer de los fuentes podemos hacer que funcione en cualquier plataforma aunque actualmente su ‘footprint’ mínimo está en torno a 2 MegaBytes.
Como ejemplos importantes de su uso tenemos el reciente anuncio de SecondLife donde han comenzado a utilizarle en sus servidores; o Unity, una plataforma de desarrollo de videojuegos multiplataforma donde también se utiliza.
Moonlight, la implementación OpenSource de Silverlight basada en Mono avanza también a buen ritmo.
Entre sus características se encuentra soporte casi completo para ASP.NET 2.0, incluyendo Servicios Web.
La instalación es sencilla, en mi caso, bajo un servidor Ubuntu Hardy (8.04), bastó con ejecutar los siguientes dos comandos para tener el sistema listo:
- sudo aptitude install mono-2.0-devel
- sudo aptitude install mono-xsp2
El primer comando instala el entorno de desarrollo y el segundo instala un servidor ASP.NET independiente. Existen alternativas para servir las páginas directamente desde Apache pero en mi caso se presentaban problemas de dependencias por lo que se opto por la vía del servidor independiente escuchando en un puerto diferente al de Apache (esto ha sido solucionado en Ubuntu Intrepid 8.10).
Hecho esto basta con ejecutar xsp2 bajo el directorio sobre el que queramos la raíz de la aplicación Web para tener el servidor funcionando con la configuración básica.
Copiamos el código del servicio Web que se propone como ejemplo en el sitio de Mono ‘NumberService.asmx’ a la raíz del servidor y ya podemos empezar a consumir el servicio desde diversas aplicaciones, incluyendo Silverlight.
El ejemplo anterior es muy sencillo proporcionando un par de métodos para sumar y restar números, no obstante, proporciona la base para construir nuestros propios servicios web que accedan a bases de datos, escriban y lean ficheros, generen imagenes dinámicamente, etc, etc.
Para comprobar que funciona simplemente escribimos la dirección en el navegador en la forma ‘http://<host:port>/NumberService.asmx’ y podremos observar una página autogenerada donde podemos ver la auto-descripción del servicio así como probar su funcionalidad.

Enigma
Jeff Prosise ha publicado aquí un curioso simulador de Enigma, la famosa máquina utilizada por los alemanes para cifrar sus mensajes durante la segunda guerra mundial. Se puede ver funcionando en vivo aquí.
El programa funciona bajo Silverlight 2 y todo su código fuente está disponible para descargar.
Emulador SpecNix para Silverlight
He actualizado un viejo proyecto, el emulador de ZX Spectrum SpecNix, enfocado previamente en la reproducción de archivos rzx, para hacerlo jugable.
El menú principal muestra un listado de todos los programas de spectrum que hayamos previamente subido al almacen privado de la aplicación (Isolated Storage). En la parte inferior, los botones permiten ejecutar los siguientes comandos:
- Load: cargara y ejecutará la rom original del spectrum
- Upload: permite subir un archivo de juego 'z80' o un archivo de partida grabada 'rzx' al almacen privado de la aplicación (Isolated Storage) desde donde podrá posteriormente ser reproducido
- Run: reproduce el juego seleccionado.
- Delete: borra el juego seleccionado.

Podemos salir del programa que estemos reproduciendo al menú principal pulsando la tecla 'escape'.
Puede ejecutar el programa aquí:
http://www.laciudadela.net/content/specnix-emulador-de-zx-spectrum-para-silverlight-2
Puede descargar el código fuente aquí: