Практикум по компьютерной геометрии

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

Разбить на страницы
Показывать лекцию целиком

В $$Mathematica$$ существует всего два основных типа графических объектов: $$\text{\tt Graphics}$$ и $$\text{\tt Graphics3D}$$. Имеется ДВА ОСНОВНЫХ СПОСОБА создавать графические объекты. Первый способ (и на самом деле основной) предназначен для создания графики, состоящей из набора простых графических элементов (так называемых примитивов), которые описываются явно (скажем, точки задаются своими координатами, сфера - своими центром и радиусом). При использовании второго способа соответствующие примитивы порождаются самим пакетом исходя из заданной функции, списка или другого объекта, подлежащего визуализации, с помощью специальных команд, таких как $$\text{\tt Plot, ParametricPlot}$$ и т. п.

Изображение графических примитивов

Общий формат команды, изображающей на экране графические объекты, составленные из примитивов, таков:

$$\tt Graphics[< primitives >, < options >] (* для 2-мерной графики *) Graphics3D[< primitives >, < options >](* для 3-мерной графики *) $$

Например,

$$\tt In[1]:=Graphics[Circle[]] \\ \phantom{In[1]:=}Graphics3D[Sphere[]] \\ \phantom{In[1]:=}g=Graphics[Disk[]]; $$

Отметим, что точка с запятой после команды, как и положено, подавляет вывод на экран, хотя операция все равно выполняется и ее результат сохраняется. Увидеть полученное можно обратившись к результату операции:

$$\tt In[4]:=g$$

Двумерные примитивы

Список основных двумерных примитивов

Вот список основных двумерных графических примитивов (элементарных кирпичиков, из которых складывается любая картинка) в алфавитном порядке (напомним, что (* комментарии *) обрамляются скобками со звездочками):

$$\tt In[5]:=Graphics[\{Arrow[\{\{0, 0\}, \{1, 1\}\}], \\ \phantom{In[5]:=Graphics[\{}Arrow[\{\{0, 1\}, \{0, ?\}, \{1/2, 1/3\}, \{1, 0\}\}], \\ \phantom{In[5]:=Gr}(* Стрелка, прямая или ломаная, \\ \phantom{In[5]:=Gr}заданная набором своих последовательных вершин \\ \phantom{In[5]:=Gra}(точнее - их координат) *) \\ \phantom{In[5]:=Graphics[\{}Circle [{1/2, 1/2}, 1/3], (*окружность, \\ \phantom{In[5]:=Gr}заданная своим центром и радиусом *)\} \\ \phantom{In[5]:=Graphics[\{}Disk [\{1/2, 1/2\}, 1/9], (* заполненный диск, \\ \phantom{In[5]:=Gr}заданный своим центром и радиусом *) \\ \phantom{In[5]:=Graphics[\{}Line[\{\{l/3, 1\}, \{2/3, 1\}\}], $$ $$\tt \phantom{In[5]:=Gr}Line[\{\{l/3, 8/9\}, \{2/3, 8/9\}, \{4/5, 1\}, \{7/8, 1\}, \\ \phantom{In[5]:=Grap}\{1/3, 8/9\}\}], (* Отрезок или ломаная линия, \\ \phantom{In[5]:=Gr}заданные координатами своих последовательных вершин, \\ \phantom{In[5]:=Gr}Listable *) \\ \phantom{In[5]:=Graphics[\{}Point[\{1, 1/2\}], (* точка, \\ \phantom{In[5]:=Gr}заданная своими координатами, Listable *) \\ \\ $$ $$\tt \phantom{In[5]:=Gr}Polygon[\{\{l/3, 2/9\}, \{2/3, 2/9\}, \{4/5, 0\}, \{7/8, 0\}, \\ \phantom{In[5]:=GrPo}\{1/3, 2/9\}\}], (*заполненный многоугольник, \\ \phantom{In[5]:=Gr}заданный координатами последовательных вершин*)\} \\ \phantom{In[5]:=Gr}Rectangle [\{0, 1/10\}, \{3/10, 2/10\}], (* прямоугольник, \\ \phantom{In[5]:=Gr}заданный левой нижней и правой верхней вершинами*) \\ \phantom{In[5]:=Gr}Text["На этой картинке очень много всего", \{1, 1/2\}] \\ \phantom{In[5]:=Gr}(* текст, центрованный в заданной точке *)\} \\ \phantom{In[5]:=G}\}]$$

Конечно, такая картинка сложна для восприятия. Хочется добавить цвета, изменить толщину линий и прочее. Имеется две возможности менять вид рисунка вообще и графических примитивов в частности. Первый способ связан с использованием опций ($$\text{\tt Options}$$), которые влияют на рисунок в целом. Мы поговорим о них потом, а сейчас займемся вторым способом, использующим так называемые графические директивы ($$\text{\tt Directives}$$). Каждая директива оказывает действие на следующие за ней примитивы в списке:

$$\tt In[6]:=Graphics [\{Red, Arrow[\{\{0, 0\}, \{1, 1\}\}], (* Red, очевидно, \\ \phantom{In[6]:=Gr}делает последующий вывод красным *) \\ \phantom{In[6]:=Graphics [\{}Arrow[\{\{0, 1\}, \{0, 1/2\}, \{1/2, 1/3\}, \{1, 0\}\}], \\ \phantom{In[6]:=Graphics [\{}Circle[\{l/2, 1/2\}, 1/3], \\ \phantom{In[6]:=Graphics [\{}Disk [\{1/2, 1/2\}, 1/9], \\ \phantom{In[6]:=Graphics [\{}Green, Line[\{\{l/3, 1\}, \{2/3, 1\}\}], \\ \phantom{In[6]:=Gr}(*Green - зелёным*) \\ \\ \phantom{In[6]:=Gr}Line[\{\{l/3, 8/9\}, \{2/3, 8/9\}, \{4/5, 1\}, \{7/8, 1\}, \\ \phantom{In[6]:=Grap}\{1/3, 8/9\}\}], \\ \phantom{In[6]:=Graphics [\{}Point[\{1, 1/2\}], \\ \\ \phantom{In[6]:=Gr}Polygon[\{\{l/3, 2/9\}, \{2/3, 2/9\}, \{4/5, 0\}, \{7/8, 0\}, \\ \phantom{In[6]:=Grap}\{1/3, 2/9\}\}], \\ \phantom{In[6]:=Gr}Rectangle[\{0, 1/10\}, \{3/10, 2/10\}], \\ \phantom{In[6]:=Gr}Text["На этой картинке очень много всего"\, \{1, 1/2\}] \\ \phantom{In[6]:=G}\}]$$

Можно ограничивать действие директивы, организуя примитивы в несколько подсписков:

$$\tt In[7]:=Graphics[\{\{Red, Arrow[\{\{0, 0\}, \{1, 1\}\}], \\ \phantom{In[7]:=Graphics[\{}Dashing[0.05], \\ \phantom{In[7]:=Gra}Arrow[\{\{0, 1\}, \{0, 1/2\}, \{1/2, 1/3\}, \{1, 0\}\}]\}, \\ \phantom{In[7]:=Graphics[\{}Circle[\{l /2, 1/2\}, 1/3], \\ \phantom{In[7]:=Graphics[\{}\{Green, Disk [\{1/2, 1/2\}, 1/9]\}, \\ \phantom{In[7]:=Graphics[\{}\{Yellow, Line[\{\{l/3, 1\}, \{2/3, 1\}\}]\}, $$ $$\tt \phantom{In[7]:=Gr}\{Thick, Line[\{\{l/3, 8/9\}, \{2/3, 8/9\}, \{4/5, 1\}, \\ \phantom{In[7]:=Graph}\{7/8, 1\}, \{1/3, 8/9\}\}]\}, \\ \phantom{In[7]:=Gr}(*Thick указывает на толщину линии*) \\ \phantom{In[7]:=Graphics[\{}\{PointSize[0.1], Red, Point[\{1, 1 /2\}]\}, \\ \phantom{In[7]:=Gr}(* PointSize на относительный размер точки *) \\ \phantom{In[7]:=Graphics[\{}\{Opacity[0.65], EdgeForm[\{Blue, Thick\}], \\ \phantom{In[7]:=Gra}FaceForm[Yellow], (* Прозрачность, \\ \phantom{In[7]:=Gra}св-ва граничной ломаной и заполнения*) \\ \phantom{In[7]:=Gra}Роlуgon[\{\{1/3, 2/9\}, \{2/3, 2/9\}, \{4/5, 0\}, \{7/8, 0\}, \\ \phantom{In[7]:=Graph}\{1/3, 2/9\}\}]\}, \\ \phantom{In[7]:=Gr}Rectangle[\{0, 1 /10\}, \{3/10, 2/10\}], \\ \phantom{In[7]:=Gr}\{Text["Тут очень много всего"\, {1, 1/2}]\} \\ \phantom{In[7]:=G}\}]$$

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

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\}]$$

Директивы

Директивы непосредственного управления цветом

В $$Mathematica$$ цвет задается разными способами. Кроме названий стандартных цветов и четырех основных оттенков серого (тут мы пользуемся упомянутым выше примитивом $$\text{\tt Raster}$$ )

$$\tt In[27]:=\\ \phantom{In}colors = \{Red, Green, Blue, Cyan, Magenta, Yellow, Brown,\\ \phantom{Incol}Orange, Pink, Purple,\\ \phantom{Incol}LightRed, LightGreen, LightBlue, LightCyan, LightMagenta,\\ \phantom{Incol}LightYellow, LightBrown, LightOrange, LightPink,\\ \phantom{Incol}LightPurple\}; \\ \phantom{In}cl = Partition[Map[Apply[List, \#] , colors], 10];\\ \phantom{In}Graphics[Raster[cl]]$$ $$ In[30]:=Graphics[Raster[{Map[\#[\!\![1]\!\!] , \{Black, White, Gray, LightGray\}]\}]] $$

которыми мы уже пользовались выше, есть возможность задавать цвет в форматах $$\text{\tt RGB, CMYK, Hue}$$ и, кроме того, $$\text{\tt GrayLevel}$$ для оттенков серого. В первых двух результирующий цвет представлен как сумма монохромных слагаемых ($$\text{\tt Red}$$ - красный, $$\text{\tt Green}$$ - зеленый, $$\text{\tt Blue}$$ - синий) и ($$\text{\tt Cyan}$$ - голубой, $$\text{\tt Magenta}$$ - фиолетовый, $$\text{\tt Yellow}$$ - желтый, $$\text{\tt blacK}$$ - черный), принимающих значения от нуля до единицы, что проиллюстрировано в следующих примерах:

$$\tt In[31]:= \phantom{In}Manipulate[\\ \phantom{InM}Graphics[\{RGBColor[r, g, b], Rectangle[\{0, 0\}, \{1, 1/3\}]\}],\\ \phantom{InM}\{r, 0, 1, Appearance $\to$ "Labeled"\ \!\!\!\!\!\! \},\\ \phantom{InM}\{g, 0, 1, Appearance $\to$ "Labeled"\ \!\!\!\!\!\! \},\\ \phantom{InM}\{b, 0, 1, Appearance $\to$ "Labeled"\ \!\!\!\!\!\! \}]$$ $$\tt In[32]:=\\ \phantom{In}Manipulate[\\ \phantom{InM}Graphics[\{CMYKColor[c, m, y, k], Rectangle [\{0, 0\}, \{1, 1/3\}]\}],\\ \phantom{InM}\{c, 0, 1, Appearance $\to$ "Labeled"\ \!\!\!\!\!\! \},\\ \phantom{InM}\{m, 0, 1, Appearance $\to$ "Labeled"\ \!\!\!\!\!\! \},\\ \phantom{InM}\{m, 0, 1, Appearance $\to$ "Labeled"\ \!\!\!\!\!\! \},\\ \phantom{InM}\{k, 0, 1, Appearance $\to$ "Labeled"\ \!\!\!\!\!\! \}]$$

Управление с помощью функции $$\text{\tt Hue}$$ может быть как однопараметрическим (от красного к фиолетовому и обратно), так и трех- и четырех параметрическим ($$\text{\tt Hue, Saturation, Brightness, Opacity}$$ ):

$$ In[33]:=\\ \phantom{In}Manipulate[Graphics[\{Hue[t], Rectangle[\{0, 0\}, \{1, 1/3\}]\}],\\ \phantom{InM}\{t, 0, 2, Appearance $\to$ "Labeled"\ \!\!\!\!\!\! \}]$$ $$\tt In[34]:=\\ \phantom{In}Craphics[Table[\{Hue[h], Edgeform[Gray], Rectangle[\{32h, 0\}]\},\\ \phantom{InGr}\{h, 0, 1, 1/32\}]]$$

Также однопараметрически оттенки серого задаются с помощью функции $$\text{\tt GrayLevel}$$:

$$\tt In[35]:=Manipulate[\\ \phantom{In[35]:=M}Graphics[\{GrayLevel[t], Rectangle[\{0, 0\}, \{1, 1/3\}]\}],\\ \phantom{In[35]:=M}\{t, 0, 1\}]$$

Директивы, управляющие размерами. Абсолютные и относительные характеристики

Pазмеры составляющих рисунок примитивов можно задавать как в абсолютных единицах, так и в относительных. Абсолютная единица размера точки равна 1/72 дюйма (т. е. та самая точка - $$\text{\tt point}$$ старого матричного принтера). Относительная единица - это доля от размера рисунка.

Размер точки

$$\tt In[36]:=Graphics[ \phantom{In[35]:=G}Table[\{Hue[1/i], AbsolutePointSize[i], Point[\{i,0\}]\},\\ \phantom{In[35]:=MT}\{i, 1, 20\}]]$$ $$\tt In[37]:=\\ \phantom{In}Graphics[Table[\{PointSize[1/2^{i-1}], Hue[1/i], Point[\{0, 0\}]\},\\ \phantom{InGr}\{i, 1, 5\}]]$$

Сплошная или пунктирная линия, размер черточек и пробелов

Директива $$\text{\tt AbsoluteDashing[\{d1, d2, ..\}]}$$ - последующие линии рисуются пунктиром с циклически повторяющимися интервалами абсолютных длин $$\text{\tt d1, d2, ...}$$, видимо, в пикселях. Директива $$\text{\tt Dashing[\{d1, d2, ..\}]}$$ - то же, но размеры в долях ширины всей картинки.

Чтобы почувствовать разницу между $$\text{\tt AbsoluteDashing}$$ и просто $$\text{\tt Dashing}$$, полезно поменять мышкой размер рисунка. При этом не меняется длина абсолютных $$\text{\tt dash}$$-ей (большая окружность и отрезок, идущий вправо вверх) и количество относительных $$\text{\tt dash}$$-ей (все остальные линии).

$$\tt In[38]:=\\ \phantom{In}Graphics[\{AbsoluteDashing[\{1, 5, 10\}], Line[\{\{0, 0\}, \{1, 1\}\}],\\ \phantom{InGr}Circle[], Dashing[\{.1, .2\}], Line[\{\{0, 0\}, \{1, -1\}\}],\\ \phantom{InGr}Circle[\{0, 0\}, 1/2]\}]$$

Возможны сокращенные версии этих абсолютных директив: $$\text{\tt Dotted, Dashed, DotDashed}$$:

$$\tt In[39]:=\\ \phantom{In}Graphics[\{Dotted, Line[\{\{0, 0\}, \{1, 1\}\}], Dashed, Circle[],\\ \phantom{InGr}DotDashed, Line[\{\{0, 0\}, \{1, -1\}\}]\}]$$

Толщина линии Аналогично, имеются команды, управляющие толщиной линии:

$$\tt In[40]:=AbsoluteThickness[r](*абсолютная толщина*) \\ \phantom{In[40]:=}Thickness[r](*относительная толщина*) \\ \phantom{In}Thin \\ \phantom{In}Thick \\ \\ Out[40]=AbsoluteThickness[r] \\ \\ Out[41]=Thickness[r] \\ \\ Out[42]=Thickness[Tiny] \\ \\ Out[43]=Thickness{Large] \\ \\ In[44]:= \\ \phantom{In}Graphics[{AbsoluteThickness[5], Line[\{\{0, 0\}, \{1, 1\}\}], \\ \phantom{In}Thickness[0.05], Circle[], Thin, Line[\{\{0, 0\}, \{1, -1\}\}]\}]$$

Снова поменяйте мышкой размер рисунка. Толщина абсолютных линий не меняется. Относительные линии меняют абсолютную толщину вместе с рисунком.

Вид многоугольника, диска, прямоугольника

В $$Mathematica$$ способом "заполнения объектов" управляют две директивы: $$\text{\tt EdgeForm[список директив]}$$ и $$\text{\tt FaceForm[список директив]}$$. Они определяют цвет, толщину, прозрачность и стиль заполнения. Пустой $$\text{\tt FaceForm[]}$$ дает прозрачный многоугольник. В трехмерной графике (см. ниже) с помощью $$\text{\tt FaceForm}$$ можно определить разные цвета для двух сторон многоугольника (тогда аргумент - список из двух списков директив).

$$\tt In[45]:=\{Graphics[\{EdgeForm[\{Thickness[0.5], Dashed, Orange\}],\\ \phantom{In[45]:=\{Gr}Red, Disk[]\}],\\ \phantom{In[45]:=\{}Graphics[ \\ \phantom{In[45]:=\{Gr}\{EdgeForm[\{AbsoluteThickness[0.2], Blue,\\ \phantom{In[45]:=\{Grap}Dashing[\{0.01, .01\}]\}], Cyan, Disk[]\}]\}$$ $$\tt In[46]:=\\ \phantom{In}Graphics[\\ \phantom{InG}\{\{EdgeForm[\{Thickness[0.5], Dashed, Orange\}], Red,\\ \phantom{InGra}Disk[\{0, 0\}, 1\},\\ \phantom{InGr}\{EdgeForm[\{AbsoluteThickness[0.2], Blue,\\ \phantom{InGraph}Dashing[\{0.01, .01\}]\}], FaceForm[Opacity [0.15], Cyan],\\ \phantom{InGra}Disk[\{1, 0\}, 1]\}\}]$$

Директива Directive

Эта директива служит для формирования единой директивы, являющейся композицией любого набора директив. Удобна при создании сложных комбинаций директив (см. примеры ниже).

Опции

$$Mathematica$$ также предусматривает множество опций, помогающих придать рисунку удобный, понятный и изящный вид. Общий вид опций следующий: $$\text{\tt Имя\_oпции }$\to$\text{ Значение}$$

Рамки и координатные оси

Отношения размеров, взаимное расположение и т. п. удобнее наблюдать при наличии той или иной системы отсчета. Для этого предусмотрены по умолчанию выключенные $$\text{\tt Axes}$$ (координатные оси), и $$\text{\tt Frame}$$ (рамка). Чтобы их включить, следует установить их в $$\text{\tt True}$$. Кроме того, можно вызвать координатную сетку $$\text{\tt GridLines}$$, для чего проще всего установить ее в автоматический режим $$\text{\tt Automatic}$$. Все это, разумеется, можно настраивать и украшать.

$$\tt In[47]:=\{Graphics[\{FaceForm[\{Opacity[0.45], Orange\}], Disk[]\},\\ \phantom{In[47]:=\{G}Frame $\to$ True], \\ \phantom{In[47]:=\{}Graphics[\{FaceFormf\{Opacity[0.55], Orange\}], Disk[]},\\ \phantom{In[47]:=\{G}Axes $\to$ True], \\ \phantom{In[47]:=\{}Graphics[\{FaceForm[\{Opacity[0.65], Orange\}], Disk[]\},\\ \phantom{In[47]:=\{G}Frame $\to$ True], GridLines $\to$ Automatic],\\ \phantom{In[47]:=\{}Graphics[\{FaceForm[\{Opacity[0.75], Orange\}], Disk[]\},\\ \phantom{In[47]:=\{G}Axes $\to$ True, GridLines $\to$ Automatic]\}$$

Так, например, оси можно подписать с помощью $$\text{\tt AxesLabel}$$ (приписывается список подписей) и $$\text{\tt LabelStyle}$$ (директива как подписывать или список директив для разных осей), выбрать начало координат $$\text{\tt AxesOrigin}$$ (приписываются координаты точки), стиль осей $$\text{\tt AxesStyle}$$ (директива или список директив) и деления на них с помощью $$\text{\tt Ticks}$$ (дает возможность описать каждое деление на оси максимально подробно: где, что написать, как деление отступает вниз и вверх от оси, как оно выглядит (в примере - нуль по горизонтали)) и $$\text{\tt TicksStyle}$$ (аналогично):

$$\tt In[48]:= \\ \phantom{In}Graphics[\{FaceForm[\{Opacity[0.65], Orange\}], Disk[]\}, \\ \phantom{InG}Axes $\to$ True, AxesOrigin $\to$ \{-1, -1\}, AxesLabel $\to$ {"Ширина"\ \!\!\!\!, у\}, \\ \phantom{InG}LabelStyle $\to$ Directive [Red, Medium, Italic], AxesStyle $\to$ Thick, \\ \phantom{InG}Ticks $\to$ \\ \phantom{InGr}\{\{-1/3, -2/3, \{0, "Zero"\ \!\!\!\!, \{.5, 0.03\},\\ \phantom{InGraph}Directive[Green, Thin]\}, 1/2, 1\}, Automatic\}]$$

Имеются аналогичные опции для работы с $$\text{\tt Frame}$$.

Регулировка размеров рисунка в целом

Опция $$\text{\tt PlotRange}$$ явно указывает какую область рисунка рисовать (в координатах):

$$\tt In[49]:= \\ \phantom{In}\{Graphics[Circle[], PlotRange $\to$ \{0, 1\}, Frame $\to$ True], \\ \phantom{In\{}Graphics[Circle[], PlotRange $\to$ \{\{0, 1\}, \{0, 1\}\}, Frame $\to$ True], \\ \phantom{In\{}Graphics[Circle[], PlotRange $\to$ 2, Frame $\to$ True]\}$$

Одна пара значений задает пределы изменения $$у$$-координаты, две пары -обеих координат. Может также стоять одно число, определяющее максимальные значения обеих координат. Также может принимать значения $$\text{\tt All}$$ (все точки рисунка) или $$\text{\tt Full}$$ (все данные). По умолчанию равна $$\text{\tt Automatic}$$. Последнее означает, что $$Mathematica$$ сама решает, что рисовать, а что нет.

Опция $$\text{\tt ImageSize}$$ в аналогичных терминах задает размер рисунка как целого. Чтобы лучше видеть происходящее, удобно воспользоваться опцией $$\tt Background$$, которая позволяет закрасить весь прямоугольник образа, т.е. весь $$\text{\tt ImageSize}$$:

$$\tt In[50]:= \\ \phantom{In}Graphics[Circle[], PlotRange $\to$ \{0, 1\}, ImageSize $\to$ \{100, 150\}, \\ \phantom{InG}Frame $\to$ True, Background $\to$ Orange]$$

Опция $$\text{\tt AspectRatio}$$ регулирует отношение высоты рисунка (а не $$\text{\tt Image}$$-образа) к его ширине:

$$\tt In[51]:=\\ \phantom{In}\{Graphics[Circle[], AspectRatio $\to$ Automatic, \\ \phantom{In\{G}ImageSize $\to$ \{100, 100\}, Frame $\to$ True, Background $\to$ Yellow], \\ \phantom{In\{}Graphics[Circle[], AspectRatio $\to$ 1/2, ImageSize $\to$ \{100, 100\}, \\ \phantom{In\{G}Frame $\to$ True, Background $\to$ Yellow], \\ \phantom{In\{}Graphics[Circle[], AspectRatio $\to$ 2, ImageSize $\to$ \{100, 100\}, \\ \phantom{In\{G}Frame $\to$ True, Background $\to$ Yellow]\}$$

Отступ от краев прямоугольника образа (наружу) может быть также явно задан с помощью опции $$\text{\tt ImageMargins}$$:

$$\tt In[52]:=\\ \phantom{In}\{Graphics[Circle[], PlotRange $\to$ \{0, 1\}, ImageSize $\to$ \{100, 200\}, \\ \phantom{In\{G}Frame $\to$ True, Background $\to$ LightOrange], \\ \phantom{In\{}Graphics[Circle[], PlotRange $\to$ \{0, 1\}, ImageSize $\to$ \{100, 200\}, \\ \phantom{In\{G}Frame $\to$ True, Background $\to$ LightOrange, ImageMargins $\to$ 20] , \\ \phantom{In\{}Graphics[Circle[], PlotRange $\to$ \{0, 1\}, ImageSize $\to$ \{100, 200\}, \\ \phantom{In\{G}Frame $\to$ True, Background $\to$ LightOrange, \\ \phantom{In\{G}ImageMargins $\to$ \{\{10, 20\}, \{30, 40\}\}]\}$$

Отступ от краев прямоугольника образа (внутрь) может быть также явно задан с помощью опции $$\text{\tt ImagePadding}$$. При этом можно обрезать вылезающие за $$\text{\tt Frame}$$ (заданный $$\text{\tt PlotRange}$$) фрагменты рисунка с помощью переключателя $$\text{\tt PlotRangeClipping}$$:

$$\tt In[53]:=\\ \phantom{In}\{Graphics[Circle[], PlotRange $\to$ \{0, 1\}, ImageSize $\to$ \{100, 200\}, \\ \phantom{In\{G}Frame $\to$ True, Background $\to$ LightOrange], \\ \phantom{In\{}Graphics[Circle[], PlotRange $\to$ \{0, 1\}, ImageSize $\to$ \{100, 200\}, \\ \phantom{In\{G}Frame $\to$ True, Background $\to$ LightOrange, ImagePadding $\to$ 20], \\ \phantom{In\{}Graphics[Circle[], PlotRange $\to$ \{0, 1\}, ImageSize $\to$ \{100, 200\}, \\ \phantom{In\{G}Frame $\to$ True, Background $\to$ LightOrange, \\ \phantom{In\{G}ImagePadding $\to$ \{\{10, 20\}, \{30, 40\}\}], \\ \phantom{In\{}Graphics[Circle[], PlotRange $\to$ \{0, 1\}, ImageSize $\to$ \{100, 200\}, \\ \phantom{In\{G}Frame $\to$ True, Background $\to$ LightOrange, \\ \phantom{In\{G}ImagePadding $\to$ \{\{10, 20\}, \{30, 40\}\}, PlotRangeClipping $\to$ True]\}$$

Расширение $$\text{\tt Frame}$$ от размеров границы, заданной $$\text{\tt PlotRange}$$, определяется $$\text{\tt PlotRangePadding}$$ (в размерных единицах чертежа). При этом фактически меняется $$\text{\tt PlotRange}$$:

$$\tt In[54]:=\\ \phantom{In\{}{Graphics[Circle[], PlotRange $\to$ \{0, 1\}, Frame $\to$ True, \\ \phantom{In\{G}Background $\to$ LightOrange], \\ \phantom{In\{}Graphics[Circle[], PlotRange $\to$ \{0, 1\}, Frame $\to$ True, \\ \phantom{In\{G}Background $\to$ LightOrange, PlotRangePadding $\to$ 1/2], \\ \phantom{In\{}Graphics[Circle[], PlotRange $\to$ \{0, 1\}, Frame $\to$ True, \\ \phantom{In\{G}Background $\to$ LightOrange, PlotRangePadding $\to$ 1/2, \\ \phantom{In\{G}PlotRangeClipping $\to$ True]\}$$

Украшательства

Комбинируя опции этого типа, такие как $$\text{\tt Background, Prolog, Epilog}$$ и т.п., можно регулировать вид фона, взаимное перекрытие объектов и т.п. Имеются также опции, управляющие выводом текста.

Трехмерный случай

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

$$\tt In[55]:=Graphics3D[\{ \\ \phantom{In[55]:=Gr}\{Orange, Opacity[0.4], \\ \phantom{In[55]:=Gra}Cylinder[\{\{-1.5, -1.5, -1.5\}, \{1.5, 1.5, 1.5\}\}, $\sqrt{2}$]\},\\ \phantom{In[55]:=Gr}(* Прямой цилиндр, заданный осью-отрезком и радиусом*)\\ \phantom{In[55]:=Gr}\{Red, Sphere[\{0, 0, 0\}, 2]\}, (* Сфера: центр, радиус*)\\ \phantom{In[55]:=Gr}\{Green, Opacity[.3], Cuboid[\{-2, -2, -2\}, \{2, 2, -1\}]\}\}]\\ \phantom{In[55]:=}(* Прямоугольный параллелепипед, \\ \phantom{In[55]:=}Заданный координатами противоположных вершин*)$$

К графическим директивам, определяющим вид поверхности, добавляются две: $$\text{Glow[]}$$ (характеризует цвет, которым поверхность светится) и $$\text{Specularity[]}$$ (характеризует зеркальные свойства поверхности):

$$\tt In[56]:=Table[Graphics3D[{Specularity[Red, s], Black, Sphere[]\}, \\ \phantom{In[56]:=Ta}Boxed $\to$ False, ImageSize $\to$ 150], \{s, \{0, 1, 2, 10, 100\}\}]$$ $$\tt In[57]:=\\ \phantom{In}\{Graphics3D[\{Glow[Red], Black, Cuboid[]\}, Boxed $\to$ False, \\ \phantom{In\{G}ImageSize $\to$ 150], Graphics3D [\{Glow[Red], White, Cuboid[]\}, \\ \phantom{In\{G}Boxed $\to$ False, ImageSize $\to$ 150]\}$$

Кроме того, с помощью $$\text{\tt FaceForm}$$ можно теперь задавать разные цвета для разных сторон поверхности:

$$\tt In[58]:=\\ \phantom{In}Graphics3D[\{FaceForm[Blue, Orange], Sphere[]\},\\ \phantom{InG}PlotRange $\to$ \{\{-1, 1\}, \{-1/2, 1/2\}, \{-1, 1\}\}, Boxed $\to$ False]$$

В опциях $$\text{\tt Frame}$$ заменяется на $$\text{\tt Boxed}$$, добавляются возможности управлять источником света $$\text{\tt Lighting}$$ и опции, характеризующие "точку зрения" наблюдателя и некоторые другие характеристики образа:

$$\tt In[59]:=\\ \phantom{In}\{Graphics3D[{FaceForm[Blue, Orange], Sphere[]\},\\ \phantom{In\{G}PlotRange $\to$ \{\{-1, 1\}, \{-1/2, 1/2\}, \{-1, 1\}\}, Boxed $\to$ False,\\ \phantom{In\{G}Lightings $\to$ \{\{"Point"\ \!\!\!\!, White, \{0, 0, 0\}\}\}],\\ \phantom{In\{}Graphics3D[\{FaceForm[Blue, Orange], Sphere[]\},\\ \phantom{In\{G}PlotRange $\to$ \{\{-1, 1\}, \{-1/2, 1/2\}, \{-1, 1\}\}, Boxed $\to$ False,\\ \phantom{In\{G}Lighting $\to$ \{\{"Point"\ \!\!\!\!, White, \{2, 2, 2\}\}\}],\\ \phantom{In\{}Graphics3D[\{FaceForm[Blue, Orange], Sphere[]\},\\ \phantom{In\{G}PlotRange $\to$ \{\{-l, 1\}, \{-1/2, 1/2\}, \{-1, 1\}\}, Boxed $\to$ False,\\ \phantom{In\{G}Lighting $\to$ \{\{"Ambient"\ \!\!\!\!, White\}\}],\\ \phantom{In\{}Graphics3D[\{FaceForm[Blue, Orange], Sphere[]\},\\ \phantom{In\{G}PlotRange $\to$ \{\{-l, 1\}, \{-1/2, 1/2\}, \{-1, 1\}\}, Boxed $\to$ False,\\ \phantom{In\{G}Lighting $\to$ Automatic]\}$$ $$\tt In[60]:=\\ \phantom{In}Manipulate[Graphics3D[\{FaceForm[Blue, Orange], Sphere[]\}\\ \phantom{In\{Ma}PlotRange $\to$ \{\{-1, 1\}, \{-1/2, 1/2\}, \{-1, 1\}, Boxed $\to$ False,\\ \phantom{In\{Ma}VienPoint $\to$ \{x, y, z\}, Image $\to$ 200], \{x, -3, 3\},\\ \phantom{In\{M}\{y, -3, 3\}, \{z, -3, 3\}]$$

Графика, порожденная функциями и другими числовыми данными

Двумерная графика

Как уже говорилось в начале, $$Mathematica$$ располагает специальным арсеналом средств, позволяющих визуализировать числовые данные и функции. Самый простой и известный способ визуализировать функцию - это построить ее график. Это делается с помощью уже встречавшейся нам команды $$\text{\tt Plot}$$:

$$\tt In[61]:=Plot[Sin[x], \{х, -$\pi$, $\pi$\}]$$

На самом деле команда $$\text{\tt Plot}$$ генерирует по данной функции графические примитивы, директивы и опции и формирует затем соответствующую команду $$\text{\tt Graphics}$$:

$$\tt In[62]:=InputForm[Plot[Sin[x], \{x, -$\pi$, $\pi$\}]] //Short \\ \\ Out[62]=Graphics[\{\{\{\}, \{\}, \{Hue[0.67, 0.6,\\ \phantom{Out[62]=Gr}0.6], Line[\{\{<<2>>, <<30>>\}]\}\}\}, \{<<6>>\}]$$

Таким образом, мы видим, что $$\text{\tt Plot}$$, на самом деле, строит ломаную линию. При желании этим можно воспользоваться:

$$\tt In[63]:=gg = Plot[Sin[x], \{х, -$\pi$ ,$\pi$\}];\\ \phantom{In[63]:=}gg[\!\![l, 1, 3, 1]\!\!]\\ \\ Out[64]=Hue[0.67, 0.6, 0.6]$$

Вот мы вычленили директиву, предшествующую собственно ломаной. Ее можно подменить, например так:

$$\tt In[65]:=gg[\!\![l, 1, 3, l]\!\!] = Sequence [Red, Thick, Dashed];\\ \phantom{In[65]:=}gg$$

С одной стороны, в командах типа $$\text{\tt Plot}$$ можно использовать опции обычной графики. С другой стороны, есть и специальные способы управления, главные из которых $$\text{\tt PlotStyle}$$ и $$\text{\tt ColorFunction}$$. Опция $$\text{\tt PlotStyle}$$ служит для использования уже знакомых нам графических директив. Теперь $$Mathematica$$ сама поставит их в нужное место в команде $$\text{\tt Graphics}$$:

$$\tt In[67]:=\{Plot[\{Red, Dashed, Thick, Sin[x]\}, \{x, -$\pi$, $\pi$\}],\\ \phantom{In[67]:=\{}Plot[Sin[x], \{x, -$\pi$, $\pi$\},\\ \phantom{In[67]:=\{P}PlotStyle $\to$ \{RGBColor[l, 0, 0], Dashed, Thick\}]\}$$

Опция $$\text{\tt ColorFunction}$$ служит для управления цветом изображаемого графика. Имена и смысл переменных этой функции фиксированы (для каждого типа графики - свои, для обычного $$\text{\tt Plot}$$, например, это $$x, y$$ ). В качестве примера раскрасим график в соответствии с кривизной соответствующей плоской кривой:

$$\tt In[68]:=ClearAll[g];\\ \phantom{In[68]:=}cur[f\_][t\_] := $\frac{Abs[D[f[t],t,t]]}{(l+D[f[t],t]^2)^{3/2}}$;\\ \phantom{In[68]:=}g[t\_] = cur[Sin][t]; \\ \phantom{In[68]:=}\{Plot[Sin[x], {x, -$\pi$, $\pi$\}, PlotStyle $\to$ \{Thick\},\\ \phantom{In[68]:=Cl}ColorFunction $\to$ Function [\{x, y\}, Hue$[\frac{g[x]}{1.1}]$],\\ \phantom{In[68]:=Cl}ColorFunctionScaling $\to$ False],\\ \phantom{In[68]:=C}Plot[g[t], \{t, -$\pi$, $\pi$\}]\}$$

Замечание. На самом деле, чтобы картина была реалистичной, пришлось отмасштабировать кривизну так, чтобы она менялась от 0 до 1/2 (важно, чтобы не доходила до 1). Здесь мы пользуемся тем, что кривизна графика синуса меняется от нуля (на рисунке - красный) до единицы (синий). Опция $$\text{\tt ColorFunctionScaling }$\to$\text{ False}$$ отключает автоматическое масштабирование функции, отвечающей за цвет, которое затемняет дело.

Перечислим теперь встроенные возможности функции $$\text{\tt Plot}$$. Во-первых, можно рисовать сразу несколько графиков, причем они автоматически получаются разноцветными. Можно и самим регулировать их вид (с помощью $$\text{\tt PlotStyle}$$):

$$\tt In[72]:=\{Plot[\{Sin[x], 1.2Sin[2x], 1.3Sin[3x]\}, \{x, 0, 10\}],\\ \phantom{In[72]:=\{}Plot[\{Sin[х], 1.2Sin[2x], 1.3Sin[3x]\}, \{x, 0, 10\},\\ \phantom{In[72]:=\{P}PlotStyle $\to$ \{\{Red, Thick\}, \{Dashed, Blue\}, \{Orange\}\}]\}$$

Можно также закрашивать области, ограниченные графиком (графиками). Это исполняется с помощью опции $$\text{\tt Filling}$$, значение которой устанавливается в тип заполнения ("до оси", "подграфик", "надграфик"):

$$\tt In[73]:=Plot[\{Sin[x], 1.2Sin[2x], 1.3Sin[3x]\}, \{x, 0, 10\}, \\ \phantom{In[73]:=P}Filling $\to$ \{l $\to$ Axis, 2 $\to$ Bottom, 3 $\to$ Top\}]$$

Более хитрый вид заполнения: для 2-го объекта выбрано заполнение до 1-го. Можно также добавить директивы, как именно заполнять:

$$\tt In[74]:=\\ \phantom{In}\{Plot[\{Sin[x], 1.4Sin[2x]\}, \{х, 0, 10\}, Fillings $\to$ \{2 $\to$ \{1\}\}],\\ \phantom{In\{}Plot[\{Sin[x], 1.4Sin[2x]\}, \{x, 0, 10\},\\ \phantom{In\{P}Filling $\to$ \{2 $\to$ \{l, \{Red, Blue\}\}\}]\}$$

Можно явно указать, сколько точек участвуют в построении ломаной, изображающей кривую. Современные версии $$Mathematica$$ сами следят за качеством графика, поэтому $$\text{\tt PlotPoints}$$ в двумерной графике - это начальное количество точек аппроксимации (по умолчанию равен 50). Если картинка $$Mathematica$$ не нравится, она сама подразобьет кривую столько раз, сколько ей захочется. Чтобы запретить ей это, нужно ограничить рекурсию с помощью опции $$\text{\tt MaxRecursion}$$ (которая устанавливается в количество итераций). Чтобы увидеть точки-вершины ломаной, нужно использовать опцию $$\text{\tt Mesh}$$:

$$\tt In[75]:=\{Plot[Sin[x], \{x, -$\pi$, $\pi$\}, Mesh$\to$All, MaxRecursion$\to$0],\\ \phantom{In[75]:=\{}Plot[Sin[x], \{x, -$\pi$, $\pi$\}, PlotPoints$\to$5, Mesh$\to$All,\\ \phantom{In[75]:=\{P}MaxRecursion$\to$0],\\ \phantom{In[75]:=\{}Plot[Sin[x], \{x, -$\pi$, $\pi$\}, PlotPoints$\to$5, Mesh$\to$All,\\ \phantom{In[75]:=\{P}MaxRecursion$\to$1],\\ \phantom{In[75]:=\{}Plot[Sin[x], \{x, -$\pi$, $\pi$\}, PlotPoints$\to$5, Mesh$\to$All]\} $$

Иногда полезно исключить из рассмотрения какие-нибудь точки. Для этого служит опция $$\text{\tt Exclusions}$$, которая устанавливается в условие:

$$\tt In[76]:=\{Plot[Tan[x], \{х, -2$\pi$, 2$\pi$\}],\\ \phantom{In[76]:=\{}Plot[Tan[x], \{х, -2$\pi$, 2$\pi$\}, Exclusions$\to$\{Cos[x] == 0\}]\} $$

К двумерным способам представления числовых данных относятся так же:

  • $$\text{\tt ListPlot, ListLinePlot, ArrayPlot}$$,
  • $$\text{\tt PolarPlot, ParametricPlot}$$,
  • $$\text{\tt ContourPlot, DensityPlot}$$,
  • $$\text{\tt RegionPlot}$$.
  • Первые три служат для изображения дискретных данных (одномерных или двумерных). Вот одномерные данные:

    $$\tt In[77]:=data = Table [Random[], \{20\}];\\ \phantom{In[77]:=}\{ListPlot[data, Filling $\to$ Axis], \\ \phantom{In[77]:=d}ListLinePlot[data,Filling $\to$ Axis]}$$

    А вот - двумерные. Обратите внимание, что $$\text{\tt ListLinePlot}$$ просто соединяет последовательные точки линией.

    $$\tt In[79]:=\\ \phantom{In}data = Table[\{Cos[\#], Sin[\#]\} \ [Random[Real, 2$\pi$]], \{i, 1, 40\}];\\ \phantom{In}\{ListPlot[data, AspectRatio $\to$ Automatic],\\ \phantom{Ind}ListLinePlot[data, AspectRatio $\to$ Automatic]\}$$

    $$\text{\tt ArrayPlot}$$ изображает числа строки в виде раскрашенных квадратиков. По умолчанию они черно-белые, но можно их и раскрасить:

    $$\tt In[81]:=ArrayPlot[Transpose[data]]$$

    Можно задать цвета явно с помощью правил $$\text{\tt ColorRules}$$, можно использовать $$\text{\tt ColorFunction}$$. Мы нарисуем число $$\pi$$:

    $$\tt In[82]:=curpet[х\_, m\_, n\_] :=\\ \phantom{In[82]:=cu}Module[\{res, хх, i\},\\ \phantom{In[82]:=cur}(*Эта подпрограммка вычисляет цифры числа х и \\ \phantom{In[82]:=curp}организовывает их в массив\}*)\\ \phantom{In[82]:=cur}хх = N[x, m n];\\ \phantom{In[82]:=cur}res = \{RealDigits[хх, 10, m] [\!\![1]\!\!]\};\\ \phantom{In[82]:=cur}xx = xх/10$^{\text{RealDigits}[xx,10,m][\![2]\!]}$;\\ \phantom{In[82]:=cur}For[i = l, i $\le$ n - 1, i++,\\ \phantom{In[82]:=curp}res = res$\sim$Join$\sim$\{RealDigits[xx, 10, m, -m i - 1][\!\![1]\!\!]\}\\ \phantom{In[82]:=cur}];\\ \phantom{In[82]:=cur}res\\ \phantom{In[82]:=cu}];\\ \phantom{In[82]:=}rules = \{0$\to$Red, 1$\to$Pink, 2$\to$Orange, 3$\to$Brown, 4$\to$Yellow,\\ \phantom{In[82]:=cur}5$\to$Green, 6$\to$Cyan, 7$\to$Blue, 8$\to$Magenta, 9$\to$Purple\}; $$ $$\tt In[84]:={ArrayPlot[curpet[$\pi$, 40, 40], ColorRules$\to$rules],\\ \phantom{In[84]:=\{}ArrayPlot[curpet[$\pi$, 40, 40], ColorFunction$\to$"Pastel"\ \!\!\!],\\ \phantom{In[82]:=\{}ArrayPlot[curpet[$\pi$, 40, 40], ColorFunction$\to$"Rainbow"\ \!\!\!] \}$$

    Команда $$\text{\tt PolarPlot}$$ удобна для рисования кривых, заданных в полярных координатах. Имеется также ее модификация $$\text{\tt ListPolarPlot}$$:

    $$\tt In[85]:=PolarPlot[\{l, 1 + 1/2Sin[10t], 1/2\}, \{t, 0, 2Pi\},\\ \phantom{In[85]:=P}PlotStyle $\to$ \{Green, \{Dashed, Thick, Orange\},\\ \phantom{In[85]:=Pol}\{Thickness[0.005], Green\}\}]$$

    Универсальный инструмент для рисования кривых - это, конечно, команда $$\text{\tt ParametricPlot}$$. Он теперь сразу позволяет рисовать однопараметрические семейства или области:

    $$\tt In[86]:=\\ \phantom{In}\{ParametricPlot[\{Cos[x], Sin[2x]\}, \{x, 0, 2$\pi$\}],\\ \phantom{In\{}ParametricPlot[r\{Cos[x], Sin[2x]\}, \{x, 0, 2$\pi$\}, \{r, 0.5, 1.5\}],\\ \phantom{In\{}ParametricPlot[r\{Cos[x], Sin[2x]\}, \{x, 0, 2$\pi$\},\\ \phantom{In\{P}\{r, 0.5, 1.5\}, Mesh$\to$None]\}$$

    Можно использовать это для рисования, например, координатных линий:

    $$\tt In[87]:=\\ \phantom{In}\{ParametricPlot[\{х, у\}, \{х, -1, 1\}, \{у, -1, 1\}, Axes$\to$False,\\ \phantom{In\{P}Frame$\to$False], ParametricPlot[\{r Cos[$\varphi$], r Sin[$\varphi$]\},\\ \phantom{In\{P}\{$\varphi$, 0, 2$\pi$\}, \{r, 0, 1\}, Axes$\to$False, Frame$\to$False]\} $$

    или для наглядного изображения отображений из плоскости в плоскость:

    $$\tt In[88]:=\\ \phantom{In}F[u\_, v\_] := \{Re[(u + iv)$^{1/3}$], Im[(u + iv)$^{1/3}$]\};\\ \phantom{In}\{ParametricPlot[\{u, v\}, \{u, -1, 1\}, \{v, -1, 1\}, Frame $\to$ False,\\ \phantom{In\{P}MeshStyle $\to$ \{Orange, Green\}],\\ \phantom{In\{}ParametricPlot[F[u, v], \{u, -1, 1\}, \{v, -1, 1\}, Frame $\to$ False,\\ \phantom{In\{P}MeshStyle $\to$ \{Orange, Green\}, AxesOrigin $\to$ \{0, 0\}]\}$$ $$\tt In[90]:=\\ \phantom{In}FF[r\_, $\varphi$\_] := \{Re[r$^{1/3}$e$^{i\frac{\varphi}{3}}$], Im[r$^{1/3}$e$^{i\frac{\varphi}{3}$]\};\\ \phantom{In}\{ParametricPlot[\{r Cos[$\varphi$], r Sin[$\varphi$]\}, \{r, 0, 1\}, \{$\varphi$ -$\pi$, $\pi$\},\\ \phantom{In\{P}Frame$\to$False, MeshStyle$\to$\{Orange, Green\}],\\ \phantom{In\{}ParametricPlot[FF[r, $\varphi$], \{r, 0, 1\}, \{$\varphi$, -$\pi$, $\pi$\}, Frame$\to$False,\\ \phantom{In\{P}MeshStyle$\to$\{Orange, Green\}, AxesOrigin$\to$\{0, 0\}]\}$$ $$\tt In[92]:=\\ \phantom{In}DLP[r\_, $\varphi$\_] := Module[\{z, z0, w\},\\ \phantom{InDLP}z=re$^{i\varphi}$;\\ \phantom{InDLP}z0 = 1/2;\\ \phantom{InDLP}w = $\frac{z-z0}{(1-z \text{Conjugate}[z0]}$;\\ \phantom{InDLP}\{Re[w], Im[w]\}\\ \phantom{InDL}];\\ \phantom{In}\{ParametricPlot[\{r Cos[$\varphi$], r Sin[$\varphi$]\}, \{r, 0, 1\}, \{$\varphi$, -$\pi$, $\pi$\},\\ \phantom{InDL}Frame$\to$False, MeshStyle$\to$\{Orange, Green\}],\\ \phantom{InD}ParametricPlot[DLP[r, $\varphi$], \{r, 0, 1\}, \{$\varphi$, -$\pi$, $\pi$\},\\ \phantom{InDL}Frame$\to$False, PlotPoints$\to$50, MeshStyle$\to$\{Orange, Green\},\\ \phantom{InDL}AxesOrigin$\to$\{0, 0\}]\}$$

    Снова можно задавать осмысленные функции для раскраски кривой. Например, кривизну. Напомним, что красный соответствует нулю, и цвет меняется в синюю сторону при возрастании.

    $$\tt In[94]:=ClearAll[cur, gg, xx, yy, t];\\ \phantom{In[94]:=}cur[x\_, y\_][t\_] := $\frac{\text{Abs}[D[x[t],t,t] D[y[t],t]-D[y[t],t,t] D[x[t],t]]}{(D[x[t],t]^2+D[y[t]^2)^{3/2}$;\\ \phantom{In[94]:=}xx[t\_] := Log[t] Cos[t]; yy[t\_] := Log[t] Sin[t];\\ \phantom{In[94]:=}gg[t\_] = cur[xx, yy][t];\\ \\ In[98]:=mm = NMaximize[\{gg[t], 0 $\le$ t\}, \{t\}][\!\![l]\!\!]\\ \\ Out[98]=2.65323\\ \\ In[99]:=Plot[gg[t], \{t, 0.1, 2$\pi$\}]$$ $$\tt In[100]:=\\ \phantom{In}ParametricPlot[\{xx[t], yy[t]\}, \{t, 1/2, 7$\pi$\}, PlotStyle$\to$Thick,\\ \phantom{InP}ColorFunction$\to$Function \{x, у, u\}, Hue$\left[\frac{gg[u]}{1.2mm}\right]$],\\ \phantom{InP}ColorFunctionScaling$\to$False$$

    Команды $$\text{\tt ContourPlot}$$ и $$\text{\tt DensityPlot}$$ служат для рисования неявно заданных кривых и функций:

    $$\tt In[101]:=\\ \phantom{In}\{ContourPlot[Cos[x] + Cos[y], \{x, 0, 4Pi\}, \{y, 0, 4Pi\}], \\ \phantom{In\{}ContourPlot[Cos[x] + Cos[y] == 1/2, \{x, 0, 4Pi\}, \{y, 0, 4Pi\}], \\ \phantom{In\{}DensityPlot[Cos[x] + Cos[y], \{x, 0, 4Pi\}, \{y, 0, 4Pi\}]\}$$

    Наконец, $$\text{\tt RegionPlot}$$ изображает области, заданные неравенствами:

    $$\tt In[102]:=\\ \phantom{In}RegionPlot[1/4 $\le$ х\^\,\!2 + (2у)\^\,\!2 $\le$ 1 х + у $\le$ 1/2, \{х, -1, 1\},\\ \phantom{InR}\{у, -1, 1\}, AspectRatio $\to$ Automatic]$$

    Трехмерная графика

    Практически все команды двумерной графики имеют аналоги в трехмерной. Снова рассмотрим сначала простейшую команду рисования графика функции двух переменных $$\text{\tt Plot3D}$$:

    $$\tt In[103]:=Plot3D[уSin[x] + уSin[x], \{x, -$\pi$, $\pi$\}, \{у, -$\pi$, $\pi$\}]$$

    Эта команда порождает графический комплекс с заданными нормалями вершин:

    $$\tt In[104]:=\\ \phantom{In}InputForm[Plot3D[уSin[х] + уSin[х], \{х, -$\pi$, $\pi$\}, \{у, -$\pi$, $\pi$\}]] // \\ \phantom{InI}Short \\ \\ Out[104]=Graphics3D[GraphicsComplex[\{\{<<3>>\},\\ \phantom{Out[104]=Gr}\{<<3>>\}, <<2526>>, \{<<3>>\}\}, <<2>>], \{<<5>>\}] $$

    точнее,

    $$\tt In[105]:=\\ \phantom{In}Plot3D[уSin[x] + ySin[x], \{x, -$\pi$, $\pi$\}, \{у, -$\pi$, $\pi$\},\\ \phantom{InP}PlotStyle$\to$FaceForm[Red, Blue], PlotPoints$\to$2 , Mesh$\to$All,\\ \phantom{InP}MaxRecursion$\to$0]$$ $$\tt In[106]:=\\ \phantom{In}InputForm[Plot3D[уSin[x] + уSin[х], \{х, -$\pi$, $\pi$\}, \{у, -$\pi$, $\pi$\},\\ \phantom{InIn}PlotPoints $\to$ 2, Mesh $\to$ All, PlotStyle $\to$ MaxRecursion $\to$ 0]]\\ \\ Out[106]=\\ \\ \phantom{O}Cruahics3D[\\ \phantom{Ou}GraphicsComplex[\{\{-3.141586370404486, -3.141586370404486, 0.00003947833864787322\},\\ \phantom{OuGr}\{3.141586370404486, -3.141586370404486, -0.00003947833864787322\},\\ \phantom{OuGr}\{-3.141586370404486, 3.141586370404486, -0.00003947833864787322\},\\ \phantom{OuGr}\{3.141586370404486, 3.141586370404486, 0.00003947833864787322\},\\ \phantom{OuGr}\{0., 0., 0.\},\{3.141586370404486, 0., 0.\}, \{0., 3.141586370404486. 0.\},\\ \phantom{OuGr}\{-3.141586370404486, 0., 0.\}, \{0., -3.141586370404486, -0.\},\\ \phantom{OuGr}\{-1.570793185202243, -1.570793185202243, 3.141586370388983\},\\ \phantom{OuGr}\{1.570793185202243, -1.570793185202243, 3.141586370388983\},\\ \phantom{OuGr}\{1.570793185202243, 1.570793185202243, 3.141586370388983\},\\ $$ $$\tt \phantom{OuGr}\{-1.570793185202243, 1.570793185202243, .141586370388983\},\\ \phantom{OuGr}\{3.141586370388983, 1.570793185202243, 0.00001973916932393661\},\\ \phantom{OuGr}\{-1.570793185202243, 3.141586370404486, -6.283172740777966\},\\ \phantom{OuGr}\{-3.141586370404486, -1.570793185200043, 0.00001973916932393661\}\\ \phantom{OuGr}\{1.570793185202243, -3.141586370404486, -6.283172740777966\},\\ \phantom{OuGr}\{-1.570793185202243, -3.141586370404486, 6.283172740777966\},\\ \phantom{OuGr}\{3.141586370404486, -1.570793185202243, -0.000019739169323333333393661\},\\ \phantom{OuGr}\{1.570793185202243, 3.141586370404486, 6.283172740777966\},\\ \phantom{OuGr}\{-3.141586370404486, 1.570793185202243, -0.00001973916932393661\}\}, $$ $$\tt \phantom{OuG}\{\{\{EdgeForm[GrayLevel[0.]], MaxRecursion -> 0,\\ \phantom{OuGrap}GraphicsGroup[\{Polygon[\{\{11,6,5\}, \{14,12,6\}, \{13,8,5\}, \{10,9,5\},\\ \phantom{OuGrapGrap}\{12,7,5\}, \{15,13,7\}, \{8,10,5\}, \{16,10,8\}, \{17,11,9\},\\ \phantom{OuGrapGrap}\{18,10,1\}, \{20,12,4\}, \{13,15,3\}, \{11,17,2\}, \{10,18,9\},\\ \phantom{OuGrapGrap}\{12,14,2\}, \{20,12,4\}, \{13,15,3\}, \{11,17,2\}, \{10,18,9\}\\ \phantom{OuGrapGrap}\{11,19,6\}, \{10,16,1\}, \{12,20,7\}, \{13,21,8\}\}]\}]\}, \{\},\{\},\{\},\{\}\}\},\\ $$ $$\tt \phantom{OuG}VertexNormals -> \{\{-0.9875704433539252, 1.975144837054073*\^\,\!-6, 0.1571770320683985\},\\ \phantom{OuGra}\{-0.9875704433539252, -1.975144837054073*\^\,\!-6, 0.1571770320683985\},\\ \phantom{OuGra}\{0.9875704433539252, 1.975144837054073*\^\,\!-6, 0.1571770320683985\},\\ \phantom{OuGra}\{0.9875704433539252, -1.975144837054073*\^\,\!-6, 0.1571770320683985\},\\ \phantom{OuGra}\{0., 0., 1,\}, \{0., -0.000012566370613478698, 0.9999999999210432\},\\ \phantom{OuGra}\{0.9875704433563331, 0., 0.15717703206567918\},\\ \phantom{OuGra}\{0., 0.000012566370613478698, 0.9999999999210432\},\\ \phantom{OuGra}\{0.9875704433563331, 0., 0.15717703206567918\},\\ \phantom{OuGra}\{4.413812442766295*\^\,\!-6, 0.8944271909903205, 0.44721359549736717\},\\ \phantom{OuGra}\{4.413812442766295*\^\,\!-6, -0.8944271909903205, 0.44721359549736717\},\\ \phantom{OuGra}\{-4.413812442766295*\^\,\!-6, -0.8944271909903205, 0.44721359549736717\},\\ \phantom{OuGra}\{-4.413812442766295*\^\,\!-6, 0.8944271909903205, 0.44721359549736717\},\\ $$ $$\tt \phantom{OuGra}\{0.952890338648335, -3.811568977840421*\^\,\!-6, 0.30331502187681625\},\\ \phantom{OuGra}\{-8.827624885274624*\^\,\!-6, 0.894427190964183, 0.4472135954829845\},\\ \phantom{OuGra}\{-0.952890338648335, 3.811568977840421*\^\,\!-6, 0.30331502187681625\},\\ \phantom{OuGra}\{8.827624885274624*\^\,\!-6, -0.894427190964183, 0.44721359548429548\},\\ \phantom{OuGra}\{8.827624885274624*\^\,\!-6, 0.894427190964183, 0.44721359548429548\},\\ \phantom{OuGra}\{-0.952890338648335, -3.811568977840421*\^\,\!-6, 0.30331502187681625\},\\ \phantom{OuGra}\{-8.827624885274624*\^\,\!-6, -0.894427190964183, 0.44721359548429548\},\\ \phantom{OuGra}\{0.952890338648335, 3.811568977840421*\^\,\!-6, 0.30331502187681625\},\\ \phantom{Ou}{Axes -> True, BoxRatios -> {1, 1, 0.4}, Method -> {"RotationControl"\ \!\!\!\! -> "Globe"\ \!\!\!\!\},\\ \phantom{OuG}PlotRange -> \{\{Pi, Pi\}, \{-Pi, Pi\}, \{-6.283172740777966, 6.283172740777966\}\},\\ \phantom{OuG}PlotRangePadding -> \{Scaled[0.02], Scaled[0.02], Scaled[0.02]\}\}]$$

    Снова можно пользоваться стандартными опциями трехмерной графики, снова есть $$\text{\tt PlotStyle}$$ для директив. Из новых опций обратим внимание на $$\text{\tt BoundaryStyle}$$ (приписывается графическая директива, описывающая граничную линию), $$\text{\tt Exclusions}$$ и $$\text{\tt ExclusionStyle}$$ (исключение части рисунка, заданной условием, и способ прорисовки ограничивающей линии), $$\text{\tt RegionFunction}$$ (задание области рисунка с помощью функции от стандартного набора переменных), $$\text{\tt MeshFunction}$$ (приписывается функция или функции, линии уровня которых задают координатные линии на поверхности), $$\text{\tt Mesh}$$ (приписывается количество этих линий):

    $$\tt In[107]:=\\ \phantom{In}Plot3D[уSin[х] + уSin[х], \{х, -$\pi$, $\pi$\}, \{у, -$\pi$, $\pi$\},\\ \phantom{InP}MeshFunctions $\to$ \{\#3 \\}, MeshStyle $\to$ \{Orange\},\\ \phantom{InP}PlotStyle $\to$ FaceForm[Directive[Red, Specularity[White, 2]],\\ \phantom{InPlo}Blue], BoundaryStyle $\to$ \{Thick, Red\}]$$ $$\tt In[108]:=\\ \phantom{In}Plot3D[ySin[x] + ySin[x], \{x, -$\pi$, $\pi$ \}, \{у, -$\pi$, $\pi$\},\\ \phantom{InP}PlotStyle $\to$ FaceForm[Directive[Red, Specularity[White, 2]],\\ \phantom{InPPl}Blue], BoundaryStyle $\to$ \{Thick, Red\},\\ \phantom{InP}MeshFunctions $\to$ \{(\#1$^2$ + \#2$^2$) \\}, Mesh $\to$ 5,\\ \phantom{InP}RegionFunction $\to$ Function[\{x, у, z\}, 1/2 < x$^2$ + у$^2$ > 3]] $$

    Из других команд отметим прежде всего команды, позволяющие рисовать параметрически заданные поверхности и кривые ($$\text{\tt ParamrtricPlot3D}$$ и ее частные случаи $$\text{\tt RevolutionPlot3D}$$ и $$\text{\tt SphericalPlot3D}$$), неявно заданные поверхности ($$\text{\tt ContourPlot3D}$$), трехмерные области, заданные неравенствами ($$\text{\tt RegionPlot3D}$$), а также трехмерные рисовалки дискретных данных, такие как $$\text{\tt ListPlot3D, ListPointPlot3D, ListSurfacePlot3D}$$.

    В качестве примера рассмотрим знаменитую поверхность Боя - параметризацию проективной плоскости. Явные формулы взяты из задачника А. С. Мищенко, Ю. П. Соловьева, А. Т. Фоменко [5].

    $$\tt In[109]:=\\ \phantom{In}ClearAll[x, y, z, $\theta$, $\varphi$, f1, f2, f3, r];\\ \phantom{In}f1=[$\theta$\_, $\varphi$\_] :=\\ \phantom{Inf1}$\frac12$((2x$^2$ - y$^2$ - z$^2$)(x$^2$ + y$^2$ + z$^2$) + 2yz(y$^2$-z$^2$) + zx(x$^2$ - z$^2$) +\\ \phantom{In$\frac12$((}xy(y$^2$ - x$^2$)) /. \{x $\to$ Cos[$\theta$] Cos[$\varphi$], y $\to$ Cos[$\theta$]Sin[$\varphi$],\\ \phantom{In$\frac12$}z $\to$ Sin[$\theta$]\};\\ \phantom{In}f2[$\theta$\_, $\varphi$\_] :=\\ \phantom{Inf2}$\frac{\sqrt{3}}{2}$((y$^2$ - z$^2$) (x$^2$ + y$^2$ + z$^2$) + zx(z$^2$ - x$^2$) + xy(y$^2$ - x$^2$)) /.\\ \phantom{Inf2[}\{x $\to$ Cos[$\theta$] Cos[$\varphi$], y $\to$ Cos[$\theta$] Sin[$\varphi$], z $\to$ Sin[$\theta$]\};\\ \phantom{In}f3[$\theta$\_, $\varphi$\_] := (x + y + z) ((x + y + z)$^3$ + 4(y-x) (z-y) (x-z)) /.\\ \phantom{Inf3[}\{x $\to$ Cos[$\theta$ Cos[$\varphi$], y $\to$ Cos[$\theta$]Sin[$\varphi$], z $\to$ Sin[$\theta$]\};\\ \phantom{In}r[$\theta$\_, $\varphi$\_] := \{f1[$\theta$, $\varphi$], f2[$\theta$, $\varphi$], 0.1f3[$\theta$, $\varphi$]\};$$

    Сначала нарисуем эту сложную самопересекающуюся поверхность, разрезая ее на горизонтальные слои и выбрасывая каждый второй, чтобы можно было лучше рассмотреть самопересечения. Это делается с помощью опций $$\text{\tt MeshFunctions}$$ (устанавливается в функцию от стандартных переменных), $$\text{\tt MeshShading}$$ (определяет, что рисовать между $$\text{\tt Mesh}$$ - линиями, присваивается список (списки) циклически повторяющихся директив; $$\text{\tt None}$$ соответствует "ничего не рисованию") и $$\text{\tt Mesh}$$ или количество равномерно распределенных линий, или явные значения $$\text{\tt MeshFunction}$$.

    $$\tt In[114]:=\\ \phantom{In}ParametricPlot3D[r[$\theta$, $\varphi$], \{$\theta$, -$\pi$/2, $\pi$/2\}, \{$\varphi$, 0, $\pi$\},\\ \phantom{InP}MeshFunctions $\to$ \{\#3 \\},\\ \phantom{InP}MeshShading $\to$ \phantom{InPa}\{Directive[\{Orange, Opacity[0.9], Specularity[White, 2]\}],\\ \phantom{InPar}None\}, PlotPoints $\to$ 30,\\ \phantom{InP}Mesh $\to$ \{\{-0.05, 0.05, 0.1, 0.2, 0.3, 0.4\}\}]$$

    Выделить наиболее сложный фрагмент поверхности можно с помощью опции $$\text{\tt RegionFunction}$$:

    $$\tt In[115]:=\\ \phantom{In}ParametricPlot3D[r[$\theta$, $\varphi$], \{$\theta$, -$\pi$/2, $\pi$/2\}, \{$\varphi$, 0, $\pi$ \},\\ \phantom{InP}PlotStyle $\to$ Directive[\{Orange, Opacity[0.9]\}], Mesh $\to$ None, \\ \phantom{InP}PlotPoints $\to$ 30,\\ \phantom{InP}RegionFunction $\to$ Function[\{x, у, z\}, 0.05 < z < 0.2], \\ \phantom{InP}Boxed $\to$ False, Axes $\to$ None]$$

    Координатные линии на поверхности, соответствующие параметризации, можно увидеть, сменив $$\text{\tt MeshFunctions}$$. Заодно разрежем поверхность в шахматном порядке:

    $$\tt In[116]: = \phantom{In}ParametricPlot3D[r[$\theta$, $\varphi$], \{$\theta$, -$\pi$/2, $\pi$/2\}, \{$\varphi$, 0, $\pi$\},\\ \phantom{InP}MeshFunctions $\to$ \{\#4 \, \#5 \\},\\ \phantom{InP}MeshShading $\to$ \phantom{InPa}\{\{Directive[\{Orange, Opacity[0.9], Specularity[White, 2]\}],\\ \phantom{InPara}None\},\\ \phantom{InPar}\{None, Directive[$\setminus$\{Orange, Opacity[0.9],\\ \phantom{InParame}Specularity[White, 2]\}]\}\}, PlotPoints $\to$ 30,\\ \phantom{InP}PlotStyle $\to$ \{Opacity[0.5]\},\\ \phantom{InP}MeshStyle $\to$ \{\{Thick, Red\}, \{Thick, Brown\}\}]$$

    Наконец, чтобы лучше себе представить параметризацию, выбросим края параметризующего прямоугольника. Граница выделяется с помощью опции $$\text{\tt BoundaryStyle}$$:

    $$\tt In[117]:=\\ \phantom{In}ParametricPlot3D[r[$\theta$, $\varphi$], \{$\theta$, -$\pi$/2 + 0.1, $\pi$/2 - 0.1\}, \\ \phantom{InP}\{$\varphi$, 0.1, $\pi$ - 0.1\}, MeshFunctions $\to$ \{\#4 \, \#5 \\}, PlotPoints $\to$ 30,\\ \phantom{InP}PlotStyle $\to$ \{Orange, Opacity[0.9], Specularity[White, 2]\},\\ \phantom{InP}BoundaryStyle $\to$ \{Red, Thick\}]$$

    Нарисуем теперь отдельно вырезанный фрагмент. Каждый кусочек нарисуем отдельно, не выводя на экран, не забыв сделать одинаковыми изображаемые области с помощью $$\text{\tt PlotRange}$$:

    $$\tt In[118]:=\\ \phantom{In}gr=\{ParametricPlot3D[r[$\theta$, $\varphi$], \{$\theta$, - $\pi$/2, - $\pi$/2 + 0.1\},\\ \phantom{Ingr=}\{$\varphi$, 0, $\pi$\}, BoundaryStyle $\to$ \{Red, Thick\}, Mesh $\to$ None,\\ \phantom{Ingr=}PlotRange $\to$ 1.2], ParametricPlot3D[r[$\theta$, $\varphi$],\\ \phantom{Ingr=}\{$\theta$, $\pi$/2 - 0.1, $\pi$/2\}, \{$\varphi$, 0, $\pi$\}, BoundaryStyle $\to$ \{Red, Thick\},\\ \phantom{Ingr=}Mesh $\to$ None, PlotRange $\to$ 1.2],\\ \phantom{Ingr}ParametricPlot3D[r[$\theta$, $\varphi$], \{$\theta$, - $\pi$/2, $\pi$/2\}, \{$\varphi$, 0, 0.1\},\\ \phantom{Ingr=}BoundaryStyle $\to$ \{Red, Thick\}, Mesh $\to$ None, PlotRange $\to$ 1.2],\\ \phantom{Ingr}ParametricPlot3D[r[$\theta$, $\varphi$], \{$\theta$, -$\pi$/2, $\pi$/2\}, \{$\varphi$, $\pi$ - 0.1, $\pi$\},\\ \phantom{Ingr=}BoundaryStyle $\to$ \{Red, Thick\}, Mesh $\to$ None, PlotRange $\to$ 1.2]\};$$

    А теперь посмотрим все сразу с помощью $$\text{\tt Show}$$ и, окончательно, увидим лист Мебиуса, заклеивающий границу диска:

    $$\tt In[119]:=Show[gr]$$

    Покажем теперь, как можно раскрасить поверхность в соответствии с ее гауссовой кривизной. Сначала вычислим кривизну:

    $$ In[120]:=\\ \phantom{In}ClearAll[r, к, u, v, norm, iiForm];\\ \phantom{In}iForm[r\_][u\_, v\_] := Module[\{ru, rv\},\\ \phantom{IniFo}ru = D[r[u, v], u]; rv = D[r[u, v], v];\\ \phantom{IniFo}$\begin{pmatrix} ru.ru ru.rv \\ ru.rv rv.rv \\ \end{pmatrix}$\\ \phantom{IniF}];\\ \phantom{In}norm[r\_][u\_, v\_] := Module[\{ru, rv, nn\},\\ \phantom{Innor}ru = D[r[u, v], u]; rv = D [r[u, v], v]; nn = Cross[ru, rv];\\ \phantom{Innor}$\frac{nn}{\sqrt{nn.nn}}$\\ \phantom{Inno}];\\ \phantom{In}iiForm[r\_][u\_, v\_] := Module[\{ruu, ruv, rw, n\},\\ \phantom{IniiF}n = norm[r][u, v];\\ \phantom{IniiF}ruu = D [r[u, v], u, u]; ruv = D[r[u, v], u, v];\\ \phantom{IniiF}rvv = D [r[u, v], v, v];\\ \phantom{IniiF}$\begin{pmatrix} ruu.n ruv.n \\ ruv.n rw.n \end{pmatrix}$\\ \phantom{Inii}];\\ \phantom{In}k[r\_][u\_, v\_] := $\frac{\text{Det}[\text{iiForm}[r][u,v]]}{\text{Det}[\text{iForm}[r][u,v]]}$; $$

    Параметризуем тор:

    $$\tt In[125]:=\\ \phantom{In}ClearAll[R, r, $\varphi$, $\psi$, torus, g, kMax, kMin, kRescaled];\\ \phantom{In}res=$\begin{pmatrix} \text{Cos}[\varphi] \text{-Sin}[\varphi] 0\\ \text{Sin}[\varphi] \text{Cos}[\varphi] 0\\ 001 \end{pmatrix}$.(\{0, R, 0\} + \{0, rCos[$\psi$], rSin[$\psi$]\})\\ \phantom{Inres}Simplify;\\ \phantom{In}R = 3; r = 1; \\ \phantom{In}torus[$\varphi$\_, $\psi$\_] := \{-(R + rCos[$\psi$]) Sin[$\varphi$], Cos[$\varphi$](R + rCos[$\psi$]),\\ \phantom{Inres}RSin[$\psi$]\}; \end{pmatrix}$$

    Масштабируем кривизну так, чтобы она принимала значения от 1 до 1/2:

    $$\tt In[129]:=g[u\_, v\_]=k[torus][u, v] // Simplify;\\ \phantom{In[129]:=}kMax = Maximize[g[u, v], \{u, v\}][\!\![1]\!\!];\\ \phantom{In[129]:=}kMin = Minimize[g[u, v], \{u, v\}][\!\![1]\!\!];\\ \\ In[132]:=kRescaled[u\_, v\_] := $\frac{g[u,v]\text{-kMin}}{1.2(\text{kMax-kMin})}$; $$

    Теперь раскрашиваем тор с помощью ColorFunction:

    $$\tt In[133]:=ParametricPlot3D[torus[$\varphi$, $\psi$], \{$\varphi$, 0, 2$\pi$\}, \{$\psi$, 0, 2$\pi$\},\\ \phantom{In[133]:=P}Boxed $\to$ False, Axes $\to$ False,\\ \phantom{In[133]:=P}ColorFunction $\to$ Function[\{x, y, z, u, v\},\\ \phantom{In[133]:=PCo}Hue[kRescaledfu, v]]], ColorFunctionScaling $\to$ False,\\ \phantom{In[133]:=P}Mesh $\to$ None]$$

    или седловую поверхность:

    $$\tt In[134]:=\\ \phantom{In}sadd[x\_, y\_] := \{x, y, x$^2^ - y$^2$};\\ \phantom{In}kM[x\_, y\_] := k[sadd][x, y] // Simplify;\\ \phantom{In}kMax = Maximize[kM[u, v], u$^2$ + v$^2$ $\le$ 2, \{u, v\}][\!\![1]\!\!];\\ \phantom{In}kMin = Minimize[kM[u, v], \{u, v\}][\!\![1]\!\!];\\ \phantom{In}kRes[u\_, v\_]=$\frac{\text{kM}[u,v]-\text{kMin}}{1.4 (\text{kMax-kMin})}$;\\ \phantom{InP}ParametricPlot3D[sadd[x, y], \{x, -2, 2\}, \{y, -2, 2\},\\ \phantom{InP}Boxed $\to$ False, Axes $\to$ False,\\ \phantom{InP}RegionFunction $\to$ Function[\{x, у, z, u, v\}, (x$^2$ + y$^2$ < 1/2)],\\ \phantom{InP}ColorFunction $\to$ Function[\{x, y, z, u, v\}, Hue[kRes[х, y]]],\\ \phantom{InP}ColorFunctionScaling $\to$ False, Mesh $\to$ False,\\ \phantom{InP}BoundaryStyle $\to$ \{Thick, Blue\}]$$

    Поверхности уровня удобно рисовать с помощью $$\text{\tt ContourPlot3D}$$, в аргументах которой указывается функция, интервалы значения переменных, какие (или сколько именно) значения функции рисовать ($$\text{\tt Contours}$$ приписывается количество значений или их список), директивы, описывающие, как именно рисовать поверхности ($$\text{\tt ConourStyle}$$ приписывается список директив)):

    $$\tt In[140]:=\\ \phantom{In}ContourPlot3D[x$^2$ + у$^2$ - z$^2$, \{x, -2, 2\}, \{у, -2, 2\}, \{z, -2, 2\},\\ \phantom{InC}Contours $\to$ \{-1, 0, 1\},\\ \phantom{InC}ContourStyle $\to$ Мар[\{\#, Opacity[0.5]\} \, \{Blue, Red, Yellow\}],\\ \phantom{InC}Mesh $\to$ None, RegionFunction $\to$ (\#1$^2$ + \#2$^2$ < 2 \)] $$

    Следующие команды $$\text{\tt ListPlot3D, ListPointPlot3D, ListSurfacePlot3D}$$ служат для визуализации дискретных наборов чисел:

    $$\tt In[141]:=\{ListPlot3D[\{\{l, 2, 3, 4\}, \{1, 1, 1, 1\}, \{4, 3, 2, 1\},\\ \phantom{In[141]:=\{Li}\{4, 4, 4, 4\}\}, Mesh $\to$ All],\\ \phantom{In[141]:=\{}ListPlot3D[\{\{l, 2, 3, 4\}, \{1, 1, 1, 1\}, \{4, 3, 2, 1\},\\ \phantom{In[141]:=\{Li}\{4, 4, 4, 4\}\}, Mesh $\to$ None, InterpolationOrder $\to$ 0],\\ \phantom{In[141]:=\{}ListPlot3D[\{\{l, 2, 3, 4\}, \{1, 1, 1, 1\}, \{4, 3, 2, 1\},\\ \phantom{In[141]:=\{Li}\{4, 4, 4, 4\}\}, Mesh $\to$ None, InterpolationOrder $\to$ 3]\}$$ $$\tt In[142]:=\\ \phantom{In}\{ListPointPlot3D[Table[i$^2$ - j$^2$, \{i, -1, 1, 0.1\},\\ \phantom{In\{Li}\{j, -1, 1, 0.1\}]],\\ \phantom{In\{}ListPointPlot3D[Table[i$^2$ - j$^2$, \{i, -1, 1, 0.1\}, \{j, -1, 1, 0.1\}],\\ \phantom{In\{L}Filling $\to$ Bottom]\}$$

    Наконец, $$\text{\tt ListSurfacePlot3D}$$ служит для визуализации набора точек в пространстве:

    $$\tt In[143]:=\\ \phantom{In}ListSurfacePlot3D[\\ \phantom{InL}Flatten[Table[\{i, j, i$^2$ - j$^2$\}, \{i, -1, 1, 0.1\}, \{j, -1, 1, 0.1\}],\\ \phantom{InLi}1]]$$

    а команда $$\text{\tt RegionPlot3D}$$ - для изображения множеств, заданных неравенствами:

    $$\tt In[144]:=RegionPlot3D[-1$\le$х$\le$1 \\ -1$\le$у$\le$1 \\ -0.2$\le$z$\le$0.2 \\\\ \phantom{In[144]:=Re}Not[-1/2$\le$х$\le$1/2 \\ -1/2$\le$у$\le$1/2], \{х, -2, 2\},\\ \phantom{In[144]:=R}\{у, -2, 2\}, \{z, -2, 2\}, Mesh $\to$ None, PlotPoints $\to$ 50,\\ \phantom{In[144]:=R}Axes $\to$ None, Boxed $\to$ False, PlotStyle $\to$ \{Pink\}]$$
    Страницы:

    В $$Mathematica$$ существует всего два основных типа графических объектов: $$\text{\tt Graphics}$$ и $$\text{\tt Graphics3D}$$. Имеется ДВА ОСНОВНЫХ СПОСОБА создавать графические объекты. Первый способ (и на самом деле основной) предназначен для создания графики, состоящей из набора простых графических элементов (так называемых примитивов), которые описываются явно (скажем, точки задаются своими координатами, сфера - своими центром и радиусом). При использовании второго способа соответствующие примитивы порождаются самим пакетом исходя из заданной функции, списка или другого объекта, подлежащего визуализации, с помощью специальных команд, таких как $$\text{\tt Plot, ParametricPlot}$$ и т. п.

    Изображение графических примитивов

    Общий формат команды, изображающей на экране графические объекты, составленные из примитивов, таков:

    $$\tt Graphics[< primitives >, < options >] (* для 2-мерной графики *) Graphics3D[< primitives >, < options >](* для 3-мерной графики *) $$

    Например,

    $$\tt In[1]:=Graphics[Circle[]] \\ \phantom{In[1]:=}Graphics3D[Sphere[]] \\ \phantom{In[1]:=}g=Graphics[Disk[]]; $$

    Отметим, что точка с запятой после команды, как и положено, подавляет вывод на экран, хотя операция все равно выполняется и ее результат сохраняется. Увидеть полученное можно обратившись к результату операции:

    $$\tt In[4]:=g$$

    Двумерные примитивы

    Список основных двумерных примитивов

    Вот список основных двумерных графических примитивов (элементарных кирпичиков, из которых складывается любая картинка) в алфавитном порядке (напомним, что (* комментарии *) обрамляются скобками со звездочками):

    $$\tt In[5]:=Graphics[\{Arrow[\{\{0, 0\}, \{1, 1\}\}], \\ \phantom{In[5]:=Graphics[\{}Arrow[\{\{0, 1\}, \{0, ?\}, \{1/2, 1/3\}, \{1, 0\}\}], \\ \phantom{In[5]:=Gr}(* Стрелка, прямая или ломаная, \\ \phantom{In[5]:=Gr}заданная набором своих последовательных вершин \\ \phantom{In[5]:=Gra}(точнее - их координат) *) \\ \phantom{In[5]:=Graphics[\{}Circle [{1/2, 1/2}, 1/3], (*окружность, \\ \phantom{In[5]:=Gr}заданная своим центром и радиусом *)\} \\ \phantom{In[5]:=Graphics[\{}Disk [\{1/2, 1/2\}, 1/9], (* заполненный диск, \\ \phantom{In[5]:=Gr}заданный своим центром и радиусом *) \\ \phantom{In[5]:=Graphics[\{}Line[\{\{l/3, 1\}, \{2/3, 1\}\}], $$ $$\tt \phantom{In[5]:=Gr}Line[\{\{l/3, 8/9\}, \{2/3, 8/9\}, \{4/5, 1\}, \{7/8, 1\}, \\ \phantom{In[5]:=Grap}\{1/3, 8/9\}\}], (* Отрезок или ломаная линия, \\ \phantom{In[5]:=Gr}заданные координатами своих последовательных вершин, \\ \phantom{In[5]:=Gr}Listable *) \\ \phantom{In[5]:=Graphics[\{}Point[\{1, 1/2\}], (* точка, \\ \phantom{In[5]:=Gr}заданная своими координатами, Listable *) \\ \\ $$ $$\tt \phantom{In[5]:=Gr}Polygon[\{\{l/3, 2/9\}, \{2/3, 2/9\}, \{4/5, 0\}, \{7/8, 0\}, \\ \phantom{In[5]:=GrPo}\{1/3, 2/9\}\}], (*заполненный многоугольник, \\ \phantom{In[5]:=Gr}заданный координатами последовательных вершин*)\} \\ \phantom{In[5]:=Gr}Rectangle [\{0, 1/10\}, \{3/10, 2/10\}], (* прямоугольник, \\ \phantom{In[5]:=Gr}заданный левой нижней и правой верхней вершинами*) \\ \phantom{In[5]:=Gr}Text["На этой картинке очень много всего", \{1, 1/2\}] \\ \phantom{In[5]:=Gr}(* текст, центрованный в заданной точке *)\} \\ \phantom{In[5]:=G}\}]$$

    Конечно, такая картинка сложна для восприятия. Хочется добавить цвета, изменить толщину линий и прочее. Имеется две возможности менять вид рисунка вообще и графических примитивов в частности. Первый способ связан с использованием опций ($$\text{\tt Options}$$), которые влияют на рисунок в целом. Мы поговорим о них потом, а сейчас займемся вторым способом, использующим так называемые графические директивы ($$\text{\tt Directives}$$). Каждая директива оказывает действие на следующие за ней примитивы в списке:

    $$\tt In[6]:=Graphics [\{Red, Arrow[\{\{0, 0\}, \{1, 1\}\}], (* Red, очевидно, \\ \phantom{In[6]:=Gr}делает последующий вывод красным *) \\ \phantom{In[6]:=Graphics [\{}Arrow[\{\{0, 1\}, \{0, 1/2\}, \{1/2, 1/3\}, \{1, 0\}\}], \\ \phantom{In[6]:=Graphics [\{}Circle[\{l/2, 1/2\}, 1/3], \\ \phantom{In[6]:=Graphics [\{}Disk [\{1/2, 1/2\}, 1/9], \\ \phantom{In[6]:=Graphics [\{}Green, Line[\{\{l/3, 1\}, \{2/3, 1\}\}], \\ \phantom{In[6]:=Gr}(*Green - зелёным*) \\ \\ \phantom{In[6]:=Gr}Line[\{\{l/3, 8/9\}, \{2/3, 8/9\}, \{4/5, 1\}, \{7/8, 1\}, \\ \phantom{In[6]:=Grap}\{1/3, 8/9\}\}], \\ \phantom{In[6]:=Graphics [\{}Point[\{1, 1/2\}], \\ \\ \phantom{In[6]:=Gr}Polygon[\{\{l/3, 2/9\}, \{2/3, 2/9\}, \{4/5, 0\}, \{7/8, 0\}, \\ \phantom{In[6]:=Grap}\{1/3, 2/9\}\}], \\ \phantom{In[6]:=Gr}Rectangle[\{0, 1/10\}, \{3/10, 2/10\}], \\ \phantom{In[6]:=Gr}Text["На этой картинке очень много всего"\, \{1, 1/2\}] \\ \phantom{In[6]:=G}\}]$$

    Можно ограничивать действие директивы, организуя примитивы в несколько подсписков:

    $$\tt In[7]:=Graphics[\{\{Red, Arrow[\{\{0, 0\}, \{1, 1\}\}], \\ \phantom{In[7]:=Graphics[\{}Dashing[0.05], \\ \phantom{In[7]:=Gra}Arrow[\{\{0, 1\}, \{0, 1/2\}, \{1/2, 1/3\}, \{1, 0\}\}]\}, \\ \phantom{In[7]:=Graphics[\{}Circle[\{l /2, 1/2\}, 1/3], \\ \phantom{In[7]:=Graphics[\{}\{Green, Disk [\{1/2, 1/2\}, 1/9]\}, \\ \phantom{In[7]:=Graphics[\{}\{Yellow, Line[\{\{l/3, 1\}, \{2/3, 1\}\}]\}, $$ $$\tt \phantom{In[7]:=Gr}\{Thick, Line[\{\{l/3, 8/9\}, \{2/3, 8/9\}, \{4/5, 1\}, \\ \phantom{In[7]:=Graph}\{7/8, 1\}, \{1/3, 8/9\}\}]\}, \\ \phantom{In[7]:=Gr}(*Thick указывает на толщину линии*) \\ \phantom{In[7]:=Graphics[\{}\{PointSize[0.1], Red, Point[\{1, 1 /2\}]\}, \\ \phantom{In[7]:=Gr}(* PointSize на относительный размер точки *) \\ \phantom{In[7]:=Graphics[\{}\{Opacity[0.65], EdgeForm[\{Blue, Thick\}], \\ \phantom{In[7]:=Gra}FaceForm[Yellow], (* Прозрачность, \\ \phantom{In[7]:=Gra}св-ва граничной ломаной и заполнения*) \\ \phantom{In[7]:=Gra}Роlуgon[\{\{1/3, 2/9\}, \{2/3, 2/9\}, \{4/5, 0\}, \{7/8, 0\}, \\ \phantom{In[7]:=Graph}\{1/3, 2/9\}\}]\}, \\ \phantom{In[7]:=Gr}Rectangle[\{0, 1 /10\}, \{3/10, 2/10\}], \\ \phantom{In[7]:=Gr}\{Text["Тут очень много всего"\, {1, 1/2}]\} \\ \phantom{In[7]:=G}\}]$$

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

    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\}]$$

    Директивы

    Директивы непосредственного управления цветом

    В $$Mathematica$$ цвет задается разными способами. Кроме названий стандартных цветов и четырех основных оттенков серого (тут мы пользуемся упомянутым выше примитивом $$\text{\tt Raster}$$ )

    $$\tt In[27]:=\\ \phantom{In}colors = \{Red, Green, Blue, Cyan, Magenta, Yellow, Brown,\\ \phantom{Incol}Orange, Pink, Purple,\\ \phantom{Incol}LightRed, LightGreen, LightBlue, LightCyan, LightMagenta,\\ \phantom{Incol}LightYellow, LightBrown, LightOrange, LightPink,\\ \phantom{Incol}LightPurple\}; \\ \phantom{In}cl = Partition[Map[Apply[List, \#] , colors], 10];\\ \phantom{In}Graphics[Raster[cl]]$$ $$ In[30]:=Graphics[Raster[{Map[\#[\!\![1]\!\!] , \{Black, White, Gray, LightGray\}]\}]] $$

    которыми мы уже пользовались выше, есть возможность задавать цвет в форматах $$\text{\tt RGB, CMYK, Hue}$$ и, кроме того, $$\text{\tt GrayLevel}$$ для оттенков серого. В первых двух результирующий цвет представлен как сумма монохромных слагаемых ($$\text{\tt Red}$$ - красный, $$\text{\tt Green}$$ - зеленый, $$\text{\tt Blue}$$ - синий) и ($$\text{\tt Cyan}$$ - голубой, $$\text{\tt Magenta}$$ - фиолетовый, $$\text{\tt Yellow}$$ - желтый, $$\text{\tt blacK}$$ - черный), принимающих значения от нуля до единицы, что проиллюстрировано в следующих примерах:

    $$\tt In[31]:= \phantom{In}Manipulate[\\ \phantom{InM}Graphics[\{RGBColor[r, g, b], Rectangle[\{0, 0\}, \{1, 1/3\}]\}],\\ \phantom{InM}\{r, 0, 1, Appearance $\to$ "Labeled"\ \!\!\!\!\!\! \},\\ \phantom{InM}\{g, 0, 1, Appearance $\to$ "Labeled"\ \!\!\!\!\!\! \},\\ \phantom{InM}\{b, 0, 1, Appearance $\to$ "Labeled"\ \!\!\!\!\!\! \}]$$ $$\tt In[32]:=\\ \phantom{In}Manipulate[\\ \phantom{InM}Graphics[\{CMYKColor[c, m, y, k], Rectangle [\{0, 0\}, \{1, 1/3\}]\}],\\ \phantom{InM}\{c, 0, 1, Appearance $\to$ "Labeled"\ \!\!\!\!\!\! \},\\ \phantom{InM}\{m, 0, 1, Appearance $\to$ "Labeled"\ \!\!\!\!\!\! \},\\ \phantom{InM}\{m, 0, 1, Appearance $\to$ "Labeled"\ \!\!\!\!\!\! \},\\ \phantom{InM}\{k, 0, 1, Appearance $\to$ "Labeled"\ \!\!\!\!\!\! \}]$$

    Управление с помощью функции $$\text{\tt Hue}$$ может быть как однопараметрическим (от красного к фиолетовому и обратно), так и трех- и четырех параметрическим ($$\text{\tt Hue, Saturation, Brightness, Opacity}$$ ):

    $$ In[33]:=\\ \phantom{In}Manipulate[Graphics[\{Hue[t], Rectangle[\{0, 0\}, \{1, 1/3\}]\}],\\ \phantom{InM}\{t, 0, 2, Appearance $\to$ "Labeled"\ \!\!\!\!\!\! \}]$$ $$\tt In[34]:=\\ \phantom{In}Craphics[Table[\{Hue[h], Edgeform[Gray], Rectangle[\{32h, 0\}]\},\\ \phantom{InGr}\{h, 0, 1, 1/32\}]]$$

    Также однопараметрически оттенки серого задаются с помощью функции $$\text{\tt GrayLevel}$$:

    $$\tt In[35]:=Manipulate[\\ \phantom{In[35]:=M}Graphics[\{GrayLevel[t], Rectangle[\{0, 0\}, \{1, 1/3\}]\}],\\ \phantom{In[35]:=M}\{t, 0, 1\}]$$

    Директивы, управляющие размерами. Абсолютные и относительные характеристики

    Pазмеры составляющих рисунок примитивов можно задавать как в абсолютных единицах, так и в относительных. Абсолютная единица размера точки равна 1/72 дюйма (т. е. та самая точка - $$\text{\tt point}$$ старого матричного принтера). Относительная единица - это доля от размера рисунка.

    Размер точки

    $$\tt In[36]:=Graphics[ \phantom{In[35]:=G}Table[\{Hue[1/i], AbsolutePointSize[i], Point[\{i,0\}]\},\\ \phantom{In[35]:=MT}\{i, 1, 20\}]]$$ $$\tt In[37]:=\\ \phantom{In}Graphics[Table[\{PointSize[1/2^{i-1}], Hue[1/i], Point[\{0, 0\}]\},\\ \phantom{InGr}\{i, 1, 5\}]]$$

    Сплошная или пунктирная линия, размер черточек и пробелов

    Директива $$\text{\tt AbsoluteDashing[\{d1, d2, ..\}]}$$ - последующие линии рисуются пунктиром с циклически повторяющимися интервалами абсолютных длин $$\text{\tt d1, d2, ...}$$, видимо, в пикселях. Директива $$\text{\tt Dashing[\{d1, d2, ..\}]}$$ - то же, но размеры в долях ширины всей картинки.

    Чтобы почувствовать разницу между $$\text{\tt AbsoluteDashing}$$ и просто $$\text{\tt Dashing}$$, полезно поменять мышкой размер рисунка. При этом не меняется длина абсолютных $$\text{\tt dash}$$-ей (большая окружность и отрезок, идущий вправо вверх) и количество относительных $$\text{\tt dash}$$-ей (все остальные линии).

    $$\tt In[38]:=\\ \phantom{In}Graphics[\{AbsoluteDashing[\{1, 5, 10\}], Line[\{\{0, 0\}, \{1, 1\}\}],\\ \phantom{InGr}Circle[], Dashing[\{.1, .2\}], Line[\{\{0, 0\}, \{1, -1\}\}],\\ \phantom{InGr}Circle[\{0, 0\}, 1/2]\}]$$

    Возможны сокращенные версии этих абсолютных директив: $$\text{\tt Dotted, Dashed, DotDashed}$$:

    $$\tt In[39]:=\\ \phantom{In}Graphics[\{Dotted, Line[\{\{0, 0\}, \{1, 1\}\}], Dashed, Circle[],\\ \phantom{InGr}DotDashed, Line[\{\{0, 0\}, \{1, -1\}\}]\}]$$

    Толщина линии Аналогично, имеются команды, управляющие толщиной линии:

    $$\tt In[40]:=AbsoluteThickness[r](*абсолютная толщина*) \\ \phantom{In[40]:=}Thickness[r](*относительная толщина*) \\ \phantom{In}Thin \\ \phantom{In}Thick \\ \\ Out[40]=AbsoluteThickness[r] \\ \\ Out[41]=Thickness[r] \\ \\ Out[42]=Thickness[Tiny] \\ \\ Out[43]=Thickness{Large] \\ \\ In[44]:= \\ \phantom{In}Graphics[{AbsoluteThickness[5], Line[\{\{0, 0\}, \{1, 1\}\}], \\ \phantom{In}Thickness[0.05], Circle[], Thin, Line[\{\{0, 0\}, \{1, -1\}\}]\}]$$

    Снова поменяйте мышкой размер рисунка. Толщина абсолютных линий не меняется. Относительные линии меняют абсолютную толщину вместе с рисунком.

    Вид многоугольника, диска, прямоугольника

    В $$Mathematica$$ способом "заполнения объектов" управляют две директивы: $$\text{\tt EdgeForm[список директив]}$$ и $$\text{\tt FaceForm[список директив]}$$. Они определяют цвет, толщину, прозрачность и стиль заполнения. Пустой $$\text{\tt FaceForm[]}$$ дает прозрачный многоугольник. В трехмерной графике (см. ниже) с помощью $$\text{\tt FaceForm}$$ можно определить разные цвета для двух сторон многоугольника (тогда аргумент - список из двух списков директив).

    $$\tt In[45]:=\{Graphics[\{EdgeForm[\{Thickness[0.5], Dashed, Orange\}],\\ \phantom{In[45]:=\{Gr}Red, Disk[]\}],\\ \phantom{In[45]:=\{}Graphics[ \\ \phantom{In[45]:=\{Gr}\{EdgeForm[\{AbsoluteThickness[0.2], Blue,\\ \phantom{In[45]:=\{Grap}Dashing[\{0.01, .01\}]\}], Cyan, Disk[]\}]\}$$ $$\tt In[46]:=\\ \phantom{In}Graphics[\\ \phantom{InG}\{\{EdgeForm[\{Thickness[0.5], Dashed, Orange\}], Red,\\ \phantom{InGra}Disk[\{0, 0\}, 1\},\\ \phantom{InGr}\{EdgeForm[\{AbsoluteThickness[0.2], Blue,\\ \phantom{InGraph}Dashing[\{0.01, .01\}]\}], FaceForm[Opacity [0.15], Cyan],\\ \phantom{InGra}Disk[\{1, 0\}, 1]\}\}]$$

    Директива Directive

    Эта директива служит для формирования единой директивы, являющейся композицией любого набора директив. Удобна при создании сложных комбинаций директив (см. примеры ниже).

    Опции

    $$Mathematica$$ также предусматривает множество опций, помогающих придать рисунку удобный, понятный и изящный вид. Общий вид опций следующий: $$\text{\tt Имя\_oпции }$\to$\text{ Значение}$$

    Рамки и координатные оси

    Отношения размеров, взаимное расположение и т. п. удобнее наблюдать при наличии той или иной системы отсчета. Для этого предусмотрены по умолчанию выключенные $$\text{\tt Axes}$$ (координатные оси), и $$\text{\tt Frame}$$ (рамка). Чтобы их включить, следует установить их в $$\text{\tt True}$$. Кроме того, можно вызвать координатную сетку $$\text{\tt GridLines}$$, для чего проще всего установить ее в автоматический режим $$\text{\tt Automatic}$$. Все это, разумеется, можно настраивать и украшать.

    $$\tt In[47]:=\{Graphics[\{FaceForm[\{Opacity[0.45], Orange\}], Disk[]\},\\ \phantom{In[47]:=\{G}Frame $\to$ True], \\ \phantom{In[47]:=\{}Graphics[\{FaceFormf\{Opacity[0.55], Orange\}], Disk[]},\\ \phantom{In[47]:=\{G}Axes $\to$ True], \\ \phantom{In[47]:=\{}Graphics[\{FaceForm[\{Opacity[0.65], Orange\}], Disk[]\},\\ \phantom{In[47]:=\{G}Frame $\to$ True], GridLines $\to$ Automatic],\\ \phantom{In[47]:=\{}Graphics[\{FaceForm[\{Opacity[0.75], Orange\}], Disk[]\},\\ \phantom{In[47]:=\{G}Axes $\to$ True, GridLines $\to$ Automatic]\}$$

    Так, например, оси можно подписать с помощью $$\text{\tt AxesLabel}$$ (приписывается список подписей) и $$\text{\tt LabelStyle}$$ (директива как подписывать или список директив для разных осей), выбрать начало координат $$\text{\tt AxesOrigin}$$ (приписываются координаты точки), стиль осей $$\text{\tt AxesStyle}$$ (директива или список директив) и деления на них с помощью $$\text{\tt Ticks}$$ (дает возможность описать каждое деление на оси максимально подробно: где, что написать, как деление отступает вниз и вверх от оси, как оно выглядит (в примере - нуль по горизонтали)) и $$\text{\tt TicksStyle}$$ (аналогично):

    $$\tt In[48]:= \\ \phantom{In}Graphics[\{FaceForm[\{Opacity[0.65], Orange\}], Disk[]\}, \\ \phantom{InG}Axes $\to$ True, AxesOrigin $\to$ \{-1, -1\}, AxesLabel $\to$ {"Ширина"\ \!\!\!\!, у\}, \\ \phantom{InG}LabelStyle $\to$ Directive [Red, Medium, Italic], AxesStyle $\to$ Thick, \\ \phantom{InG}Ticks $\to$ \\ \phantom{InGr}\{\{-1/3, -2/3, \{0, "Zero"\ \!\!\!\!, \{.5, 0.03\},\\ \phantom{InGraph}Directive[Green, Thin]\}, 1/2, 1\}, Automatic\}]$$

    Имеются аналогичные опции для работы с $$\text{\tt Frame}$$.

    Регулировка размеров рисунка в целом

    Опция $$\text{\tt PlotRange}$$ явно указывает какую область рисунка рисовать (в координатах):

    $$\tt In[49]:= \\ \phantom{In}\{Graphics[Circle[], PlotRange $\to$ \{0, 1\}, Frame $\to$ True], \\ \phantom{In\{}Graphics[Circle[], PlotRange $\to$ \{\{0, 1\}, \{0, 1\}\}, Frame $\to$ True], \\ \phantom{In\{}Graphics[Circle[], PlotRange $\to$ 2, Frame $\to$ True]\}$$

    Одна пара значений задает пределы изменения $$у$$-координаты, две пары -обеих координат. Может также стоять одно число, определяющее максимальные значения обеих координат. Также может принимать значения $$\text{\tt All}$$ (все точки рисунка) или $$\text{\tt Full}$$ (все данные). По умолчанию равна $$\text{\tt Automatic}$$. Последнее означает, что $$Mathematica$$ сама решает, что рисовать, а что нет.

    Опция $$\text{\tt ImageSize}$$ в аналогичных терминах задает размер рисунка как целого. Чтобы лучше видеть происходящее, удобно воспользоваться опцией $$\tt Background$$, которая позволяет закрасить весь прямоугольник образа, т.е. весь $$\text{\tt ImageSize}$$:

    $$\tt In[50]:= \\ \phantom{In}Graphics[Circle[], PlotRange $\to$ \{0, 1\}, ImageSize $\to$ \{100, 150\}, \\ \phantom{InG}Frame $\to$ True, Background $\to$ Orange]$$

    Опция $$\text{\tt AspectRatio}$$ регулирует отношение высоты рисунка (а не $$\text{\tt Image}$$-образа) к его ширине:

    $$\tt In[51]:=\\ \phantom{In}\{Graphics[Circle[], AspectRatio $\to$ Automatic, \\ \phantom{In\{G}ImageSize $\to$ \{100, 100\}, Frame $\to$ True, Background $\to$ Yellow], \\ \phantom{In\{}Graphics[Circle[], AspectRatio $\to$ 1/2, ImageSize $\to$ \{100, 100\}, \\ \phantom{In\{G}Frame $\to$ True, Background $\to$ Yellow], \\ \phantom{In\{}Graphics[Circle[], AspectRatio $\to$ 2, ImageSize $\to$ \{100, 100\}, \\ \phantom{In\{G}Frame $\to$ True, Background $\to$ Yellow]\}$$

    Отступ от краев прямоугольника образа (наружу) может быть также явно задан с помощью опции $$\text{\tt ImageMargins}$$:

    $$\tt In[52]:=\\ \phantom{In}\{Graphics[Circle[], PlotRange $\to$ \{0, 1\}, ImageSize $\to$ \{100, 200\}, \\ \phantom{In\{G}Frame $\to$ True, Background $\to$ LightOrange], \\ \phantom{In\{}Graphics[Circle[], PlotRange $\to$ \{0, 1\}, ImageSize $\to$ \{100, 200\}, \\ \phantom{In\{G}Frame $\to$ True, Background $\to$ LightOrange, ImageMargins $\to$ 20] , \\ \phantom{In\{}Graphics[Circle[], PlotRange $\to$ \{0, 1\}, ImageSize $\to$ \{100, 200\}, \\ \phantom{In\{G}Frame $\to$ True, Background $\to$ LightOrange, \\ \phantom{In\{G}ImageMargins $\to$ \{\{10, 20\}, \{30, 40\}\}]\}$$

    Отступ от краев прямоугольника образа (внутрь) может быть также явно задан с помощью опции $$\text{\tt ImagePadding}$$. При этом можно обрезать вылезающие за $$\text{\tt Frame}$$ (заданный $$\text{\tt PlotRange}$$) фрагменты рисунка с помощью переключателя $$\text{\tt PlotRangeClipping}$$:

    $$\tt In[53]:=\\ \phantom{In}\{Graphics[Circle[], PlotRange $\to$ \{0, 1\}, ImageSize $\to$ \{100, 200\}, \\ \phantom{In\{G}Frame $\to$ True, Background $\to$ LightOrange], \\ \phantom{In\{}Graphics[Circle[], PlotRange $\to$ \{0, 1\}, ImageSize $\to$ \{100, 200\}, \\ \phantom{In\{G}Frame $\to$ True, Background $\to$ LightOrange, ImagePadding $\to$ 20], \\ \phantom{In\{}Graphics[Circle[], PlotRange $\to$ \{0, 1\}, ImageSize $\to$ \{100, 200\}, \\ \phantom{In\{G}Frame $\to$ True, Background $\to$ LightOrange, \\ \phantom{In\{G}ImagePadding $\to$ \{\{10, 20\}, \{30, 40\}\}], \\ \phantom{In\{}Graphics[Circle[], PlotRange $\to$ \{0, 1\}, ImageSize $\to$ \{100, 200\}, \\ \phantom{In\{G}Frame $\to$ True, Background $\to$ LightOrange, \\ \phantom{In\{G}ImagePadding $\to$ \{\{10, 20\}, \{30, 40\}\}, PlotRangeClipping $\to$ True]\}$$

    Расширение $$\text{\tt Frame}$$ от размеров границы, заданной $$\text{\tt PlotRange}$$, определяется $$\text{\tt PlotRangePadding}$$ (в размерных единицах чертежа). При этом фактически меняется $$\text{\tt PlotRange}$$:

    $$\tt In[54]:=\\ \phantom{In\{}{Graphics[Circle[], PlotRange $\to$ \{0, 1\}, Frame $\to$ True, \\ \phantom{In\{G}Background $\to$ LightOrange], \\ \phantom{In\{}Graphics[Circle[], PlotRange $\to$ \{0, 1\}, Frame $\to$ True, \\ \phantom{In\{G}Background $\to$ LightOrange, PlotRangePadding $\to$ 1/2], \\ \phantom{In\{}Graphics[Circle[], PlotRange $\to$ \{0, 1\}, Frame $\to$ True, \\ \phantom{In\{G}Background $\to$ LightOrange, PlotRangePadding $\to$ 1/2, \\ \phantom{In\{G}PlotRangeClipping $\to$ True]\}$$

    Украшательства

    Комбинируя опции этого типа, такие как $$\text{\tt Background, Prolog, Epilog}$$ и т.п., можно регулировать вид фона, взаимное перекрытие объектов и т.п. Имеются также опции, управляющие выводом текста.

    Трехмерный случай

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

    $$\tt In[55]:=Graphics3D[\{ \\ \phantom{In[55]:=Gr}\{Orange, Opacity[0.4], \\ \phantom{In[55]:=Gra}Cylinder[\{\{-1.5, -1.5, -1.5\}, \{1.5, 1.5, 1.5\}\}, $\sqrt{2}$]\},\\ \phantom{In[55]:=Gr}(* Прямой цилиндр, заданный осью-отрезком и радиусом*)\\ \phantom{In[55]:=Gr}\{Red, Sphere[\{0, 0, 0\}, 2]\}, (* Сфера: центр, радиус*)\\ \phantom{In[55]:=Gr}\{Green, Opacity[.3], Cuboid[\{-2, -2, -2\}, \{2, 2, -1\}]\}\}]\\ \phantom{In[55]:=}(* Прямоугольный параллелепипед, \\ \phantom{In[55]:=}Заданный координатами противоположных вершин*)$$

    К графическим директивам, определяющим вид поверхности, добавляются две: $$\text{Glow[]}$$ (характеризует цвет, которым поверхность светится) и $$\text{Specularity[]}$$ (характеризует зеркальные свойства поверхности):

    $$\tt In[56]:=Table[Graphics3D[{Specularity[Red, s], Black, Sphere[]\}, \\ \phantom{In[56]:=Ta}Boxed $\to$ False, ImageSize $\to$ 150], \{s, \{0, 1, 2, 10, 100\}\}]$$ $$\tt In[57]:=\\ \phantom{In}\{Graphics3D[\{Glow[Red], Black, Cuboid[]\}, Boxed $\to$ False, \\ \phantom{In\{G}ImageSize $\to$ 150], Graphics3D [\{Glow[Red], White, Cuboid[]\}, \\ \phantom{In\{G}Boxed $\to$ False, ImageSize $\to$ 150]\}$$

    Кроме того, с помощью $$\text{\tt FaceForm}$$ можно теперь задавать разные цвета для разных сторон поверхности:

    $$\tt In[58]:=\\ \phantom{In}Graphics3D[\{FaceForm[Blue, Orange], Sphere[]\},\\ \phantom{InG}PlotRange $\to$ \{\{-1, 1\}, \{-1/2, 1/2\}, \{-1, 1\}\}, Boxed $\to$ False]$$

    В опциях $$\text{\tt Frame}$$ заменяется на $$\text{\tt Boxed}$$, добавляются возможности управлять источником света $$\text{\tt Lighting}$$ и опции, характеризующие "точку зрения" наблюдателя и некоторые другие характеристики образа:

    $$\tt In[59]:=\\ \phantom{In}\{Graphics3D[{FaceForm[Blue, Orange], Sphere[]\},\\ \phantom{In\{G}PlotRange $\to$ \{\{-1, 1\}, \{-1/2, 1/2\}, \{-1, 1\}\}, Boxed $\to$ False,\\ \phantom{In\{G}Lightings $\to$ \{\{"Point"\ \!\!\!\!, White, \{0, 0, 0\}\}\}],\\ \phantom{In\{}Graphics3D[\{FaceForm[Blue, Orange], Sphere[]\},\\ \phantom{In\{G}PlotRange $\to$ \{\{-1, 1\}, \{-1/2, 1/2\}, \{-1, 1\}\}, Boxed $\to$ False,\\ \phantom{In\{G}Lighting $\to$ \{\{"Point"\ \!\!\!\!, White, \{2, 2, 2\}\}\}],\\ \phantom{In\{}Graphics3D[\{FaceForm[Blue, Orange], Sphere[]\},\\ \phantom{In\{G}PlotRange $\to$ \{\{-l, 1\}, \{-1/2, 1/2\}, \{-1, 1\}\}, Boxed $\to$ False,\\ \phantom{In\{G}Lighting $\to$ \{\{"Ambient"\ \!\!\!\!, White\}\}],\\ \phantom{In\{}Graphics3D[\{FaceForm[Blue, Orange], Sphere[]\},\\ \phantom{In\{G}PlotRange $\to$ \{\{-l, 1\}, \{-1/2, 1/2\}, \{-1, 1\}\}, Boxed $\to$ False,\\ \phantom{In\{G}Lighting $\to$ Automatic]\}$$ $$\tt In[60]:=\\ \phantom{In}Manipulate[Graphics3D[\{FaceForm[Blue, Orange], Sphere[]\}\\ \phantom{In\{Ma}PlotRange $\to$ \{\{-1, 1\}, \{-1/2, 1/2\}, \{-1, 1\}, Boxed $\to$ False,\\ \phantom{In\{Ma}VienPoint $\to$ \{x, y, z\}, Image $\to$ 200], \{x, -3, 3\},\\ \phantom{In\{M}\{y, -3, 3\}, \{z, -3, 3\}]$$

    Графика, порожденная функциями и другими числовыми данными

    Двумерная графика

    Как уже говорилось в начале, $$Mathematica$$ располагает специальным арсеналом средств, позволяющих визуализировать числовые данные и функции. Самый простой и известный способ визуализировать функцию - это построить ее график. Это делается с помощью уже встречавшейся нам команды $$\text{\tt Plot}$$:

    $$\tt In[61]:=Plot[Sin[x], \{х, -$\pi$, $\pi$\}]$$

    На самом деле команда $$\text{\tt Plot}$$ генерирует по данной функции графические примитивы, директивы и опции и формирует затем соответствующую команду $$\text{\tt Graphics}$$:

    $$\tt In[62]:=InputForm[Plot[Sin[x], \{x, -$\pi$, $\pi$\}]] //Short \\ \\ Out[62]=Graphics[\{\{\{\}, \{\}, \{Hue[0.67, 0.6,\\ \phantom{Out[62]=Gr}0.6], Line[\{\{<<2>>, <<30>>\}]\}\}\}, \{<<6>>\}]$$

    Таким образом, мы видим, что $$\text{\tt Plot}$$, на самом деле, строит ломаную линию. При желании этим можно воспользоваться:

    $$\tt In[63]:=gg = Plot[Sin[x], \{х, -$\pi$ ,$\pi$\}];\\ \phantom{In[63]:=}gg[\!\![l, 1, 3, 1]\!\!]\\ \\ Out[64]=Hue[0.67, 0.6, 0.6]$$

    Вот мы вычленили директиву, предшествующую собственно ломаной. Ее можно подменить, например так:

    $$\tt In[65]:=gg[\!\![l, 1, 3, l]\!\!] = Sequence [Red, Thick, Dashed];\\ \phantom{In[65]:=}gg$$

    С одной стороны, в командах типа $$\text{\tt Plot}$$ можно использовать опции обычной графики. С другой стороны, есть и специальные способы управления, главные из которых $$\text{\tt PlotStyle}$$ и $$\text{\tt ColorFunction}$$. Опция $$\text{\tt PlotStyle}$$ служит для использования уже знакомых нам графических директив. Теперь $$Mathematica$$ сама поставит их в нужное место в команде $$\text{\tt Graphics}$$:

    $$\tt In[67]:=\{Plot[\{Red, Dashed, Thick, Sin[x]\}, \{x, -$\pi$, $\pi$\}],\\ \phantom{In[67]:=\{}Plot[Sin[x], \{x, -$\pi$, $\pi$\},\\ \phantom{In[67]:=\{P}PlotStyle $\to$ \{RGBColor[l, 0, 0], Dashed, Thick\}]\}$$

    Опция $$\text{\tt ColorFunction}$$ служит для управления цветом изображаемого графика. Имена и смысл переменных этой функции фиксированы (для каждого типа графики - свои, для обычного $$\text{\tt Plot}$$, например, это $$x, y$$ ). В качестве примера раскрасим график в соответствии с кривизной соответствующей плоской кривой:

    $$\tt In[68]:=ClearAll[g];\\ \phantom{In[68]:=}cur[f\_][t\_] := $\frac{Abs[D[f[t],t,t]]}{(l+D[f[t],t]^2)^{3/2}}$;\\ \phantom{In[68]:=}g[t\_] = cur[Sin][t]; \\ \phantom{In[68]:=}\{Plot[Sin[x], {x, -$\pi$, $\pi$\}, PlotStyle $\to$ \{Thick\},\\ \phantom{In[68]:=Cl}ColorFunction $\to$ Function [\{x, y\}, Hue$[\frac{g[x]}{1.1}]$],\\ \phantom{In[68]:=Cl}ColorFunctionScaling $\to$ False],\\ \phantom{In[68]:=C}Plot[g[t], \{t, -$\pi$, $\pi$\}]\}$$

    Замечание. На самом деле, чтобы картина была реалистичной, пришлось отмасштабировать кривизну так, чтобы она менялась от 0 до 1/2 (важно, чтобы не доходила до 1). Здесь мы пользуемся тем, что кривизна графика синуса меняется от нуля (на рисунке - красный) до единицы (синий). Опция $$\text{\tt ColorFunctionScaling }$\to$\text{ False}$$ отключает автоматическое масштабирование функции, отвечающей за цвет, которое затемняет дело.

    Перечислим теперь встроенные возможности функции $$\text{\tt Plot}$$. Во-первых, можно рисовать сразу несколько графиков, причем они автоматически получаются разноцветными. Можно и самим регулировать их вид (с помощью $$\text{\tt PlotStyle}$$):

    $$\tt In[72]:=\{Plot[\{Sin[x], 1.2Sin[2x], 1.3Sin[3x]\}, \{x, 0, 10\}],\\ \phantom{In[72]:=\{}Plot[\{Sin[х], 1.2Sin[2x], 1.3Sin[3x]\}, \{x, 0, 10\},\\ \phantom{In[72]:=\{P}PlotStyle $\to$ \{\{Red, Thick\}, \{Dashed, Blue\}, \{Orange\}\}]\}$$

    Можно также закрашивать области, ограниченные графиком (графиками). Это исполняется с помощью опции $$\text{\tt Filling}$$, значение которой устанавливается в тип заполнения ("до оси", "подграфик", "надграфик"):

    $$\tt In[73]:=Plot[\{Sin[x], 1.2Sin[2x], 1.3Sin[3x]\}, \{x, 0, 10\}, \\ \phantom{In[73]:=P}Filling $\to$ \{l $\to$ Axis, 2 $\to$ Bottom, 3 $\to$ Top\}]$$

    Более хитрый вид заполнения: для 2-го объекта выбрано заполнение до 1-го. Можно также добавить директивы, как именно заполнять:

    $$\tt In[74]:=\\ \phantom{In}\{Plot[\{Sin[x], 1.4Sin[2x]\}, \{х, 0, 10\}, Fillings $\to$ \{2 $\to$ \{1\}\}],\\ \phantom{In\{}Plot[\{Sin[x], 1.4Sin[2x]\}, \{x, 0, 10\},\\ \phantom{In\{P}Filling $\to$ \{2 $\to$ \{l, \{Red, Blue\}\}\}]\}$$

    Можно явно указать, сколько точек участвуют в построении ломаной, изображающей кривую. Современные версии $$Mathematica$$ сами следят за качеством графика, поэтому $$\text{\tt PlotPoints}$$ в двумерной графике - это начальное количество точек аппроксимации (по умолчанию равен 50). Если картинка $$Mathematica$$ не нравится, она сама подразобьет кривую столько раз, сколько ей захочется. Чтобы запретить ей это, нужно ограничить рекурсию с помощью опции $$\text{\tt MaxRecursion}$$ (которая устанавливается в количество итераций). Чтобы увидеть точки-вершины ломаной, нужно использовать опцию $$\text{\tt Mesh}$$:

    $$\tt In[75]:=\{Plot[Sin[x], \{x, -$\pi$, $\pi$\}, Mesh$\to$All, MaxRecursion$\to$0],\\ \phantom{In[75]:=\{}Plot[Sin[x], \{x, -$\pi$, $\pi$\}, PlotPoints$\to$5, Mesh$\to$All,\\ \phantom{In[75]:=\{P}MaxRecursion$\to$0],\\ \phantom{In[75]:=\{}Plot[Sin[x], \{x, -$\pi$, $\pi$\}, PlotPoints$\to$5, Mesh$\to$All,\\ \phantom{In[75]:=\{P}MaxRecursion$\to$1],\\ \phantom{In[75]:=\{}Plot[Sin[x], \{x, -$\pi$, $\pi$\}, PlotPoints$\to$5, Mesh$\to$All]\} $$

    Иногда полезно исключить из рассмотрения какие-нибудь точки. Для этого служит опция $$\text{\tt Exclusions}$$, которая устанавливается в условие:

    $$\tt In[76]:=\{Plot[Tan[x], \{х, -2$\pi$, 2$\pi$\}],\\ \phantom{In[76]:=\{}Plot[Tan[x], \{х, -2$\pi$, 2$\pi$\}, Exclusions$\to$\{Cos[x] == 0\}]\} $$

    К двумерным способам представления числовых данных относятся так же:

  • $$\text{\tt ListPlot, ListLinePlot, ArrayPlot}$$,
  • $$\text{\tt PolarPlot, ParametricPlot}$$,
  • $$\text{\tt ContourPlot, DensityPlot}$$,
  • $$\text{\tt RegionPlot}$$.
  • Первые три служат для изображения дискретных данных (одномерных или двумерных). Вот одномерные данные:

    $$\tt In[77]:=data = Table [Random[], \{20\}];\\ \phantom{In[77]:=}\{ListPlot[data, Filling $\to$ Axis], \\ \phantom{In[77]:=d}ListLinePlot[data,Filling $\to$ Axis]}$$

    А вот - двумерные. Обратите внимание, что $$\text{\tt ListLinePlot}$$ просто соединяет последовательные точки линией.

    $$\tt In[79]:=\\ \phantom{In}data = Table[\{Cos[\#], Sin[\#]\} \ [Random[Real, 2$\pi$]], \{i, 1, 40\}];\\ \phantom{In}\{ListPlot[data, AspectRatio $\to$ Automatic],\\ \phantom{Ind}ListLinePlot[data, AspectRatio $\to$ Automatic]\}$$

    $$\text{\tt ArrayPlot}$$ изображает числа строки в виде раскрашенных квадратиков. По умолчанию они черно-белые, но можно их и раскрасить:

    $$\tt In[81]:=ArrayPlot[Transpose[data]]$$

    Можно задать цвета явно с помощью правил $$\text{\tt ColorRules}$$, можно использовать $$\text{\tt ColorFunction}$$. Мы нарисуем число $$\pi$$:

    $$\tt In[82]:=curpet[х\_, m\_, n\_] :=\\ \phantom{In[82]:=cu}Module[\{res, хх, i\},\\ \phantom{In[82]:=cur}(*Эта подпрограммка вычисляет цифры числа х и \\ \phantom{In[82]:=curp}организовывает их в массив\}*)\\ \phantom{In[82]:=cur}хх = N[x, m n];\\ \phantom{In[82]:=cur}res = \{RealDigits[хх, 10, m] [\!\![1]\!\!]\};\\ \phantom{In[82]:=cur}xx = xх/10$^{\text{RealDigits}[xx,10,m][\![2]\!]}$;\\ \phantom{In[82]:=cur}For[i = l, i $\le$ n - 1, i++,\\ \phantom{In[82]:=curp}res = res$\sim$Join$\sim$\{RealDigits[xx, 10, m, -m i - 1][\!\![1]\!\!]\}\\ \phantom{In[82]:=cur}];\\ \phantom{In[82]:=cur}res\\ \phantom{In[82]:=cu}];\\ \phantom{In[82]:=}rules = \{0$\to$Red, 1$\to$Pink, 2$\to$Orange, 3$\to$Brown, 4$\to$Yellow,\\ \phantom{In[82]:=cur}5$\to$Green, 6$\to$Cyan, 7$\to$Blue, 8$\to$Magenta, 9$\to$Purple\}; $$ $$\tt In[84]:={ArrayPlot[curpet[$\pi$, 40, 40], ColorRules$\to$rules],\\ \phantom{In[84]:=\{}ArrayPlot[curpet[$\pi$, 40, 40], ColorFunction$\to$"Pastel"\ \!\!\!],\\ \phantom{In[82]:=\{}ArrayPlot[curpet[$\pi$, 40, 40], ColorFunction$\to$"Rainbow"\ \!\!\!] \}$$

    Команда $$\text{\tt PolarPlot}$$ удобна для рисования кривых, заданных в полярных координатах. Имеется также ее модификация $$\text{\tt ListPolarPlot}$$:

    $$\tt In[85]:=PolarPlot[\{l, 1 + 1/2Sin[10t], 1/2\}, \{t, 0, 2Pi\},\\ \phantom{In[85]:=P}PlotStyle $\to$ \{Green, \{Dashed, Thick, Orange\},\\ \phantom{In[85]:=Pol}\{Thickness[0.005], Green\}\}]$$

    Универсальный инструмент для рисования кривых - это, конечно, команда $$\text{\tt ParametricPlot}$$. Он теперь сразу позволяет рисовать однопараметрические семейства или области:

    $$\tt In[86]:=\\ \phantom{In}\{ParametricPlot[\{Cos[x], Sin[2x]\}, \{x, 0, 2$\pi$\}],\\ \phantom{In\{}ParametricPlot[r\{Cos[x], Sin[2x]\}, \{x, 0, 2$\pi$\}, \{r, 0.5, 1.5\}],\\ \phantom{In\{}ParametricPlot[r\{Cos[x], Sin[2x]\}, \{x, 0, 2$\pi$\},\\ \phantom{In\{P}\{r, 0.5, 1.5\}, Mesh$\to$None]\}$$

    Можно использовать это для рисования, например, координатных линий:

    $$\tt In[87]:=\\ \phantom{In}\{ParametricPlot[\{х, у\}, \{х, -1, 1\}, \{у, -1, 1\}, Axes$\to$False,\\ \phantom{In\{P}Frame$\to$False], ParametricPlot[\{r Cos[$\varphi$], r Sin[$\varphi$]\},\\ \phantom{In\{P}\{$\varphi$, 0, 2$\pi$\}, \{r, 0, 1\}, Axes$\to$False, Frame$\to$False]\} $$

    или для наглядного изображения отображений из плоскости в плоскость:

    $$\tt In[88]:=\\ \phantom{In}F[u\_, v\_] := \{Re[(u + iv)$^{1/3}$], Im[(u + iv)$^{1/3}$]\};\\ \phantom{In}\{ParametricPlot[\{u, v\}, \{u, -1, 1\}, \{v, -1, 1\}, Frame $\to$ False,\\ \phantom{In\{P}MeshStyle $\to$ \{Orange, Green\}],\\ \phantom{In\{}ParametricPlot[F[u, v], \{u, -1, 1\}, \{v, -1, 1\}, Frame $\to$ False,\\ \phantom{In\{P}MeshStyle $\to$ \{Orange, Green\}, AxesOrigin $\to$ \{0, 0\}]\}$$ $$\tt In[90]:=\\ \phantom{In}FF[r\_, $\varphi$\_] := \{Re[r$^{1/3}$e$^{i\frac{\varphi}{3}}$], Im[r$^{1/3}$e$^{i\frac{\varphi}{3}$]\};\\ \phantom{In}\{ParametricPlot[\{r Cos[$\varphi$], r Sin[$\varphi$]\}, \{r, 0, 1\}, \{$\varphi$ -$\pi$, $\pi$\},\\ \phantom{In\{P}Frame$\to$False, MeshStyle$\to$\{Orange, Green\}],\\ \phantom{In\{}ParametricPlot[FF[r, $\varphi$], \{r, 0, 1\}, \{$\varphi$, -$\pi$, $\pi$\}, Frame$\to$False,\\ \phantom{In\{P}MeshStyle$\to$\{Orange, Green\}, AxesOrigin$\to$\{0, 0\}]\}$$ $$\tt In[92]:=\\ \phantom{In}DLP[r\_, $\varphi$\_] := Module[\{z, z0, w\},\\ \phantom{InDLP}z=re$^{i\varphi}$;\\ \phantom{InDLP}z0 = 1/2;\\ \phantom{InDLP}w = $\frac{z-z0}{(1-z \text{Conjugate}[z0]}$;\\ \phantom{InDLP}\{Re[w], Im[w]\}\\ \phantom{InDL}];\\ \phantom{In}\{ParametricPlot[\{r Cos[$\varphi$], r Sin[$\varphi$]\}, \{r, 0, 1\}, \{$\varphi$, -$\pi$, $\pi$\},\\ \phantom{InDL}Frame$\to$False, MeshStyle$\to$\{Orange, Green\}],\\ \phantom{InD}ParametricPlot[DLP[r, $\varphi$], \{r, 0, 1\}, \{$\varphi$, -$\pi$, $\pi$\},\\ \phantom{InDL}Frame$\to$False, PlotPoints$\to$50, MeshStyle$\to$\{Orange, Green\},\\ \phantom{InDL}AxesOrigin$\to$\{0, 0\}]\}$$

    Снова можно задавать осмысленные функции для раскраски кривой. Например, кривизну. Напомним, что красный соответствует нулю, и цвет меняется в синюю сторону при возрастании.

    $$\tt In[94]:=ClearAll[cur, gg, xx, yy, t];\\ \phantom{In[94]:=}cur[x\_, y\_][t\_] := $\frac{\text{Abs}[D[x[t],t,t] D[y[t],t]-D[y[t],t,t] D[x[t],t]]}{(D[x[t],t]^2+D[y[t]^2)^{3/2}$;\\ \phantom{In[94]:=}xx[t\_] := Log[t] Cos[t]; yy[t\_] := Log[t] Sin[t];\\ \phantom{In[94]:=}gg[t\_] = cur[xx, yy][t];\\ \\ In[98]:=mm = NMaximize[\{gg[t], 0 $\le$ t\}, \{t\}][\!\![l]\!\!]\\ \\ Out[98]=2.65323\\ \\ In[99]:=Plot[gg[t], \{t, 0.1, 2$\pi$\}]$$ $$\tt In[100]:=\\ \phantom{In}ParametricPlot[\{xx[t], yy[t]\}, \{t, 1/2, 7$\pi$\}, PlotStyle$\to$Thick,\\ \phantom{InP}ColorFunction$\to$Function \{x, у, u\}, Hue$\left[\frac{gg[u]}{1.2mm}\right]$],\\ \phantom{InP}ColorFunctionScaling$\to$False$$

    Команды $$\text{\tt ContourPlot}$$ и $$\text{\tt DensityPlot}$$ служат для рисования неявно заданных кривых и функций:

    $$\tt In[101]:=\\ \phantom{In}\{ContourPlot[Cos[x] + Cos[y], \{x, 0, 4Pi\}, \{y, 0, 4Pi\}], \\ \phantom{In\{}ContourPlot[Cos[x] + Cos[y] == 1/2, \{x, 0, 4Pi\}, \{y, 0, 4Pi\}], \\ \phantom{In\{}DensityPlot[Cos[x] + Cos[y], \{x, 0, 4Pi\}, \{y, 0, 4Pi\}]\}$$

    Наконец, $$\text{\tt RegionPlot}$$ изображает области, заданные неравенствами:

    $$\tt In[102]:=\\ \phantom{In}RegionPlot[1/4 $\le$ х\^\,\!2 + (2у)\^\,\!2 $\le$ 1 х + у $\le$ 1/2, \{х, -1, 1\},\\ \phantom{InR}\{у, -1, 1\}, AspectRatio $\to$ Automatic]$$

    Трехмерная графика

    Практически все команды двумерной графики имеют аналоги в трехмерной. Снова рассмотрим сначала простейшую команду рисования графика функции двух переменных $$\text{\tt Plot3D}$$:

    $$\tt In[103]:=Plot3D[уSin[x] + уSin[x], \{x, -$\pi$, $\pi$\}, \{у, -$\pi$, $\pi$\}]$$

    Эта команда порождает графический комплекс с заданными нормалями вершин:

    $$\tt In[104]:=\\ \phantom{In}InputForm[Plot3D[уSin[х] + уSin[х], \{х, -$\pi$, $\pi$\}, \{у, -$\pi$, $\pi$\}]] // \\ \phantom{InI}Short \\ \\ Out[104]=Graphics3D[GraphicsComplex[\{\{<<3>>\},\\ \phantom{Out[104]=Gr}\{<<3>>\}, <<2526>>, \{<<3>>\}\}, <<2>>], \{<<5>>\}] $$

    точнее,

    $$\tt In[105]:=\\ \phantom{In}Plot3D[уSin[x] + ySin[x], \{x, -$\pi$, $\pi$\}, \{у, -$\pi$, $\pi$\},\\ \phantom{InP}PlotStyle$\to$FaceForm[Red, Blue], PlotPoints$\to$2 , Mesh$\to$All,\\ \phantom{InP}MaxRecursion$\to$0]$$ $$\tt In[106]:=\\ \phantom{In}InputForm[Plot3D[уSin[x] + уSin[х], \{х, -$\pi$, $\pi$\}, \{у, -$\pi$, $\pi$\},\\ \phantom{InIn}PlotPoints $\to$ 2, Mesh $\to$ All, PlotStyle $\to$ MaxRecursion $\to$ 0]]\\ \\ Out[106]=\\ \\ \phantom{O}Cruahics3D[\\ \phantom{Ou}GraphicsComplex[\{\{-3.141586370404486, -3.141586370404486, 0.00003947833864787322\},\\ \phantom{OuGr}\{3.141586370404486, -3.141586370404486, -0.00003947833864787322\},\\ \phantom{OuGr}\{-3.141586370404486, 3.141586370404486, -0.00003947833864787322\},\\ \phantom{OuGr}\{3.141586370404486, 3.141586370404486, 0.00003947833864787322\},\\ \phantom{OuGr}\{0., 0., 0.\},\{3.141586370404486, 0., 0.\}, \{0., 3.141586370404486. 0.\},\\ \phantom{OuGr}\{-3.141586370404486, 0., 0.\}, \{0., -3.141586370404486, -0.\},\\ \phantom{OuGr}\{-1.570793185202243, -1.570793185202243, 3.141586370388983\},\\ \phantom{OuGr}\{1.570793185202243, -1.570793185202243, 3.141586370388983\},\\ \phantom{OuGr}\{1.570793185202243, 1.570793185202243, 3.141586370388983\},\\ $$ $$\tt \phantom{OuGr}\{-1.570793185202243, 1.570793185202243, .141586370388983\},\\ \phantom{OuGr}\{3.141586370388983, 1.570793185202243, 0.00001973916932393661\},\\ \phantom{OuGr}\{-1.570793185202243, 3.141586370404486, -6.283172740777966\},\\ \phantom{OuGr}\{-3.141586370404486, -1.570793185200043, 0.00001973916932393661\}\\ \phantom{OuGr}\{1.570793185202243, -3.141586370404486, -6.283172740777966\},\\ \phantom{OuGr}\{-1.570793185202243, -3.141586370404486, 6.283172740777966\},\\ \phantom{OuGr}\{3.141586370404486, -1.570793185202243, -0.000019739169323333333393661\},\\ \phantom{OuGr}\{1.570793185202243, 3.141586370404486, 6.283172740777966\},\\ \phantom{OuGr}\{-3.141586370404486, 1.570793185202243, -0.00001973916932393661\}\}, $$ $$\tt \phantom{OuG}\{\{\{EdgeForm[GrayLevel[0.]], MaxRecursion -> 0,\\ \phantom{OuGrap}GraphicsGroup[\{Polygon[\{\{11,6,5\}, \{14,12,6\}, \{13,8,5\}, \{10,9,5\},\\ \phantom{OuGrapGrap}\{12,7,5\}, \{15,13,7\}, \{8,10,5\}, \{16,10,8\}, \{17,11,9\},\\ \phantom{OuGrapGrap}\{18,10,1\}, \{20,12,4\}, \{13,15,3\}, \{11,17,2\}, \{10,18,9\},\\ \phantom{OuGrapGrap}\{12,14,2\}, \{20,12,4\}, \{13,15,3\}, \{11,17,2\}, \{10,18,9\}\\ \phantom{OuGrapGrap}\{11,19,6\}, \{10,16,1\}, \{12,20,7\}, \{13,21,8\}\}]\}]\}, \{\},\{\},\{\},\{\}\}\},\\ $$ $$\tt \phantom{OuG}VertexNormals -> \{\{-0.9875704433539252, 1.975144837054073*\^\,\!-6, 0.1571770320683985\},\\ \phantom{OuGra}\{-0.9875704433539252, -1.975144837054073*\^\,\!-6, 0.1571770320683985\},\\ \phantom{OuGra}\{0.9875704433539252, 1.975144837054073*\^\,\!-6, 0.1571770320683985\},\\ \phantom{OuGra}\{0.9875704433539252, -1.975144837054073*\^\,\!-6, 0.1571770320683985\},\\ \phantom{OuGra}\{0., 0., 1,\}, \{0., -0.000012566370613478698, 0.9999999999210432\},\\ \phantom{OuGra}\{0.9875704433563331, 0., 0.15717703206567918\},\\ \phantom{OuGra}\{0., 0.000012566370613478698, 0.9999999999210432\},\\ \phantom{OuGra}\{0.9875704433563331, 0., 0.15717703206567918\},\\ \phantom{OuGra}\{4.413812442766295*\^\,\!-6, 0.8944271909903205, 0.44721359549736717\},\\ \phantom{OuGra}\{4.413812442766295*\^\,\!-6, -0.8944271909903205, 0.44721359549736717\},\\ \phantom{OuGra}\{-4.413812442766295*\^\,\!-6, -0.8944271909903205, 0.44721359549736717\},\\ \phantom{OuGra}\{-4.413812442766295*\^\,\!-6, 0.8944271909903205, 0.44721359549736717\},\\ $$ $$\tt \phantom{OuGra}\{0.952890338648335, -3.811568977840421*\^\,\!-6, 0.30331502187681625\},\\ \phantom{OuGra}\{-8.827624885274624*\^\,\!-6, 0.894427190964183, 0.4472135954829845\},\\ \phantom{OuGra}\{-0.952890338648335, 3.811568977840421*\^\,\!-6, 0.30331502187681625\},\\ \phantom{OuGra}\{8.827624885274624*\^\,\!-6, -0.894427190964183, 0.44721359548429548\},\\ \phantom{OuGra}\{8.827624885274624*\^\,\!-6, 0.894427190964183, 0.44721359548429548\},\\ \phantom{OuGra}\{-0.952890338648335, -3.811568977840421*\^\,\!-6, 0.30331502187681625\},\\ \phantom{OuGra}\{-8.827624885274624*\^\,\!-6, -0.894427190964183, 0.44721359548429548\},\\ \phantom{OuGra}\{0.952890338648335, 3.811568977840421*\^\,\!-6, 0.30331502187681625\},\\ \phantom{Ou}{Axes -> True, BoxRatios -> {1, 1, 0.4}, Method -> {"RotationControl"\ \!\!\!\! -> "Globe"\ \!\!\!\!\},\\ \phantom{OuG}PlotRange -> \{\{Pi, Pi\}, \{-Pi, Pi\}, \{-6.283172740777966, 6.283172740777966\}\},\\ \phantom{OuG}PlotRangePadding -> \{Scaled[0.02], Scaled[0.02], Scaled[0.02]\}\}]$$

    Снова можно пользоваться стандартными опциями трехмерной графики, снова есть $$\text{\tt PlotStyle}$$ для директив. Из новых опций обратим внимание на $$\text{\tt BoundaryStyle}$$ (приписывается графическая директива, описывающая граничную линию), $$\text{\tt Exclusions}$$ и $$\text{\tt ExclusionStyle}$$ (исключение части рисунка, заданной условием, и способ прорисовки ограничивающей линии), $$\text{\tt RegionFunction}$$ (задание области рисунка с помощью функции от стандартного набора переменных), $$\text{\tt MeshFunction}$$ (приписывается функция или функции, линии уровня которых задают координатные линии на поверхности), $$\text{\tt Mesh}$$ (приписывается количество этих линий):

    $$\tt In[107]:=\\ \phantom{In}Plot3D[уSin[х] + уSin[х], \{х, -$\pi$, $\pi$\}, \{у, -$\pi$, $\pi$\},\\ \phantom{InP}MeshFunctions $\to$ \{\#3 \\}, MeshStyle $\to$ \{Orange\},\\ \phantom{InP}PlotStyle $\to$ FaceForm[Directive[Red, Specularity[White, 2]],\\ \phantom{InPlo}Blue], BoundaryStyle $\to$ \{Thick, Red\}]$$ $$\tt In[108]:=\\ \phantom{In}Plot3D[ySin[x] + ySin[x], \{x, -$\pi$, $\pi$ \}, \{у, -$\pi$, $\pi$\},\\ \phantom{InP}PlotStyle $\to$ FaceForm[Directive[Red, Specularity[White, 2]],\\ \phantom{InPPl}Blue], BoundaryStyle $\to$ \{Thick, Red\},\\ \phantom{InP}MeshFunctions $\to$ \{(\#1$^2$ + \#2$^2$) \\}, Mesh $\to$ 5,\\ \phantom{InP}RegionFunction $\to$ Function[\{x, у, z\}, 1/2 < x$^2$ + у$^2$ > 3]] $$

    Из других команд отметим прежде всего команды, позволяющие рисовать параметрически заданные поверхности и кривые ($$\text{\tt ParamrtricPlot3D}$$ и ее частные случаи $$\text{\tt RevolutionPlot3D}$$ и $$\text{\tt SphericalPlot3D}$$), неявно заданные поверхности ($$\text{\tt ContourPlot3D}$$), трехмерные области, заданные неравенствами ($$\text{\tt RegionPlot3D}$$), а также трехмерные рисовалки дискретных данных, такие как $$\text{\tt ListPlot3D, ListPointPlot3D, ListSurfacePlot3D}$$.

    В качестве примера рассмотрим знаменитую поверхность Боя - параметризацию проективной плоскости. Явные формулы взяты из задачника А. С. Мищенко, Ю. П. Соловьева, А. Т. Фоменко [5].

    $$\tt In[109]:=\\ \phantom{In}ClearAll[x, y, z, $\theta$, $\varphi$, f1, f2, f3, r];\\ \phantom{In}f1=[$\theta$\_, $\varphi$\_] :=\\ \phantom{Inf1}$\frac12$((2x$^2$ - y$^2$ - z$^2$)(x$^2$ + y$^2$ + z$^2$) + 2yz(y$^2$-z$^2$) + zx(x$^2$ - z$^2$) +\\ \phantom{In$\frac12$((}xy(y$^2$ - x$^2$)) /. \{x $\to$ Cos[$\theta$] Cos[$\varphi$], y $\to$ Cos[$\theta$]Sin[$\varphi$],\\ \phantom{In$\frac12$}z $\to$ Sin[$\theta$]\};\\ \phantom{In}f2[$\theta$\_, $\varphi$\_] :=\\ \phantom{Inf2}$\frac{\sqrt{3}}{2}$((y$^2$ - z$^2$) (x$^2$ + y$^2$ + z$^2$) + zx(z$^2$ - x$^2$) + xy(y$^2$ - x$^2$)) /.\\ \phantom{Inf2[}\{x $\to$ Cos[$\theta$] Cos[$\varphi$], y $\to$ Cos[$\theta$] Sin[$\varphi$], z $\to$ Sin[$\theta$]\};\\ \phantom{In}f3[$\theta$\_, $\varphi$\_] := (x + y + z) ((x + y + z)$^3$ + 4(y-x) (z-y) (x-z)) /.\\ \phantom{Inf3[}\{x $\to$ Cos[$\theta$ Cos[$\varphi$], y $\to$ Cos[$\theta$]Sin[$\varphi$], z $\to$ Sin[$\theta$]\};\\ \phantom{In}r[$\theta$\_, $\varphi$\_] := \{f1[$\theta$, $\varphi$], f2[$\theta$, $\varphi$], 0.1f3[$\theta$, $\varphi$]\};$$

    Сначала нарисуем эту сложную самопересекающуюся поверхность, разрезая ее на горизонтальные слои и выбрасывая каждый второй, чтобы можно было лучше рассмотреть самопересечения. Это делается с помощью опций $$\text{\tt MeshFunctions}$$ (устанавливается в функцию от стандартных переменных), $$\text{\tt MeshShading}$$ (определяет, что рисовать между $$\text{\tt Mesh}$$ - линиями, присваивается список (списки) циклически повторяющихся директив; $$\text{\tt None}$$ соответствует "ничего не рисованию") и $$\text{\tt Mesh}$$ или количество равномерно распределенных линий, или явные значения $$\text{\tt MeshFunction}$$.

    $$\tt In[114]:=\\ \phantom{In}ParametricPlot3D[r[$\theta$, $\varphi$], \{$\theta$, -$\pi$/2, $\pi$/2\}, \{$\varphi$, 0, $\pi$\},\\ \phantom{InP}MeshFunctions $\to$ \{\#3 \\},\\ \phantom{InP}MeshShading $\to$ \phantom{InPa}\{Directive[\{Orange, Opacity[0.9], Specularity[White, 2]\}],\\ \phantom{InPar}None\}, PlotPoints $\to$ 30,\\ \phantom{InP}Mesh $\to$ \{\{-0.05, 0.05, 0.1, 0.2, 0.3, 0.4\}\}]$$

    Выделить наиболее сложный фрагмент поверхности можно с помощью опции $$\text{\tt RegionFunction}$$:

    $$\tt In[115]:=\\ \phantom{In}ParametricPlot3D[r[$\theta$, $\varphi$], \{$\theta$, -$\pi$/2, $\pi$/2\}, \{$\varphi$, 0, $\pi$ \},\\ \phantom{InP}PlotStyle $\to$ Directive[\{Orange, Opacity[0.9]\}], Mesh $\to$ None, \\ \phantom{InP}PlotPoints $\to$ 30,\\ \phantom{InP}RegionFunction $\to$ Function[\{x, у, z\}, 0.05 < z < 0.2], \\ \phantom{InP}Boxed $\to$ False, Axes $\to$ None]$$

    Координатные линии на поверхности, соответствующие параметризации, можно увидеть, сменив $$\text{\tt MeshFunctions}$$. Заодно разрежем поверхность в шахматном порядке:

    $$\tt In[116]: = \phantom{In}ParametricPlot3D[r[$\theta$, $\varphi$], \{$\theta$, -$\pi$/2, $\pi$/2\}, \{$\varphi$, 0, $\pi$\},\\ \phantom{InP}MeshFunctions $\to$ \{\#4 \, \#5 \\},\\ \phantom{InP}MeshShading $\to$ \phantom{InPa}\{\{Directive[\{Orange, Opacity[0.9], Specularity[White, 2]\}],\\ \phantom{InPara}None\},\\ \phantom{InPar}\{None, Directive[$\setminus$\{Orange, Opacity[0.9],\\ \phantom{InParame}Specularity[White, 2]\}]\}\}, PlotPoints $\to$ 30,\\ \phantom{InP}PlotStyle $\to$ \{Opacity[0.5]\},\\ \phantom{InP}MeshStyle $\to$ \{\{Thick, Red\}, \{Thick, Brown\}\}]$$

    Наконец, чтобы лучше себе представить параметризацию, выбросим края параметризующего прямоугольника. Граница выделяется с помощью опции $$\text{\tt BoundaryStyle}$$:

    $$\tt In[117]:=\\ \phantom{In}ParametricPlot3D[r[$\theta$, $\varphi$], \{$\theta$, -$\pi$/2 + 0.1, $\pi$/2 - 0.1\}, \\ \phantom{InP}\{$\varphi$, 0.1, $\pi$ - 0.1\}, MeshFunctions $\to$ \{\#4 \, \#5 \\}, PlotPoints $\to$ 30,\\ \phantom{InP}PlotStyle $\to$ \{Orange, Opacity[0.9], Specularity[White, 2]\},\\ \phantom{InP}BoundaryStyle $\to$ \{Red, Thick\}]$$

    Нарисуем теперь отдельно вырезанный фрагмент. Каждый кусочек нарисуем отдельно, не выводя на экран, не забыв сделать одинаковыми изображаемые области с помощью $$\text{\tt PlotRange}$$:

    $$\tt In[118]:=\\ \phantom{In}gr=\{ParametricPlot3D[r[$\theta$, $\varphi$], \{$\theta$, - $\pi$/2, - $\pi$/2 + 0.1\},\\ \phantom{Ingr=}\{$\varphi$, 0, $\pi$\}, BoundaryStyle $\to$ \{Red, Thick\}, Mesh $\to$ None,\\ \phantom{Ingr=}PlotRange $\to$ 1.2], ParametricPlot3D[r[$\theta$, $\varphi$],\\ \phantom{Ingr=}\{$\theta$, $\pi$/2 - 0.1, $\pi$/2\}, \{$\varphi$, 0, $\pi$\}, BoundaryStyle $\to$ \{Red, Thick\},\\ \phantom{Ingr=}Mesh $\to$ None, PlotRange $\to$ 1.2],\\ \phantom{Ingr}ParametricPlot3D[r[$\theta$, $\varphi$], \{$\theta$, - $\pi$/2, $\pi$/2\}, \{$\varphi$, 0, 0.1\},\\ \phantom{Ingr=}BoundaryStyle $\to$ \{Red, Thick\}, Mesh $\to$ None, PlotRange $\to$ 1.2],\\ \phantom{Ingr}ParametricPlot3D[r[$\theta$, $\varphi$], \{$\theta$, -$\pi$/2, $\pi$/2\}, \{$\varphi$, $\pi$ - 0.1, $\pi$\},\\ \phantom{Ingr=}BoundaryStyle $\to$ \{Red, Thick\}, Mesh $\to$ None, PlotRange $\to$ 1.2]\};$$

    А теперь посмотрим все сразу с помощью $$\text{\tt Show}$$ и, окончательно, увидим лист Мебиуса, заклеивающий границу диска:

    $$\tt In[119]:=Show[gr]$$

    Покажем теперь, как можно раскрасить поверхность в соответствии с ее гауссовой кривизной. Сначала вычислим кривизну:

    $$ In[120]:=\\ \phantom{In}ClearAll[r, к, u, v, norm, iiForm];\\ \phantom{In}iForm[r\_][u\_, v\_] := Module[\{ru, rv\},\\ \phantom{IniFo}ru = D[r[u, v], u]; rv = D[r[u, v], v];\\ \phantom{IniFo}$\begin{pmatrix} ru.ru ru.rv \\ ru.rv rv.rv \\ \end{pmatrix}$\\ \phantom{IniF}];\\ \phantom{In}norm[r\_][u\_, v\_] := Module[\{ru, rv, nn\},\\ \phantom{Innor}ru = D[r[u, v], u]; rv = D [r[u, v], v]; nn = Cross[ru, rv];\\ \phantom{Innor}$\frac{nn}{\sqrt{nn.nn}}$\\ \phantom{Inno}];\\ \phantom{In}iiForm[r\_][u\_, v\_] := Module[\{ruu, ruv, rw, n\},\\ \phantom{IniiF}n = norm[r][u, v];\\ \phantom{IniiF}ruu = D [r[u, v], u, u]; ruv = D[r[u, v], u, v];\\ \phantom{IniiF}rvv = D [r[u, v], v, v];\\ \phantom{IniiF}$\begin{pmatrix} ruu.n ruv.n \\ ruv.n rw.n \end{pmatrix}$\\ \phantom{Inii}];\\ \phantom{In}k[r\_][u\_, v\_] := $\frac{\text{Det}[\text{iiForm}[r][u,v]]}{\text{Det}[\text{iForm}[r][u,v]]}$; $$

    Параметризуем тор:

    $$\tt In[125]:=\\ \phantom{In}ClearAll[R, r, $\varphi$, $\psi$, torus, g, kMax, kMin, kRescaled];\\ \phantom{In}res=$\begin{pmatrix} \text{Cos}[\varphi] \text{-Sin}[\varphi] 0\\ \text{Sin}[\varphi] \text{Cos}[\varphi] 0\\ 001 \end{pmatrix}$.(\{0, R, 0\} + \{0, rCos[$\psi$], rSin[$\psi$]\})\\ \phantom{Inres}Simplify;\\ \phantom{In}R = 3; r = 1; \\ \phantom{In}torus[$\varphi$\_, $\psi$\_] := \{-(R + rCos[$\psi$]) Sin[$\varphi$], Cos[$\varphi$](R + rCos[$\psi$]),\\ \phantom{Inres}RSin[$\psi$]\}; \end{pmatrix}$$

    Масштабируем кривизну так, чтобы она принимала значения от 1 до 1/2:

    $$\tt In[129]:=g[u\_, v\_]=k[torus][u, v] // Simplify;\\ \phantom{In[129]:=}kMax = Maximize[g[u, v], \{u, v\}][\!\![1]\!\!];\\ \phantom{In[129]:=}kMin = Minimize[g[u, v], \{u, v\}][\!\![1]\!\!];\\ \\ In[132]:=kRescaled[u\_, v\_] := $\frac{g[u,v]\text{-kMin}}{1.2(\text{kMax-kMin})}$; $$

    Теперь раскрашиваем тор с помощью ColorFunction:

    $$\tt In[133]:=ParametricPlot3D[torus[$\varphi$, $\psi$], \{$\varphi$, 0, 2$\pi$\}, \{$\psi$, 0, 2$\pi$\},\\ \phantom{In[133]:=P}Boxed $\to$ False, Axes $\to$ False,\\ \phantom{In[133]:=P}ColorFunction $\to$ Function[\{x, y, z, u, v\},\\ \phantom{In[133]:=PCo}Hue[kRescaledfu, v]]], ColorFunctionScaling $\to$ False,\\ \phantom{In[133]:=P}Mesh $\to$ None]$$

    или седловую поверхность:

    $$\tt In[134]:=\\ \phantom{In}sadd[x\_, y\_] := \{x, y, x$^2^ - y$^2$};\\ \phantom{In}kM[x\_, y\_] := k[sadd][x, y] // Simplify;\\ \phantom{In}kMax = Maximize[kM[u, v], u$^2$ + v$^2$ $\le$ 2, \{u, v\}][\!\![1]\!\!];\\ \phantom{In}kMin = Minimize[kM[u, v], \{u, v\}][\!\![1]\!\!];\\ \phantom{In}kRes[u\_, v\_]=$\frac{\text{kM}[u,v]-\text{kMin}}{1.4 (\text{kMax-kMin})}$;\\ \phantom{InP}ParametricPlot3D[sadd[x, y], \{x, -2, 2\}, \{y, -2, 2\},\\ \phantom{InP}Boxed $\to$ False, Axes $\to$ False,\\ \phantom{InP}RegionFunction $\to$ Function[\{x, у, z, u, v\}, (x$^2$ + y$^2$ < 1/2)],\\ \phantom{InP}ColorFunction $\to$ Function[\{x, y, z, u, v\}, Hue[kRes[х, y]]],\\ \phantom{InP}ColorFunctionScaling $\to$ False, Mesh $\to$ False,\\ \phantom{InP}BoundaryStyle $\to$ \{Thick, Blue\}]$$

    Поверхности уровня удобно рисовать с помощью $$\text{\tt ContourPlot3D}$$, в аргументах которой указывается функция, интервалы значения переменных, какие (или сколько именно) значения функции рисовать ($$\text{\tt Contours}$$ приписывается количество значений или их список), директивы, описывающие, как именно рисовать поверхности ($$\text{\tt ConourStyle}$$ приписывается список директив)):

    $$\tt In[140]:=\\ \phantom{In}ContourPlot3D[x$^2$ + у$^2$ - z$^2$, \{x, -2, 2\}, \{у, -2, 2\}, \{z, -2, 2\},\\ \phantom{InC}Contours $\to$ \{-1, 0, 1\},\\ \phantom{InC}ContourStyle $\to$ Мар[\{\#, Opacity[0.5]\} \, \{Blue, Red, Yellow\}],\\ \phantom{InC}Mesh $\to$ None, RegionFunction $\to$ (\#1$^2$ + \#2$^2$ < 2 \)] $$

    Следующие команды $$\text{\tt ListPlot3D, ListPointPlot3D, ListSurfacePlot3D}$$ служат для визуализации дискретных наборов чисел:

    $$\tt In[141]:=\{ListPlot3D[\{\{l, 2, 3, 4\}, \{1, 1, 1, 1\}, \{4, 3, 2, 1\},\\ \phantom{In[141]:=\{Li}\{4, 4, 4, 4\}\}, Mesh $\to$ All],\\ \phantom{In[141]:=\{}ListPlot3D[\{\{l, 2, 3, 4\}, \{1, 1, 1, 1\}, \{4, 3, 2, 1\},\\ \phantom{In[141]:=\{Li}\{4, 4, 4, 4\}\}, Mesh $\to$ None, InterpolationOrder $\to$ 0],\\ \phantom{In[141]:=\{}ListPlot3D[\{\{l, 2, 3, 4\}, \{1, 1, 1, 1\}, \{4, 3, 2, 1\},\\ \phantom{In[141]:=\{Li}\{4, 4, 4, 4\}\}, Mesh $\to$ None, InterpolationOrder $\to$ 3]\}$$ $$\tt In[142]:=\\ \phantom{In}\{ListPointPlot3D[Table[i$^2$ - j$^2$, \{i, -1, 1, 0.1\},\\ \phantom{In\{Li}\{j, -1, 1, 0.1\}]],\\ \phantom{In\{}ListPointPlot3D[Table[i$^2$ - j$^2$, \{i, -1, 1, 0.1\}, \{j, -1, 1, 0.1\}],\\ \phantom{In\{L}Filling $\to$ Bottom]\}$$

    Наконец, $$\text{\tt ListSurfacePlot3D}$$ служит для визуализации набора точек в пространстве:

    $$\tt In[143]:=\\ \phantom{In}ListSurfacePlot3D[\\ \phantom{InL}Flatten[Table[\{i, j, i$^2$ - j$^2$\}, \{i, -1, 1, 0.1\}, \{j, -1, 1, 0.1\}],\\ \phantom{InLi}1]]$$

    а команда $$\text{\tt RegionPlot3D}$$ - для изображения множеств, заданных неравенствами:

    $$\tt In[144]:=RegionPlot3D[-1$\le$х$\le$1 \\ -1$\le$у$\le$1 \\ -0.2$\le$z$\le$0.2 \\\\ \phantom{In[144]:=Re}Not[-1/2$\le$х$\le$1/2 \\ -1/2$\le$у$\le$1/2], \{х, -2, 2\},\\ \phantom{In[144]:=R}\{у, -2, 2\}, \{z, -2, 2\}, Mesh $\to$ None, PlotPoints $\to$ 50,\\ \phantom{In[144]:=R}Axes $\to$ None, Boxed $\to$ False, PlotStyle $\to$ \{Pink\}]$$
    Вернуться к учебному плану