C #, WPF - 1523
Không quá nghiêm trọng; đây chủ yếu là một nỗ lực cho dù nó thực sự hoạt động.
Những gì tôi đang làm ở đây là sử dụng ItemControl (Menu, vì nó ngắn hơn) trong WPF để hiển thị các hạt thông qua liên kết dữ liệu và tạo khuôn mẫu. Mẫu dữ liệu kiểm soát các hạt trông như thế nào (trong trường hợp này là một vòng tròn đơn giản) và liên kết dữ liệu kiểm soát màu sắc và vị trí của các hạt.
Mỗi hạt có một vị trí, màu sắc và hướng được cập nhật bởi bộ đếm thời gian. Ban đầu, một loạt các hạt được tạo ra ở trung tâm của cửa sổ với các hướng ngẫu nhiên (phân phối bình thường). Bộ sưu tập đó được liên kết dữ liệu với ItemControl, sau đó xử lý hiển thị các hạt tự động, bất cứ khi nào các thuộc tính được cập nhật. Các hạt được kéo xuống một chút do trọng lực.
Nó có một chút dài, thừa nhận. Nhưng ít nhất nó trông cũng đẹp:

Nó chắc chắn có thể được thực hiện ngắn hơn bằng cách bỏ qua:
- trọng lực, làm cho các hạt mở rộng đồng đều ra mọi phía;
- phân phối bình thường cho các vectơ ban đầu, làm cho các hạt mở rộng trong một hộp »thưa thớt«;
- sự thay đổi độ sáng, để lại các hạt màu đen.
Tôi đã chọn không làm như vậy vì lợi ích của thẩm mỹ. Giải pháp này dài hơn hầu hết mọi thứ khác. Cách tiếp cận liên kết dữ liệu và tạo khuôn mẫu có thể rất thanh lịch nhưng nó cũng khá dài dòng so với việc chỉ cập nhật một bitmap. (Lưu ý: Tôi đã giảm xuống còn 1356 bằng cách bỏ tất cả những điều trên, nhưng sau đó nó trông thật kinh khủng.)
Mã được phân phối trong ba tệp, được đưa ra ở đây dưới dạng được định dạng cho mức độ dễ đọc:
Ứng dụng.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;
}