C #, WPF - 1523
Niezbyt poważnie; była to głównie próba tego, czy rzeczywiście zadziałało.
To, co robię tutaj, to używanie ItemsControl (menu, ponieważ jest krótszy) w WPF do wyświetlania cząstek poprzez wiązanie danych i tworzenie szablonów. Szablon danych kontroluje wygląd cząstek (w tym przypadku proste kółko), a wiązanie danych steruje kolorem i położeniem cząstek.
Każda cząstka ma pozycję, kolor i kierunek, które są aktualizowane przez timer. Początkowo w środku okna generowana jest wiązka cząstek o losowych kierunkach (o rozkładzie normalnym). Ta kolekcja jest powiązana z danymi w ItemsControl, który następnie automatycznie wyświetla cząstki za każdym razem, gdy właściwości są aktualizowane. Cząstki są nieco przeciągane w dół z powodu grawitacji.
Trzeba przyznać, że trochę się wydłużyło. Ale przynajmniej ładnie wygląda:

Można go z pewnością skrócić, pomijając:
- grawitacja, powodująca równomierne rozszerzanie się cząstek na wszystkie strony;
- rozkład normalny dla wektorów początkowych, powodujący ekspansję cząstek w rzadkim »pudełku«;
- zmiana jasności, pozostawiając czarne cząstki.
Zdecydowałem się tego nie robić w interesie estetyki. To rozwiązanie jest znacznie dłuższe niż prawie wszystko inne. Wiązanie danych i tworzenie szablonów może być eleganckie, ale jest również dość szczegółowe w porównaniu z prostą aktualizacją mapy bitowej. (Uwaga: obniżyłem to wszystko do 1356 roku , ale wtedy wygląda to okropnie.)
Kod jest rozpowszechniany w trzech plikach, które są tutaj sformatowane w celu zapewnienia czytelności:
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;
}