Анимация. Эффект волнообразного движения линий - 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);
};
}
}