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