Звезды 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);

     }            
 }

Запустив код получим следующий результат 

 

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