C #, WPF - 1523
Nicht sehr ernst; Dies war hauptsächlich ein Versuch, ob es tatsächlich funktionierte.
Ich verwende hier ein ItemsControl (Menü, da es kürzer ist) in WPF, um Partikel über Datenbindung und Vorlagen anzuzeigen. Eine Datenvorlage steuert, wie die Partikel aussehen (in diesem Fall ein einfacher Kreis), und die Datenbindung steuert Farbe und Position der Partikel.
Jedes Partikel hat eine Position, eine Farbe und eine Richtung, die von einem Timer aktualisiert werden. Zunächst wird in der Mitte des Fensters ein Partikelbündel mit (normalverteilten) Zufallsrichtungen erzeugt. Diese Auflistung wird datengebunden an ItemsControl, das die Partikel dann automatisch anzeigt, wenn die Eigenschaften aktualisiert werden. Partikel werden aufgrund der Schwerkraft etwas nach unten gezogen.
Zugegeben, es wurde etwas langwierig. Aber zumindest sieht es gut aus:

Es kann sicherlich kürzer gemacht werden, indem weggelassen wird:
- Schwerkraft, wodurch sich Partikel gleichmäßig nach allen Seiten ausdehnen;
- die Normalverteilung für die Anfangsvektoren, wodurch sich die Partikel in einer spärlichen »Kiste« ausdehnen;
- die Helligkeitsschwankung, die Partikel bleiben schwarz.
Ich habe mich aus ästhetischen Gründen dagegen entschieden. Diese Lösung ist ungeachtet dessen viel länger als fast alles andere. Der Ansatz für die Datenbindung und das Templating ist zwar elegant, aber im Vergleich zum einfachen Aktualisieren einer Bitmap auch ziemlich ausführlich. (Anmerkung: Ich habe es auf 1356 gebracht, indem ich alle oben genannten Punkte weggelassen habe, aber es sieht dann schrecklich aus.)
Der Code wird in drei Dateien verteilt, die hier aus Gründen der Lesbarkeit in formatierter Form angegeben sind:
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;
}