Анимация. Эффект волнообразного движения линий - C#

Узнай цену своей работы

Формулировка задачи:

Помогите, пожалуйста, построить семейство разноцветных линий на форме так, чтобы был устроен цикл, при котором каждая последующая линия перекрашивается в цвет предыдущей путем изменения палитры. Т.е возникал бы эффект волнообразного движения линий.
Листинг программы
  1. private void Form1_Paint(object sender, PaintEventArgs e)
  2. {
  3. Graphics gr = e.Graphics;
  4. Pen p = new Pen(Color.Red,3);
  5. for (int i = 0; i < 200; i++)
  6. {
  7. gr.DrawLine(p, i+0, 0, i+0, 250);
  8. }
а вот цикл перекрашивания совсем не получается

Решение задачи: «Анимация. Эффект волнообразного движения линий»

textual
Листинг программы
  1. class MainForm : Form
  2. {
  3.     unsafe public MainForm()
  4.     {
  5.         base.Width = 300;
  6.         base.DoubleBuffered = true;
  7.        
  8.         // создаём картинку с палитрой, у которой пиксел кодируется одним байтом
  9.         var bmp = new Bitmap(256, 100, PixelFormat.Format8bppIndexed);
  10.  
  11.         // фиксируем в памяти картинку
  12.         var data = bmp.LockBits(new Rectangle(Point.Empty, bmp.Size), ImageLockMode.ReadWrite, PixelFormat.Format8bppIndexed);
  13.         var stride = data.Stride; // кол-во байт в одной строке картинки
  14.         var scan0 = data.Scan0; // указатель на начало картинки в памяти
  15.         var pixelSize = stride / data.Width; // размер пиксела в байтах
  16.  
  17.         for (int x = 0; x < 256; x++)
  18.         {
  19.             for (int y = 0; y < 100; y++)
  20.             {
  21.                 byte* row = (byte*)scan0 + stride * y; // указатель на начало строки y
  22.                 row[x * pixelSize + 0] = (byte)x; // пишем значения от 0 до 255
  23.             }
  24.         }
  25.        
  26.         // разблокируем картинку
  27.         bmp.UnlockBits(data);
  28.        
  29.         // какие-то странные цвета в палитре, заменил на соседние.
  30.         // можете убрать эти строки и посмотреть, что будет
  31.         var p = bmp.Palette;
  32.         for (int i = 0; i < 48; i++)
  33.             p.Entries[i] = p.Entries[i - 48 + 256];
  34.         bmp.Palette = p;
  35.  
  36.         // создаём таймер, который часто тикает
  37.         new System.Windows.Forms.Timer { Interval = 1, Enabled = true }.Tick += (_, __) =>
  38.         {
  39.             // берем копию палитры
  40.             var pallete = bmp.Palette;
  41.            
  42.             // берем циклическое смещение цветов в палитре
  43.             var newEntries = Enumerable.Range(1, pallete.Entries.Length)
  44.                 .Select((e, i) => pallete.Entries[(i + 1) % pallete.Entries.Length])
  45.                 .ToArray();
  46.            
  47.             // изменяем цвета палитры, на смещённые
  48.             for (int i = 0; i < newEntries.Length; i++)
  49.                 pallete.Entries[i] = newEntries[i];
  50.            
  51.             // присваиваем картинке изменённую палитру и инициируем перерисовку формы
  52.             bmp.Palette = pallete;          
  53.             Invalidate();
  54.         };
  55.        
  56.         Paint += (_, e) =>
  57.         {
  58.             // рисуем картинку
  59.             e.Graphics.DrawImage(bmp, PointF.Empty);
  60.         };
  61.     }
  62. }

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

13   голосов , оценка 4 из 5

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут
Похожие ответы