Интересно ...
(видео ответа здесь: http://youtu.be/estq62yz7v0)
Я бы сделал это так:
Во-первых, отбросьте все рисование RECTANGLE и нарисуйте свой эффект построчно. Вот так:
for (int y=start;y<end;y++)
{
color = DetermineColorFor(y-start);
DrawLine(left, y, right, y, color);
}
Это, конечно, псевдокод, который не стоит беспокоить GDI + или чем-то еще.
Здесь все понятно, кроме того, как кодировать DetermineColorFor()
метод. Этот метод должен будет вернуть цвет линии на заданной ПРОЕКТНОЙ высоте.

Теперь на картинке у вас есть:
- Ваша точка зрения (X) - не знал, как нарисовать глаз
- красная линия (это ваш экран - проекционная плоскость)
- ваш фон (чередующиеся полосы внизу)
- и несколько проектирующих линий, которые должны помочь вам разработать
DetermineColorFor()
метод
Подсказка - используйте сходство треугольников для перехода от экранных координат к координатам «бара».
Следующий совет - когда вы находитесь в «барных» координатах, используйте оператор по модулю для определения цвета.
Я добавлю больше подсказок, если это необходимо, но было бы здорово, если бы вы решили это самостоятельно.
Меня как-то вдохновил вопрос, и я создал код для решения. Вот оно:
int _offset = 0;
double period = 20.0;
private void timer1_Tick(object sender, EventArgs e)
{
for (int y = Height / 3; y < Height; y++)
{
using (Graphics g = CreateGraphics())
{
Pen p = new Pen(GetColorFor(y - Height / 3));
g.DrawLine(p, 0, y, Width, y);
p.Dispose();
}
}
_offset++;
}
private Color GetColorFor(int y)
{
double d = 10.0;
double h = 20.0;
double z = 0.0;
if (y != 0)
{
z = d * h / (double)y + _offset;
}
double l = 128 + 127 * Math.Sin(z * 2.0 * Math.PI / period);
return Color.FromArgb((int)l, (int)l, (int)l);
}
Эксперимент с:
d
- расстояние от глаза до проекционного экрана
h
- высота глаза от 'бара'
period
- ширина полосы на полосе
У меня был таймер в форме и событие правильно подключено. Продолжительность таймера составила 20 мс.