Опубликован: 27.12.2010 | Уровень: специалист | Доступ: платный
Лекция 2:

Графика: основные принципы

Более подробное описание основных примитивов (по алфавиту)

1. Задавая стрелку \text{\tt Arrow}, можно кроме концов указывать отступы от них (второй аргумент), которые могут быть как одинаковыми, так и разными (окружности нарисованы для наглядности):

\tt
In[8]:=\{Graphics[\{Arrow[\{\{0, 0\}, \{2, 1\}\}], Circle[\{0,0\}, 0.3], \\
\phantom{In[8]:=\{Gr}Circle[\{2,1\}, 0.3], Point[\{\{0,0\}, \{2,1\}\}]\}], \\
\phantom{In[8]:=\{}Graphics[\{Arrow[\{\{0,0\},\{2,1\}\}, .3], Circle[\{0,0\}, 0.3], \\
\phantom{In[8]:=\{Gr}Circle[\{2,1\}, 0.3], Point[\{\{0,0\}, \{2,1\}\}]\}], \\
\phantom{In[8]:=\{}Graphics[\{Arrow[\{\{0,0\}, \{2,1\}\}, \{.3, .1\}], \\
\phantom{In[8]:=\{Gr}Circle[\{0,0\}, 0.3], Circle[\{2,1\}, .3], \\
\phantom{In[8]:=\{Gr}Point[\{\{0,0\}, \{2,1\}\}]\}]\}

Можно также управлять размером и расположением стрелочек, используя директиву \text{\tt Arrowheads}. Элементы списка задают направление (знак) и относительный размер стрелки (число). Абсолютный размер можно задавать командами \text{\tt Tiny, Small, Medium, Large}:

\tt
In[9]:= \\ \\
\phantom{In}\{Graphics[\{Arrowheads[\{-.1, .1}], Arrow[\{\{0,0\}, \{2,1\}\}], \\
\phantom{In[9]:}Circle[\{0,0\}, 0.3], Circle[\{2,1\}, 0.3], \\
\phantom{In[9]:}Point[\{\{0,0\}, \{2,1\}\}]\}], \\
\phantom{In[}Graphics[\{Arrowheads[\{-.1, .2\}], Arrow[\{\{0,0\}, \{2,1\}\}, .3], \\
\phantom{In[9]:}Circle[\{0,0\}, 0.3], Circle[\{2,1\}, 0.3], \\
\phantom{In[9]:}Point[\{\{0,0\}, \{2,1\}\}]\}], \\
\phantom{In[}Graphics[\{Arrowheads[\{-0.1, -.05, .05, .1\}], \\
\phantom{In[9]:}Arrow[\{\{0,0\}, \{2,1\}\}, \{.3, .1\}], Circle[\{0,0\},\0.3], \\
\phantom{In[9]:}Circle[\{2,1\}, .3], Point[\{\{0,0\}, \{2,1\}\}]\}]\}

Элемент списка директивы \text{\tt Arrowheads} сам может быть списком, второй элемент которого отвечает за относительное положение стрелки (число от нуля до единицы), а третий - за форму (\text{\tt Graphics} ):

\tt
In[10]:= \\ \\
\phantom{In}\{Graphics[\{Arrowheads[\{\{-.1, 0\}, \{-.2, 2\}, .1\}], \\
\phantom{In[10]}Arrow[\{\{0,0\}, \{2,1\}\}], Circle[\{0,0\}, 0.3], \\
\phantom{In[10]}Circle[\{2,1\}, 0.3], Point[\{\{0,0\}, \{2,1\}\}]\}], \\
\phantom{In}Graphics[ \\
\phantom{In[10}\{Arrowheads[\{\{-.1, 0\}, \{-.05, .2, Graphics [\{Red, Circle[]\}]\}, \\
\phantom{In[10]:r}.1\}], Arrow[\{\{0,0\}, \{2,1\}\}, .3], Circle[\{0,0\}, 0.3], \\
\phantom{In[10]}Circle[\{2,1\}, 0.3], Point[\{\{0,0\}, \{2,1\}\}]\}]\}

2. Примитив \text{\tt Circle} может быть использован также для рисования дуг (третий аргумент задает начало и конец дуги в радианах) и эллипсов (второй аргумент в этом случае не радиус, а список длин полуосей). Примитив \text{\tt Cycle[]} без аргументов дает единичную окружность с центром в начале координат:

\tt
In[11]:=\{Graphics[Circle[\{0, 0\}, 1, \{$\pi$/3, 4$\pi$/3\}]], \\
\phantom{In[11]:=\{}Graphics[Circle[\{0, 0\}, \{2, 3\}]]\}

В качестве примера рассмотрим процедуру, изображающую отрезок прямой в геометрии Лобачевского в круге Пуанкаре:

\tt
In[12]:= \\ \\
\phantom{In}Inv[a\_] :=a/a.a; (* Инверсия *) \\
\phantom{InMe}Mediatr[a\_, b\_] := \\
\phantom{InMe}Module[\{m, n\},  (* Серединный перпендикуляр к отрезку *) \\
\phantom{InMeM}m=$\frac{a+b}{2}$; n = \{b[\!\![1]\!\!] - a[\!\![l]\!\!] , b[\!\![2]\!\!] - a[\!\![2]\!\!]\}; \\
\phantom{InMeM}(х-m[\!\![l]\!\!]) n[\!\![l]\!\!] + (y-m[\!\![2]\!\!]) n[\!\![2]\!\!] == 0 \\
\phantom{InMe}]; \\
\phantom{In}ATan[x\_, y\_] := If [x == 0, If [y>0, -$\frac{\pi}{2}$, $\frac{\pi}{2}$], ArcTan[$\frac{y}{x}$]]; \\
\phantom{In}(* Удобный арктангенс*)
\tt
\phantom{In}LSeg[a\_, b\_] := Module [\{dt, ia, o, r, eql, eq2, res, d, $\alpha$, ax, $\varphi$\},\\
\phantom{InLSe}dt = a[\!\![l]\!\!] b[\!\![2]\!\!] - a[\!\![2]\!\!]b[\!\![l]\!\!];\\
\phantom{InLSe}If[Abs[dt] < $10^{-10}$, Line [\{a, b\}],\\
\phantom{InLSeI}ia = Inv[a];\\
\phantom{InLSeI}eql = Mediatr[a, b];\\
\phantom{InLSeI}eq2 = Mediatr[b, ia];\\
\phantom{InLSeI}res = Solve [\{eql, eq2\}, \{x, y\}] // Flatten;\\
\phantom{InLSeI}о = \{x, y\} /. res;\\
\phantom{InLSeI}r = $\sqrt{(o-a).(o-a)}$;\\
\phantom{InLSeI}d = $\sqrt{(b-a).(b-a)}$;\\
\phantom{InLSeI}$\alpha$ = ArcSin $\left[\frac{d}{2r}\right]$;\\
\phantom{InLSeI}ах = о - $\frac{a+b}{2}$;\\
\phantom{InLSeI}If[ax[\!\![1]\!\!] $\le$ 0, $\varphi$ = ATan[ax[\!\![1]\!\!], ax[\!\![2]\!\!]],\\
\phantom{InLSeII}$\varphi$ = $\pi$ + ATan[ax[\!\![l]\!\!], ax[\!\![2]\!\!]]];\\
\phantom{InLSeI}Circle[o, r, \{$\varphi$ - $\alpha$, $\varphi$ + $\alpha$\}]\\
\phantom{InLSe}]\\
\phantom{InLS}];
\tt
\phantom{In}Manipulate[ \\
\phantom{InM}Graphics[\{Circle[], \{Thick, Green, LSeg[p[\!\![1]\!\!], p[\!\![2]\!\!]]\}\}], \\
\phantom{InM}\{\{p, \{\{-1/2, -1/2\}, \{1/3, -1/3\}\}\}, Locator\}]

3. Аналогичные модификации имеются у примитива \text{\tt Disk}:

\tt
In[17]:=\{Graphics [\{Orange, Disk [\{0, 0\}, 1, \{$\pi$/3, 5$\pi$/3\}]\}], \\
\phantom{In[17]:=\{}Graphics[\{Green, Disk[\{0, 0\}, \{3, 2\}]\}]\}

4. Примитив \text{\tt Line} позволяет рисовать сразу несколько ломаных, например, две ломаные, отличающиеся на параллельный перенос на вектор a:

\tt 
In[18]:=11=\{\{1,0\}, \{2,3\}, \{-1,2\}\}; \\
\phantom{In[18]:=}a={1, .2}; \\
\phantom{In[18]:=}Graphics[Line[\{11, Map[a+\#&, 11]\}]]

5. Точно так же \text{\tt Polygon} может рисовать сразу несколько многоугольников. Кроме того, цвет многоугольника можно задавать "от вершин, по градиенту". Для этого используется опция \text{\tt VertexColor}.

\tt
In[21]:= \\
\phantom{In}\{Graphics[Polygon[Table[\{Cos[i $\frac{2\pi}{7}$], Sin[i $\frac{2\pi}{7}$]\}, \{i, 0, 6\}], \\
\phantom{In\{Gr}VertexColors$\to$\{Red, Orange, Yellow, Green, Cyan, Blue, \\
\phantom{In\{GrVe}Magenta\}]], \\
\phantom{In\{}Graphics[Polygon[Table[\{Cos[i $\frac{2\pi}{7}$], Sin[i $\frac{2\pi}{7}$]\}, \{i, 0, 6\}], \\
\phantom{In\{Gr}VertexColors$\to$\{Orange, White, Orange, White, Orange, \\
\phantom{In\{GrVe}White, Orange\}]]\}

6.Если примитив \text{\tt Rectangle} использовать с одним аргументом, то получится единичный квадрат с заданным левым нижним углом. Если вовсе без аргументов - то с левым нижним углом в начале координат.

7.Наконец, примитив \text{\tt Text} располагает средствами для позиционирования текста (второй аргумент), выбора отступа (третий аргумент), направления (четвертый), фона (пятый) и т. п. Мы не будем на этом останавливаться подробно, приведем только один пример:

\tt
In[22]:=Graphics[\\
\phantom{In[22]:=G}\{Circle[], Text["Это окружность"\ \!\!\!\!, \{0,0\}, Automatic,\\
\phantom{In[22]:=Gra}\{1,1\}, Background $\to$ LightRed],\\
\phantom{In[22]:=Gr}Text[Style[x\^\,\!2+y\^\,\!2==1, 15, Bold], \{1/2,0\},\\
\phantom{In[22]:=Gra}FormatType $\to$ TraditionalForm]\}]

Прежде чем перейти к полному списку графических директив, перечислим оставшиеся примитивы:

8. Примитив \text{\tt Inset}, служащий для вставки одного объекта внутрь другого, например, подписи к рисункам.

9. Примитив \text{\tt Raster}, изображающий прямоугольник, разбитый на раскрашенные квадратики заданных цветов.

10. Примитив \text{\tt Locator} служит для создания динамического элемента графики, позволяющего вводить координаты текущей точки экрана.

11. Примитив \text{\tt GraphicsGroup} служит для объединения объектов в группу, которая может быть отредактирована как единое целое.

12. Примитив \text{\tt GraphicsComplex} - важный элемент графики, позволяющий отдельно задавать структуру одномерного, двумерного или трехмерного комплекса (набора примитивов), и отдельно задавать координаты определяющих их точек: \text{\tt GraphicsComplex[координаты вершин, структура]}. В структуре вершины задаются уже только своими номерами в списке вершин. Приведем пример. Здесь список вершин состоит из 6 элементов (первые три - вершины треугольника, оставшиеся три - середины его сторон):

\tt
In[23]:=
\phantom{In}a=\{-1,-1\}; b=\{1,-1\}; c=\{0,1\}; \\
\phantom{In}v=\{a,b,c\}$\sim$Join$\sim$\{$\frac{b+c}{2}$, $\frac{a+c}{2}$, $\frac{b+a}{2}$\}\\
\phantom{In}Graphics[GraphicsComplex[v, \\
\phantom{InGr}\{Thin, Line[\{1, 2, 3, 1\}], Green, Thick, Line [\{1, 4\}],\\
\phantom{InGra}Line[\{2, 5\}], Line [\{3, 6\}], Red, PointSize[Large],\\
\phantom{InGra}Point[\{1,2,3\}], Blue, PointSize [Medium], Point[\{4,5,6\}]\}]]

Это удобно, например, при создании динамических объектов. Скажем, вот иллюстрация к теореме о том, что медианы треугольника пересекаются в одной точке (в \text{\tt Manipulate} координаты трех точек из списка a задаются с помощью примитива \text{\tt Locator}, дающего возможность вводить положение точки мышью):

\tt
In[26]:=Manipulate[\\
\phantom{In[26]:=M}Graphics[GraphicsComplex[\\
\phantom{In[26]:=Man}a$\sim$Join$\sim$$\left\{\frac{a[[2]]+a[[3]]}{2},\, \frac{a[[1]]+a[[3]]}{2},\, \frac{a[[2]]+a[[1]]}{2}\right\}$,\\
\phantom{In[26]:=Man}\{Thin, Line[\{1,2,3,1\}], Green, Thick, Line[\{1,4\}],\\
\phantom{In[26]:=Mani}Line[\{2, 5\}], Line[\{3, 6\}], Red, PointSize[Large],\\
\phantom{In[26]:=Mani}Point[\{1, 2, 3\}], Blue, PointSize[Medium],\\
\phantom{In[26]:=Mani}Point[\{4, 5, 6\}]\}], PlotRange$\to$1.5],\\
\phantom{In[26]:=M}\{\{a,\{\{-1, -1\}, \{1, -1\}, \{0, 1\}\}\},Locator\}]

Светлана Петрова
Светлана Петрова
Украина
Марина Семенова
Марина Семенова
Россия, г. Чебоксары