C #, WPF - 1523
Pas terriblement sérieux; c'était principalement une tentative pour savoir si cela fonctionnait réellement.
Ce que je fais ici, c'est d'utiliser un ItemsControl (Menu, car il est plus court) dans WPF pour afficher les particules via la liaison de données et les modèles. Un modèle de données contrôle l'apparence des particules (dans ce cas, un simple cercle) et la liaison de données contrôle la couleur et la position des particules.
Chaque particule a une position, une couleur et une direction qui sont mises à jour par une minuterie. Initialement, un tas de particules sont générées au centre de la fenêtre avec des directions aléatoires (réparties normalement). Cette collection est liée aux données à ItemsControl qui gère ensuite l'affichage automatique des particules, chaque fois que les propriétés sont mises à jour. Les particules sont un peu entraînées par la gravité.
Certes, cela a pris un peu de temps. Mais au moins ça a l'air sympa:

Il peut sûrement être raccourci en omettant:
- gravité, provoquant une expansion uniforme des particules de tous les côtés;
- la distribution normale des vecteurs initiaux, provoquant l'expansion des particules dans une «boîte» clairsemée;
- la variation de luminosité, laissant les particules noires.
J'ai choisi de ne pas le faire dans un souci d'esthétique. Cette solution est bien plus longue que presque tout le reste. L'approche de liaison de données et de modèles peut être élégante, mais elle est également assez détaillée par rapport à la simple mise à jour d'une image bitmap. (Remarque: je l'ai compris 1356 en omettant tout ce qui précède, mais ça a l'air horrible alors.)
Le code est distribué dans trois fichiers, qui sont donnés ici sous forme formatée pour plus de lisibilité:
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;
}