Звезды 3D
Теперь перейдем к анимации звезд летящих на нас. Для этого воспользуемся формулаим для перспективной проекции.
private void Form1_Paint(object? sender, PaintEventArgs e)
{
e.Graphics.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.AntiAlias;
e.Graphics.Clear(Color.Black);
for (int i = 0; i < N; i++)
{
float xw = (ClientSize.Width / 2.0f) + X[i] * zKoef / Z[i];
float yw = (ClientSize.Height / 2.0f) + Y[i] * zKoef / Z[i];
Z[i] -= zSpeed;
if (Z[i] <= 10)
Z[i] = 255;
e.Graphics.FillEllipse(Brushes.White, xw - 1, yw - 1, 2, 2);
}
}

Для создания эффекта луча, давайте расчитаем вторую точку у которой будет увеличен Z и нарисуем линияю между ними
private void Form1_Paint(object? sender, PaintEventArgs e)
{
e.Graphics.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.AntiAlias;
e.Graphics.Clear(Color.Black);
for (int i = 0; i < N; i++)
{
float xw = (ClientSize.Width / 2.0f) + X[i] * zKoef / Z[i];
float yw = (ClientSize.Height / 2.0f) + Y[i] * zKoef / Z[i];
const int rayLen = 5;
float xw2 = (ClientSize.Width / 2.0f) + X[i] * zKoef / (Z[i] + rayLen);
float yw2 = (ClientSize.Height / 2.0f) + Y[i] * zKoef / (Z[i] + rayLen);
Z[i] -= zSpeed;
if (Z[i] <= 10)
Z[i] = 255;
e.Graphics.DrawLine(Pens.White, xw, yw, xw2, yw2);
}
}
Запустив код получим следующий результат

Можете самостоятельно поэкспериментировать изменяя разные параметры анимации и увидеть разные эффекты от этого.