C #, WPF - 1523
ไม่ร้ายแรงมาก นี่เป็นความพยายามส่วนใหญ่ไม่ว่าจะใช้งานได้จริงหรือไม่
สิ่งที่ฉันทำที่นี่คือการใช้ ItemsControl (เมนูเนื่องจากสั้นกว่า) ใน WPF เพื่อแสดงอนุภาคผ่านการเชื่อมโยงข้อมูลและการสร้างเทมเพลต เทมเพลตข้อมูลควบคุมลักษณะที่ปรากฏของอนุภาค (ในกรณีนี้คือวงกลมที่เรียบง่าย) และการเชื่อมข้อมูลจะควบคุมสีและตำแหน่งของอนุภาค
แต่ละอนุภาคมีตำแหน่งสีและทิศทางที่ได้รับการอัปเดตโดยตัวจับเวลา เริ่มแรกมีการสร้างอนุภาคจำนวนมากที่กึ่งกลางของหน้าต่างโดยมีทิศทางแบบสุ่ม (กระจายแบบปกติ) การรวบรวมนั้นจะเชื่อมโยงข้อมูลกับ ItemsControl ซึ่งจะจัดการแสดงอนุภาคโดยอัตโนมัติทุกครั้งที่มีการอัพเดตคุณสมบัติ อนุภาคถูกลากลงมาเล็กน้อยเนื่องจากแรงโน้มถ่วง
มันมีความยาวเล็กน้อยเป็นที่ยอมรับ แต่อย่างน้อยมันก็ดูดี:

มันสามารถทำให้สั้นลงได้โดยไม่ต้อง:
- แรงโน้มถ่วงทำให้อนุภาคขยายตัวทุกด้านอย่างสม่ำเสมอ
- การแจกแจงแบบปกติสำหรับเวกเตอร์เริ่มต้นทำให้อนุภาคขยายตัวในช่องว่าง»กล่อง«;
- การแปรผันของความสว่างทำให้อนุภาคเป็นสีดำ
ฉันเลือกที่จะไม่ทำเช่นนั้นเพื่อผลประโยชน์ของสุนทรียภาพ วิธีนี้มีความยาวมากกว่าเกือบทุกอย่างโดยไม่คำนึงถึง วิธีการผูกข้อมูลและการสร้างเทมเพลตอาจดูดี แต่ก็ค่อนข้างละเอียดเมื่อเปรียบเทียบกับการอัพเดตบิตแมป (หมายเหตุ: ฉันได้รับมันถึง 1, 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;
}