C #, WPF - 1523
Tidak terlalu serius; ini terutama merupakan upaya apakah itu benar-benar berhasil.
Apa yang saya lakukan di sini adalah menggunakan ItemsControl (Menu, karena lebih pendek) di WPF untuk menampilkan partikel melalui pengikatan dan templating data. Templat data mengontrol bagaimana bentuk partikel (dalam hal ini lingkaran sederhana) dan pengikatan data mengontrol warna dan posisi partikel.
Setiap partikel memiliki posisi, warna dan arah yang dapat diperbarui oleh pengatur waktu. Awalnya sekelompok partikel dihasilkan di tengah jendela dengan arah acak (terdistribusi normal). Koleksi itu mendapat data-terikat ke ItemsControl yang kemudian menangani menampilkan partikel secara otomatis, setiap kali properti diperbarui. Partikel terseret sedikit karena gravitasi.
Memang agak panjang, harus diakui. Tapi setidaknya itu terlihat bagus:

Itu pasti bisa dibuat lebih pendek dengan menghilangkan:
- gravitasi, menyebabkan partikel mengembang secara seragam ke semua sisi;
- distribusi normal untuk vektor awal, menyebabkan partikel mengembang dalam kotak »yang jarang;
- variasi kecerahan, meninggalkan partikel hitam.
Saya memilih untuk tidak melakukannya demi kepentingan estetika. Solusi ini jauh lebih lama daripada hampir semua hal lainnya. Pendekatan data-binding dan templating mungkin elegan tetapi juga sangat bertele-tele dibandingkan dengan hanya memperbarui bitmap. (Catatan: Saya turun ke 1356 dengan membiarkan semua hal di atas keluar, tapi itu terlihat mengerikan kemudian.)
Kode didistribusikan dalam tiga file, yang diberikan di sini dalam bentuk yang diformat untuk keterbacaan:
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;
}