Анимация. Эффект волнообразного движения линий - 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);
- };
- }
- }
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д