C #, WPF - 1523
No terriblemente serio; esto fue principalmente un intento de si realmente funcionó.
Lo que estoy haciendo aquí es usar un ItemsControl (Menú, ya que es más corto) en WPF para mostrar partículas a través de la vinculación de datos y la plantilla. Una plantilla de datos controla el aspecto de las partículas (en este caso, un círculo simple) y el enlace de datos controla el color y la posición de las partículas.
Cada partícula tiene una posición, un color y una dirección que se actualizan mediante un temporizador. Inicialmente, se generan un montón de partículas en el centro de la ventana con direcciones aleatorias (distribuidas normalmente). Esa colección se enlaza con los datos al ItemsControl que luego maneja la visualización de las partículas automáticamente, cada vez que se actualizan las propiedades. Las partículas se arrastran un poco hacia abajo debido a la gravedad.
Se hizo un poco largo, lo admito. Pero al menos se ve bien:

Seguramente se puede acortar omitiendo:
- gravedad, haciendo que las partículas se expandan uniformemente a todos los lados;
- la distribución normal de los vectores iniciales, haciendo que las partículas se expandan en una escasa »caja«;
- La variación del brillo, dejando partículas negras.
Opté por no hacerlo en interés de la estética. Sin embargo, esta solución es mucho más larga que casi cualquier otra cosa. El enfoque de vinculación de datos y plantillas puede ser elegante, pero también es bastante detallado en comparación con la simple actualización de un mapa de bits. (Nota: lo bajé a 1356 dejando todo lo anterior, pero se ve horrible entonces).
El código se distribuye en tres archivos, que se dan aquí en forma formateada para su legibilidad:
App.xaml
<Application xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" StartupUri="W.xaml"/>
W.xaml
<Window x:Class="W" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
<Menu Name="i">
<Menu.ItemTemplate>
<DataTemplate>
<Ellipse Width="2" Height="2" Fill="#000" Opacity="{Binding O}">
<Ellipse.RenderTransform>
<TranslateTransform X="{Binding X}" Y="{Binding Y}"/>
</Ellipse.RenderTransform>
</Ellipse>
</DataTemplate>
</Menu.ItemTemplate>
<Menu.Template>
<ControlTemplate>
<ItemsPresenter/>
</ControlTemplate>
</Menu.Template>
<Menu.ItemsPanel>
<ItemsPanelTemplate>
<Canvas/>
</ItemsPanelTemplate>
</Menu.ItemsPanel>
</Menu>
</Window>
W.xaml.cs
using M = System.Math;
using T = System.Timers.Timer;
using System;
using System.ComponentModel;
partial class W
{
int a;
T t = new T(99);
public W()
{
InitializeComponent();
Height = Width = 500;
var r = new Random();
Func<double> n = () => 2 * (M.Sqrt(-2 * M.Log(r.NextDouble())) * M.Sin(6 * r.NextDouble()));
var l = new System.Collections.Generic.List<P>();
for (; a++ < 300; )
l.Add(new P { X = 250, Y = 250, f = n(), g = n() });
i.ItemsSource = l;
t.Elapsed += delegate
{
foreach (P x in l)
{
x.X += x.f;
x.Y += x.g += .2;
x.O = M.Max(1 - M.Sqrt(M.Pow(250 - x.X, 2) + M.Pow(250 - x.Y, 2)) / 250, 0);
}
};
t.Start();
}
}
class P : System.Windows.ContentElement, INotifyPropertyChanged
{
public double y, f, g;
public double X { get; set; }
public double O { get; set; }
public double Y
{
get { return y; }
set
{
y = value;
if (PropertyChanged != null)
PropertyChanged(this, new PropertyChangedEventArgs(""));
}
}
public event PropertyChangedEventHandler PropertyChanged;
}