|
Едут в поезде 2 программера и 2 юзера, в
разных купе. У программеров 1 билет на двоих, у юзеров по
билету на каждого. Когда проходит контроль, программеры бегут
в сортир, там запираются. Когда контролер стучит в дверь, они
ему через окошко билет просовывают. Алгоритм ясен. Едут
обратно тем же составом. У юзеров 1 билет, у программеров ни
одного. Когда проходит контроль, юзеры бегут в сортир, там
запираются. Программисты стучатся в дверь, оттуда высовывается
билет, после чего программисты дружной толпою бегут в другой
сортир. Дальше схема ясна. Мораль такова: не каждый алгритм,
написанный программером, будет првильно применен юзером.
|
Иногда бывает нужно сложить два или более цветов для получения
что-то типа переходного цвета. Делается это весьма просто.
Координаты получаемого цвета будут равны среднему значению
соответствующих координат всех цветов.
Например, нужно сложить красный и синий. Получаем
(255,0,0)+(0,0,255)=((255+0) div 2,(0+0) div 2,(0+255) div 2)=(127,0,127).
|
В результате получаем сиреневый цвет. Также надо поступать, если
цветов более чем 2: сложить соответствующие координаты, потом каждую
сумму разделить нацело на количество цветов.
Поговорим теперь о градиентной заливке. Градиентная заливка - это
заливка цветом с плавным переходом от одного цвета к другому.
Итак, пусть заданы 2 цвета своими координатами ((A1, A2, A3) и
(B1, B2, B3)) и линия (длиной h пикселов), по которой нужно залить.
Тогда каждый цвет каждого пиксела, находящегося на расстоянии x
пикселов от начала будет равен (A1-(A1-B1)/h*x, A2-(A2-B2)/h*x,
A3-(A3-B3)/h*x). Теперь, имея линию с градиентной заливкой, можно
таким образом залить совершенно любую фигуру: будь то прямоугольник,
круг или просто произвольная фигура.
Вот как выглядит описанный алгоритм:
{Считается, что координаты первого цвета
равны (A1, A2, A3), а второго (B1, B2, B3)
Кроме того, линия начинается в координатах
(X1,Y1), а заканчивается в (X2,Y1)}
var
h, i: integer;
begin
h:=X2-X1-1;
for i:=0 to h do
with PaintBox1.Canvas do
begin
Pen.Color:=RGB(A1-(A1-B1)/h*i, A2-(A2-B2)/h*i, A3-(A3-B3)/h*i);
Rectangle(I,Y1,I+1,Y1);
end;
end.
|
|