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

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

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

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

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

textual
Листинг программы
class MainForm : Form
{
    unsafe public MainForm()
    {
        base.Width = 300;
        base.DoubleBuffered = true;
        
        // создаём картинку с палитрой, у которой пиксел кодируется одним байтом
        var bmp = new Bitmap(256, 100, PixelFormat.Format8bppIndexed);
 
        // фиксируем в памяти картинку
        var data = bmp.LockBits(new Rectangle(Point.Empty, bmp.Size), ImageLockMode.ReadWrite, PixelFormat.Format8bppIndexed);
        var stride = data.Stride; // кол-во байт в одной строке картинки
        var scan0 = data.Scan0; // указатель на начало картинки в памяти
        var pixelSize = stride / data.Width; // размер пиксела в байтах
 
        for (int x = 0; x < 256; x++)
        {
            for (int y = 0; y < 100; y++)
            {
                byte* row = (byte*)scan0 + stride * y; // указатель на начало строки y
                row[x * pixelSize + 0] = (byte)x; // пишем значения от 0 до 255
            }
        }
        
        // разблокируем картинку
        bmp.UnlockBits(data);
        
        // какие-то странные цвета в палитре, заменил на соседние. 
        // можете убрать эти строки и посмотреть, что будет
        var p = bmp.Palette;
        for (int i = 0; i < 48; i++)
            p.Entries[i] = p.Entries[i - 48 + 256];
        bmp.Palette = p;
 
        // создаём таймер, который часто тикает
        new System.Windows.Forms.Timer { Interval = 1, Enabled = true }.Tick += (_, __) =>
        {
            // берем копию палитры
            var pallete = bmp.Palette;
            
            // берем циклическое смещение цветов в палитре
            var newEntries = Enumerable.Range(1, pallete.Entries.Length)
                .Select((e, i) => pallete.Entries[(i + 1) % pallete.Entries.Length])
                .ToArray();
            
            // изменяем цвета палитры, на смещённые
            for (int i = 0; i < newEntries.Length; i++)
                pallete.Entries[i] = newEntries[i]; 
            
            // присваиваем картинке изменённую палитру и инициируем перерисовку формы
            bmp.Palette = pallete;          
            Invalidate();
        };
        
        Paint += (_, e) =>
        {
            // рисуем картинку
            e.Graphics.DrawImage(bmp, PointF.Empty);
        };
    }
}

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


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

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

13   голосов , оценка 4 из 5
Похожие ответы