C #, WPF - 1523
Çok ciddi değil; bu aslında işe yarayıp yaramadığı bir girişimdi.
Burada yaptığım veri bağlama ve şablonlama ile parçacıkları görüntülemek için WPF bir ItemsControl (daha kısa olduğu için Menü) kullanmaktır. Bir veri şablonu parçacıkların nasıl göründüğünü (bu durumda basit bir daire) kontrol eder ve veri bağlama parçacıkların rengini ve konumunu kontrol eder.
Her parçacığın bir zamanlayıcı tarafından güncellenen bir konumu, rengi ve yönü vardır. Başlangıçta, pencerenin merkezinde (normal dağılmış) rastgele yönlerle bir grup parçacık üretilir. Bu koleksiyon, daha sonra özellikler her güncellendiğinde parçacıkların otomatik olarak görüntülenmesini sağlayan ItemsControl'e veri ile bağlanır. Parçacıklar yerçekimi nedeniyle biraz aşağı sürüklenir.
Kuşkusuz biraz uzadı. Ama en azından güzel görünüyor:

Kesinlikle atlayarak daha kısa yapılabilir:
- yerçekimi, parçacıkların tüm taraflara eşit olarak genişlemesine neden olur;
- başlangıç vektörleri için normal dağılım, parçacıkların seyrek bir »kutu« içinde genişlemesine neden olur;
- Parçacıkları siyah bırakarak parlaklık değişimi.
Estetik çıkarına bunu yapmamayı seçtim. Bu çözüm ne olursa olsun hemen hemen her şeyden çok daha uzundur. Veri bağlama ve şablonlama yaklaşımı zarif olabilir, ancak bir bitmap'in güncellenmesi ile karşılaştırıldığında oldukça ayrıntılıdır. (Not: Yukarıdakilerin hepsini dışarıda bırakarak 1356'ya indirdim , ama o zaman korkunç görünüyor.)
Kod, okunaklılık için burada biçimlendirilmiş biçimde verilen üç dosyaya dağıtılır:
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;
}