А как раскрасить в градиентные цвета: скажем от red!50 до blue!30 ?
Решил с Вашей подачи изучить вопросы градиентной закраски. Способов обнаружилось довольно много, от простого градиента по направлению или радиально от окружности к окружности (что мало интересно в силу примитивности), до закраски согласно произвольно заданной пользователем функции (что мало интересно как раз в силу произвольности). Но есть и специфические способы. Например,
метод тонирования Гуро. Простейший пример применения этого метода -- градиентная закраска треугольника с заданными цветами в углах (например,
red, green, blue):
Код:
pair O=(0,0);
transform r=rotate(360/3,O);
pair A0=(1,0),A1=r*A0,A2=r*A1;
path g=A0..A1..A2..cycle;
// Обратите внимание, что контур гладкий (почти окружность),
// но закрашивается только треугольник, образованный узлами
gouraudshade(g=g, p=new pen[] {red,green,blue}, edges=new int[] {0,0,0});
Ну, этот пример слишком тривиальный. Давайте теперь закрасим правильный шестиугольник:
Код:
// Делаем правильный шестиугольник, закрашенный по методу Гуро
pair O=(0,0);
transform r=rotate(360/6,O);
pair A0=(1,0),A1=r*A0,A2=r*A1,A3=r*A2,A4=r*A3,A5=r*A4;
path g=A0..A1..A2..A3..A4..A5..cycle;
gouraudshade(g=g, p=new pen[] {white,red,yellow,green,cyan,blue,magenta,red}, z=new pair[] {O,A0,A1,A2,A3,A4,A5,A0}, edges=new int[] {0,0,0,2,2,2,2,2});
Самое интересное в этом коде -- это массив
edges. Элемент этого массива определяет номер стороны текущего треугольника, к которой приделывается следующий треугольник.
Однако получилось не очень хорошо, потому что яркость смешанных цветов, таких как
yellow=red+green, вдвое больше яркости базовых цветов. Соответственно, яркость цвета
white -- втрое больше. Чтобы было больше похоже на гладкий "цветовой круг", нужно откорректировать яркость посредством такого изменения в коде:
Код:
gouraudshade(g=g, p=new pen[] {.33white,red,.5yellow,green,.5cyan,blue,.5magenta,red}, z=new pair[] {O,A0,A1,A2,A3,A4,A5,A0}, edges=new int[] {0,0,0,2,2,2,2,2});
Результат больше похож на то, что получилось в случае треугольника:
Однако здесь плохо то, что в центре -- не белый, а тёмно-серый цвет. Можно попробовать такой компромисс:
Код:
gouraudshade(g=g, p=new pen[] {white,red,.5yellow,green,.5cyan,blue,.5magenta,red}, z=new pair[] {O,A0,A1,A2,A3,A4,A5,A0}, edges=new int[] {0,0,0,2,2,2,2,2});
Вот результат:
Тоже не идеально, конечно. Очевидно, что применение этого метода ограничено теми областями, где нас устраивает линейная интерполяция цветов. С помощью пользовательских функций явно можно сделать лучше.
-- Пн июл 27, 2015 21:26:03 --А вот ещё простейший пример тензорной закраски (применяется к четырёхугольным патчам):
Код:
pair O=(0,0);
transform r=rotate(90,O);
pair A0=(1,0),A1=r*A0,A2=r*A1,A3=r*A2;
path p=A0..A1..A2..A3..cycle;
tensorshade(g=p,p=new pen[] {red,yellow,green,black});
Здесь, как видите, в отличие от метода Гуро, закрашивается вся область внутри контура.