Лекция 2. Графика: основные принципы.

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

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

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

Graphics[<primitives>, <options>]  (* для двумерной графики*)
Graphics3D[<primitives>, <options>] (* для трехмерной графики*)

Например,

Graphics[Circle[]]
Graphics3D[Sphere[]]
g=Graphics[Disk[]];

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

g

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

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

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

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

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

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

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

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

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

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

{Graphics[{Arrow[{{0,0},{2,1}}],Circle[{0,0},0.3],Circle[{2,1},0.3],Point[{{0,0},{2,1}}]}],Graphics[{Arrow[{{0,0},{2,1}},.3],Circle[{0,0},0.3],Circle[{2,1},0.3],Point[{{0,0},{2,1}}]}],Graphics[{Arrow[{{0,0},{2,1}},{.3,.1}],Circle[{0,0},0.3],Circle[{2,1},.3],Point[{{0,0},{2,1}}]}]}

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

{Graphics[{Arrowheads[{-.1,.1}],Arrow[{{0,0},{2,1}}],Circle[{0,0},0.3],Circle[{2,1},0.3],Point[{{0,0},{2,1}}]}],Graphics[{Arrowheads[{-.1,.2}],Arrow[{{0,0},{2,1}},.3],Circle[{0,0},0.3],Circle[{2,1},0.3],Point[{{0,0},{2,1}}]}],Graphics[{Arrowheads[{-0.1,-.05,.05,.1}],Arrow[{{0,0},{2,1}},{.3,.1}],Circle[{0,0},0.3],Circle[{2,1},.3],Point[{{0,0},{2,1}}]}]}

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

{Graphics[{Arrowheads[{{-.1,0},{-.2,.2},.1}],Arrow[{{0,0},{2,1}}],Circle[{0,0},0.3],Circle[{2,1},0.3],Point[{{0,0},{2,1}}]}],Graphics[{Arrowheads[{{-.1,0},{-.05,.2,Graphics[{Red,Circle[]}]},.1}],Arrow[{{0,0},{2,1}},.3],Circle[{0,0},0.3],Circle[{2,1},0.3],Point[{{0,0},{2,1}}]}]}

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

{Graphics[Circle[{0,0},1,{(π/3),((4π)/3)}]],Graphics[Circle[{0,0},{2,3}]]}

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

Inv[a_]:=(a/(a.a)); (* Инверсия *)
Mediatr[a_,b_]:=Module[{m,n},    (* Уравнение серединного перепндикуляра к отрезку *)
m=((a+b)/2); n={b[[1]]-a[[1]],b[[2]]-a[[2]]};
(x-m[[1]])n[[1]]+(y-m[[2]])n[[2]]==0
];
ATan[x_,y_]:= If[x==0,If[y>0,-(π/2),(π/2)],ArcTan[(y/x)]];  (* Удобный арктангенс*)
(* искомая дуга *)
LSeg[a_,b_]:=Module[{dt,ia,o,r,eq1,eq2,res,d,α,ax,φ},
dt=a[[1]]b[[2]]-a[[2]]b[[1]];
If[Abs[dt]<(10^(-10)),Line[{a,b}], (* точки a и b лежат на одном диаметре *)
(* окружность, перпендикулярная абсолюту, переходит при инверсии в себя *)
ia=Inv[a]; (* искомая окружность проходит и через эту точку*)
eq1=Mediatr[a,b];
eq2=Mediatr[b,ia];
res=Solve[{eq1,eq2},{x,y}]//Flatten;
o={x,y}/.res; (* центр (искомой) окружности, проходящей через a, b и ia *)
r=(Sqrt[(o-a).(o-a)]); (* радиус искомой окружности*)
d=(Sqrt[(b-a).(b-a)]);
α=ArcSin[(d/(2r))]; (* половина искомой дуги *)
ax=o-((a+b)/2); (* вектор, направленный из центра o на середину искомой дуги *)
(* угол между осью авсцисс и направлением вектора ax *)
If[ax[[1]]≤0,φ=ATan[ax[[1]],ax[[2]]],φ=π+ATan[ax[[1]],ax[[2]]]];
Circle[o,r,{φ-α,φ+α}]
]
];
Manipulate[Graphics[{Circle[],{Thick,Green,LSeg[p[[1]],p[[2]]]}}],
{{p,{{-1/2,-1/2},{1/3,-1/3}}},Locator}]

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

{Graphics[{Orange,Disk[{0,0},1,{π/3,5π/3}]}],Graphics[{Green,Disk[{0,0},{3,2}]}]}

4. Примитив Line позволяет рисовать сразу несколько ломаных. Вот, скажем, две ломаных, отличающиеся на параллельный перенос на вектор a

ll={{1,0},{2,3},{-1,2}};
a={1,.2};
Graphics[Line[{ll,Map[a+#&,ll]}]]

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

{Graphics[Polygon[Table[{Cos[i ((2π)/7)],Sin[i((2π)/7)]},{i,0,6}],VertexColors->{Red,Orange,Yellow,Green,Cyan,Blue,Magenta}]],Graphics[Polygon[Table[{Cos[i ((2π)/7)],Sin[i((2π)/7)]},{i,0,6}],VertexColors->{Orange,White,Orange,White,Orange,White,Orange}]]}

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

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

Graphics[{Circle[],Text["Это окружность", {0,0},Automatic,{1,1},Background-> LightRed],Text[Style[x^2+y^2==1,15,Bold],{1/2,0},FormatType->TraditionalForm]}]

Прежде чем перейти к полному списку графических директив, перечислим оставшиеся примитивы. Это 
   	  8. Inset: служащий для вставки одного объекта внутрь другого, например, подписи к рисункам; 
   	  9. Raster: изображающий прямоугольник, разбитый на раскрашеные квадратики заданных цветов;
   	10. Locator: служит для создания динамического элемента графики, позволяющего вводить координаты текущей точки экрана;
   	11. GraphicsGroup: служит для объединения объектов в группу, которая может быть отредоктирована как единое целое;
   	12. GraphicsComplex: важный элемент графики, позволяющий отдельно задавать структуру одномерного, двумерного или трехмерного комплекса (набора примитивов), и отдельно задавать координаты определяющих их точек. Формат: GraphicsComplex[координаты вершин, структура]. При этом в структуре вершины задаются уже только своими номерами в списке вершин. Приведем пример. Здесь список вершин состоит из 6 элементов (первые три - вершины треугольника, оставшиеся три - середины его сторон).

a={-1,-1};b={1,-1};c={0,1}; 
v={a,b,c}~Join~{((b+c)/2),((a+c)/2),((b+a)/2)};
Graphics[GraphicsComplex[v,{Thin,Line[{1,2,3,1}],Green,Thick,Line[{1,4}],Line[{2,5}],Line[{3,6}],Red,PointSize[Large],Point[{1,2,3}],Blue,PointSize[Medium],Point[{4,5,6}]}]]

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

Manipulate[Graphics[GraphicsComplex[a~Join~{((a[[2]]+a[[3]])/2),((a[[1]]+a[[3]])/2),((a[[2]]+a[[1]])/2)},{Thin,Line[{1,2,3,1}],Green,Thick,Line[{1,4}],Line[{2,5}],Line[{3,6}],Red,PointSize[Large],Point[{1,2,3}],Blue,PointSize[Medium],Point[{4,5,6}]}],PlotRange-> 1.5],{{a,{{-1,-1},{1,-1},{0,1}}},Locator}]

Директивы

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

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

colors={Red,Green,Blue,Cyan,Magenta,Yellow,Brown,Orange,Pink,Purple,
LightRed,LightGreen,LightBlue,LightCyan,LightMagenta,LightYellow,LightBrown,LightOrange,LightPink,LightPurple};
cl=Partition[Map[Apply[List,#]&,colors],10];
Graphics[Raster[cl]]

Graphics[Raster[{Map[#[[1]]&,{Black,White,Gray,LightGray}]}]]

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

Manipulate[Graphics[{RGBColor[r,g,b],Rectangle[{0,0},{1,1/3}]}],{r,0,1},{g,0,1},{b,0,1}]

Manipulate[Graphics[{CMYKColor[c,m,y,k],Rectangle[{0,0},{1,1/3}]}],{c,0,1},{m,0,1},{y,0,1},{k,0,1}]

Управление с помощью функции Hue может быть как однопараметрическим  (от красного к фиолетовому и обратно), так и трёх и четырех параметрическим (Hue, Saturation, Brightness,Opacity__).

Manipulate[Graphics[{Hue[t],Rectangle[{0,0},{1,1/3}]}],{t,0,2}]

Graphics[Table[{Hue[h],EdgeForm[Gray],Rectangle[{32h,0}]},{h,0,1,1/32}]]

Также однопараметрически задаются оттенки серого функцией GrayLevel

Manipulate[Graphics[{GrayLevel[t],Rectangle[{0,0},{1,1/3}]}],{t,0,1}]

Абсолютные и относительные характеристики

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

Размер точки

Graphics[Table[{Hue[1/i],AbsolutePointSize[i],Point[{i,0}]},{i,1,20}]]

Graphics[Table[{PointSize[1/(2^(i-1))],Hue[1/i],Point[{0,0}]},{i,1,5}]]

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

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

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

Graphics[{AbsoluteDashing[{1,5,10}],Line[{{0,0},{1,1}}],Circle[],Dashing[{.1,.2}],Line[{{0,0},{1,-1}}],Circle[{0,0},1/2]}]

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

Graphics[{Dotted,Line[{{0,0},{1,1}}],Dashed, Circle[],DotDashed,Line[{{0,0},{1,-1}}]}]

Толщина линии

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

AbsoluteThickness[r] (* абсолютная толщина *)
Thickness[r]  (* относительная толщина *)
Thin
Thick

Graphics[{AbsoluteThickness[5],Line[{{0,0},{1,1}}],Thickness[0.05], Circle[],Thin,Line[{{0,0},{1,-1}}]}]

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

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

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

{Graphics[{EdgeForm[{Thickness[0.5],Dashed,Orange}],Red,Disk[]}],Graphics[{EdgeForm[{AbsoluteThickness[0.2],Blue,Dashing[{0.01,.01}]}],Cyan,Disk[]}]}

Graphics[{{EdgeForm[{Thickness[0.5],Dashed,Orange}],Red,Disk[{0,0},1]},{EdgeForm[{AbsoluteThickness[0.2],Blue,Dashing[{0.01,.01}]}],FaceForm[Opacity[0.15],Cyan],Disk[{1,0},1]}}]

Директива Directive

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

Опции

Mathematica также предусматривает множество опций, помогающих придать рисунку удобный, понятный и изящный вид. Общий вид опций следующий: Имя_опции -> значение

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

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

{Graphics[{FaceForm[{Opacity[0.45],Orange}],Disk[]},Frame-> True],Graphics[{FaceForm[{Opacity[0.55],Orange}],Disk[]},Axes-> True],Graphics[{FaceForm[{Opacity[0.65],Orange}],Disk[]},Frame-> True,GridLines->Automatic],Graphics[{FaceForm[{Opacity[0.75],Orange}],Disk[]},Axes-> True,GridLines->Automatic]}

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

Graphics[{FaceForm[{Opacity[0.65],Orange}],Disk[]},Axes->True,AxesOrigin->{-1,-1},AxesLabel-> {"Ширина",y}, LabelStyle->Directive[Red,Medium,Italic],AxesStyle-> Thick,Ticks->{{-1/3,-2/3,{0,"Zero",{0.5,0.03},Directive[Green,Thin]},1/2,1},Automatic}]

Имеются аналогичные опции для работы с Frame.

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

PlotRange явно указывает какую область рисунка рисовать (в координатах).

{Graphics[Circle[],PlotRange-> {0,1},Frame->True],Graphics[Circle[],PlotRange-> {{0,1},{0,1}},Frame->True],Graphics[Circle[],PlotRange-> 2,Frame->True]}

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

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

Graphics[Circle[],PlotRange->{0,1},ImageSize->{100,200},Frame->True,Background->Orange]

AspectRatio регулирует отношение высоты рисунка (а не образа) к его ширине.

{Graphics[Circle[],AspectRatio->Automatic,ImageSize-> {100,100},Frame->True,Background->Yellow],Graphics[Circle[],AspectRatio->1/2,ImageSize-> {100,100},Frame->True,Background->Yellow],Graphics[Circle[],AspectRatio->2,ImageSize-> {100,100},Frame->True,Background->Yellow]}

Отступ от краев прямоугольника образа (наружу) может быть также явно задан с помошью опции ImageMargins

{Graphics[Circle[],PlotRange->{0,1},ImageSize->{100,200},Frame->True,Background->LightOrange],Graphics[Circle[],PlotRange->{0,1},ImageSize->{100,200},Frame->True,Background->LightOrange,ImageMargins->20],Graphics[Circle[],PlotRange->{0,1},ImageSize->{100,200},Frame->True,Background->LightOrange,ImageMargins->{{10,60},{30,60}}]}

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

{Graphics[Circle[],PlotRange->{0,1},ImageSize->{100,200},Frame->True,Background->LightOrange],Graphics[Circle[],PlotRange->{0,1},ImageSize->{100,200},Frame->True,Background->LightOrange,ImagePadding->20],Graphics[Circle[],PlotRange->{0,1},ImageSize->{100,200},Frame->True,Background->LightOrange,ImagePadding->{{10,20},{30,40}}],Graphics[Circle[],PlotRange->{0,1},ImageSize->{100,200},Frame->True,Background->LightOrange,ImagePadding->{{10,20},{30,40}},PlotRangeClipping->True]}

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

{Graphics[Circle[],PlotRange->{0,1},Frame->True,Background->LightOrange],Graphics[Circle[],PlotRange->{0,1},Frame->True,Background->LightOrange,PlotRangePadding->(1/2)],Graphics[Circle[],PlotRange->{0,1},Frame->True,Background->LightOrange,PlotRangePadding->1/2,PlotRangeClipping->True]}

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

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

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

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

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

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

Table[Graphics3D[{Specularity[Red,s],Black,Sphere[]},Boxed->False,ImageSize->150],{s,{0,1,2,10,100}}]

{Graphics3D[{Glow[Red],Black,Cuboid[]},Boxed->False,ImageSize->150],Graphics3D[{Glow[Red],White,Cuboid[]},Boxed->False,ImageSize->150]}

Кроме того, с помощью FaceForm можно теперь задавать разные цвета для разных сторон поверхности.

Graphics3D[{FaceForm[Blue,Orange],Sphere[]},PlotRange->{{-1,1},{-1/2,1/2},{-1,1}},Boxed->False]

В опциях Frame заменяется на Boxed, добавляется источник света Lighting и опции, характеризующие "точку зрения" наблюдателя и др. характеристики образа.

{Graphics3D[{FaceForm[Blue,Orange],Sphere[]},PlotRange->{{-1,1},{-1/2,1/2},{-1,1}},Boxed->False,Lighting-> {{"Point",White,{0,0,0}}}],
Graphics3D[{FaceForm[Blue,Orange],Sphere[]},PlotRange->{{-1,1},{-1/2,1/2},{-1,1}},Boxed->False,Lighting-> {{"Point",White,{2,2,2}}}],
Graphics3D[{FaceForm[Blue,Orange],Sphere[]},PlotRange->{{-1,1},{-1/2,1/2},{-1,1}},Boxed->False,Lighting-> {{"Ambient",White}}],Graphics3D[{FaceForm[Blue,Orange],Sphere[]},PlotRange->{{-1,1},{-1/2,1/2},{-1,1}},Boxed->False,Lighting-> Automatic]}

Manipulate[Graphics3D[{FaceForm[Blue,Orange],Sphere[]},PlotRange->{{-1,1},{-1/2,1/2},{-1,1}},Boxed->False,ViewPoint->{x,y,z}],{x,-3,3},{y,-3,3},{z,-3,3}]