C #, WPF - 1523
Non terribilmente serio; questo era principalmente un tentativo se funzionasse davvero.
Quello che sto facendo qui è usare un ItemsControl (Menu, poiché è più breve) in WPF per visualizzare le particelle tramite associazione e templatura dei dati. Un modello di dati controlla l'aspetto delle particelle (in questo caso un semplice cerchio) e l'associazione dei dati controlla il colore e la posizione delle particelle.
Ogni particella ha una posizione, un colore e una direzione che vengono aggiornati da un timer. Inizialmente un gruppo di particelle viene generato al centro della finestra con direzioni casuali (distribuite normalmente). Quella raccolta viene vincolata ai dati di ItemsControl che gestisce quindi la visualizzazione automatica delle particelle, ogni volta che le proprietà vengono aggiornate. Le particelle vengono trascinate leggermente verso il basso a causa della gravità.
È diventato un po 'lungo, è vero. Ma almeno sembra carino:

Può sicuramente essere abbreviato omettendo:
- gravità, causando l'espansione uniforme delle particelle su tutti i lati;
- la normale distribuzione per i vettori iniziali, causando l'espansione delle particelle in una "scatola" sparsa;
- la variazione di luminosità, lasciando particelle nere.
Ho scelto di non farlo nell'interesse dell'estetica. Questa soluzione è molto più lunga di quasi qualsiasi altra cosa, indipendentemente. L'approccio basato su dati e templating potrebbe essere elegante ma è anche piuttosto dettagliato rispetto al semplice aggiornamento di una bitmap. (Nota: l'ho ottenuto fino al 1356 lasciando fuori tutto quanto sopra, ma sembra orribile allora.)
Il codice è distribuito in tre file, che vengono forniti qui in formato formattato per motivi di leggibilità:
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;
}