C #, WPF - 1523
Не страшенно серйозно; це була головним чином спроба, чи справді це спрацювало.
Що я тут роблю, - це використовувати ItemControl (меню, оскільки він коротший) у WPF для відображення частинок за допомогою прив'язки даних та шаблонів. Шаблон даних керує тим, як виглядають частинки (в даному випадку просте коло), а зв'язування даних контролює колір і положення частинок.
Кожна частинка має положення, колір та напрямок, які оновлюються таймером. Спочатку купа частинок утворюється в центрі вікна з (нормально розподіленими) випадковими напрямками. Ця колекція прив'язується до даних ItemControl, яка потім обробляє відображення частинок автоматично, щоразу, коли властивості оновлюються. Частинки трохи тягнуться вниз через гравітацію.
Це, правда, стало трохи довше. Але принаймні це виглядає приємно:

Це, безумовно, можна скоротити, опустивши:
- сила тяжіння, внаслідок чого частинки рівномірно розширюються на всі сторони;
- нормальний розподіл для початкових векторів, внаслідок чого частинки розширюються в розрідженому «ящику»;
- зміна яскравості, залишаючи частинки чорними.
Я вирішив не робити цього в інтересах естетики. Це рішення довше, ніж майже все інше, незалежно. Підхід для зв'язування даних та шаблонів може бути елегантним, але він також є досить багатослівним у порівнянні з простим оновленням растрової карти. (Примітка. Я отримав це до 1356 року, залишивши все вищезазначене, але це виглядає жахливо.)
Код розподіляється у трьох файлах, які тут надаються у форматованому вигляді для розбірливості:
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;
}