среда, 13 октября 2010 г.

Градиенты в PSTricks

Иногда для того, чтобы подчеркнуть некий переходный процесс или наличие размытой границы, на рисунках бывает полезным использовать градиенты (ну а кому-то интересны рюшечки). Поскольку большинство рисунков в своей работе я выполняю с использованием PSTricks, прямо не выходя из LaTeX (о рисовании примитивов уже было написано), то в данной заметке я опишу как создавать градиенты с помощью PSTricks.

Простые градиенты

Нам понадобится пакет pst-grad. Чтобы создать градиент, необходимо нарисовать требуемую физуру, а в качестве заливки в поле для дополнительных опций указать fillstyle=gradient. После этого нам окажутся доступны следующие параметры (из названий всё понятно):

  • gradbegin — начальный цвет.
  • gradend — конечный цвет.
  • gradlines — количество линий, используемых для рисования. градиента. Чем больше - тем ровнее, но страдает время отрисовки. По умолчанию 500.
  • gradangle — направление вектора градиента. На самом деле, перпендикуляра к вектору градиента (специально это так сделано, или нет - мне не понятно) .
  • gradmidpoint — обозначает положение средней точки градиента (от 0 до 1). Понять что это такое можно, взглянув на рисунок, который можно создать следующим кодом.
 
\documentclass[a4paper]{article} 
\usepackage[utf8]{inputenc} 
 
\usepackage[noxcolor]{pstricks} 
\usepackage{pst-grad} 
 
\begin{document} 
\begin{pspicture}(-2,-1)(2,10)
  % рисуем прямоуголник с градиентом
  \psframe[fillstyle=gradient, gradbegin=green, gradend=blue,
     gradlines=500, gradmidpoint=1, gradangle=10](-2,-1)(2,1)
  % вставляем подпись
  \uput[90](0,1){gradmidpoint=1}
 
  % повторяем то же, но со смещением относительно начальной точки
  \rput(0,3){
     \psframe[fillstyle=gradient, gradbegin=green, gradend=blue,
     gradlines=500, gradmidpoint=0, gradangle=10](-2,-1)(2,1)
     \uput[90](0,1){gradmidpoint=0}
  }
 
  \rput(0,6){
     \psframe[fillstyle=gradient, gradbegin=green, gradend=blue,
     gradlines=500, gradmidpoint=0.3, gradangle=10](-2,-1)(2,1)
     \uput[90](0,1){gradmidpoint=0.3}
  }
 
  \rput(0,9){
     \psframe[fillstyle=gradient, gradbegin=green, gradend=blue,
     gradlines=500, gradmidpoint=0.9, gradangle=10](-2,-1)(2,1)
     \uput[90](0,1){gradmidpoint=0.9, default}
  }
\end{pspicture} 

Цвета можно задавать исходя из стандартных имён, или в RGB формате. Для этого подключим пакет color и определим цвет посредством definecolor:

 
\usepackage{color} 
...
\begin{document} 
\begin{pspicture}(-2,-1)(2,11)
  \definecolor{mycolor}{rgb}{1,0.5,0.1}
  % а потом можем использовать цвет mycolor как захотим
\end{pspicture} 
\end{document} 

Радиальные градиенты

С помощью пакета pst-grad не удаётся создать радиальных градиентов. К примеру, если мы попытаемся использовать градиентную заливку в круге, то получим следующее:

 
\begin{pspicture}(-2,-2)(2,2)
  \definecolor{gradbegin}{rgb}{0.4,0.6,0.9}
  \definecolor{gradend}{rgb}{1,0.45,0.83}
  \pscircle[fillstyle=gradient,gradlines=1000,gradmidpoint=0](0,0){2}
\end{pspicture} 

То есть, обычный плоский градиент.

Для создания радиальных градиентов можно использовать пакет pst-slpe. В данном случае используется fillstyle=ccslope, а аргументы, задающие цвета, аналогичные: slopebegin, slopeend.

Особое внимание стоит уделить опции sloperadius. Из иллюстрации ниже должно быть понятно что к чему.

 
\begin{pspicture}(-2,-8)(8,4)
  \uput[90](0,3){red,yellow}
  \pscircle[fillstyle=ccslope,slopebegin=red, slopeend=yellow,
  sloperadius=1](0,0){2}
  \uput[90](0,2){sloperadius=1}
 
  \uput[90](5,3){yellow,blue}
  \rput(5,0){
     \pscircle[fillstyle=ccslope,slopebegin=yellow, slopeend=blue,
     sloperadius=1](0,0){2}
     \uput[90](0,2){sloperadius=1}
  }
 
  \rput(0,-5){
     \pscircle[fillstyle=ccslope,slopebegin=red, slopeend=yellow,
     sloperadius=2](0,0){2}
     \uput[90](0,2){sloperadius=2}
  }
 
  \rput(5,-5){
     \pscircle[fillstyle=ccslope,slopebegin=yellow, slopeend=blue,
     sloperadius=3](0,0){2}
     \uput[90](0,2){sloperadius=3}
  }
\end{pspicture} 

Стоит отметить, точку отсчёта градиента можно смещать.

 
\begin{pspicture}(-2,-2)(2,3)
  \pscircle[fillstyle=ccslope,slopebegin=yellow, slopeend=blue,
  slopecenter=0.1 0.3](0,0){2}
  \uput[90](0,2){slopecenter=0.1 0.3}
\end{pspicture} 

Более того, с помощью pst-slpe, можно создавать и такие вещи:

 
\begin{pspicture}(-2,-2)(2,2)
  \pscircle[fillstyle=radslope,slopebegin=yellow, slopeend=blue](0,0){2}
  \uput[90](0,2){fillstyle=radslope}
\end{pspicture} 

Напоследок могу посоветовать почитать документацию по пакетам pstricks (/usr/share/doc/texlive-pstricks-doc/generic/pstricks) и pst-slpe (/usr/share/doc/texlive-pstricks-doc/generic/pst-slpe).

Копируете статью - поставьте ссылку на оригинал!

2 комментария:

  1. Добрый день. Не замечал ваш блог на планете runix.org
    Не могли бы вы добавиться туда? Привык почитывать планету вместо отдельных блогов.

    --
    С уважением, фанат свободного ПО и GNU Emacs.

    ОтветитьУдалить
  2. Las Vegas casino near me - DrmCD
    Las Vegas casino near me · 5. Las 천안 출장마사지 Vegas 시흥 출장마사지 Casino. 1 Las 세종특별자치 출장샵 Vegas Blvd South, Las Vegas, 구리 출장안마 NV 89109. · (702) 770-1000 · Toll Free: 800-522-4700 인천광역 출장마사지 · Casino · Golf Courses: 11.

    ОтветитьУдалить