Таблица 18
Функция | Функция обеспечивает создание и вывод: |
cylinderplot | поверхности в цилиндрической системе координат |
matrixplot | поверхности, основанной на значениях входов матрицы |
polyhedralplot | многогранника на основе заданных точек либо типов граней |
polyhedra_supported() - множества имен фигур, выводимых по polyhedralplot | |
spacecurve | пространственных кривых |
sphereplot | поверхности в сферической системе координат |
surfdata | поверхности, основанной на значениях координат точек |
replot | графика для модифицированной {2D|3D}_ГО-структуры |
tubeplot | трубчатых поверхностей вогруг пространственных кривых |
Некоторые из представленных в табл. 18 графических функций допускают использование дополнительно к рассмотренным plot3d-опциям и специальных опций, управляющих режимом создания и вывода 3D-ГО. Следует иметь в виду, что глобальные установки ряда plot3d-опций, сделанные посредством setoptions3d-функции, не распространяются на некоторые графические функции, поддерживаемые plots-модулем, поэтому их следует определять локально непосредственно в момент вызова функции. Детальнее с форматами кодирования и назначением данных функций можно ознакомиться в книгах [79-85] либо в справке по пакету. Мы ограничимся лишь некоторыми примерами их применения, учитывая относительно несложное освоение этих средств при практической работе в среде языка пакета, а также краткими пояснениями.
> restart; with(plots): Fmt:= matrix(2, 3, [[64, 59, 39], [44, 17, 10]]): F:= [TIMES, BOLD, 14]: > Sp:= sphereplot([sin(v)*cos(u), sin(v), cos(u)], u= 0..Pi, v= -Pi..Pi, orientation= [6, 72], color=u+v, title=``, shading=ZHUE): T:= textplot3d([0, 0.4, 0, `RAC_IAN_REA_RANS`], font= [TIMES, BOLDITALIC, 18]): matrixplot(Fmt, heights= histogram, axes= frame, gap=0.3, style=patch, labels=[``, ``, `Age `], labelfont=F, axesfont=F, title="Diagram on the basis of matrixplot-function", shading=ZHUE, titlefont= subs(14=20, F)): display3d(Sp, T, color=red): %; %%%; polyhedraplot([64, 59, 39], polytype=icosahedron, orientation=[65, 44], thickness=2);
Warning, the name changecoords has been redefined
Читатель и сам может создать интересные 3D-ГО, использующие как plot3d-функцию, так и средства из пакетного модуля plots. Это весьма полезное и интересное упражнение.
Средства анимации графических 3D-объектов. Выше механизм анимации, поддерживаемый Maple, был на содержательном уровне рассмотрен для случая 2D-графики. С очевидными изменениями он переносится и на случай 3D-размерности, поэтому более детально данный вопрос анимации нами здесь не рассматривается. Модульная функция animate3d имеет следующий формат кодирования:
animate3d(<Функция>, <X-диапазон>, <Y-диапазон>, <А-диапазон> {, <Опции>})
где график функции либо нескольких функций представляет собой непосредственно анимируемый объект. Функция F(X, Y, A) должна быть действительной от трех аргументов X, Y и A, где X,Y-аргументы определяют собственно ведущие переменные, а А-аргумент – переменную анимации. Обязательные второй, третий и четвертый фактические аргументы animate3d-функции должны принимать действительные значения. Если Xдиапазон и Y-диапазон определяют отображаемую область выводимого 3D-графика функциональной зависимости, то А-диапазон – определяет режим изменения координат при смене фреймов в процессе анимации. В качестве первого фактического аргумента функции animate3d допускаются: одна либо более функций (включая заданные параметрически; кодируются в виде множества функций) и Maple-процедуры.
В качестве фактического необязательного аргумента animate3d-функция допускает использование plot3d-опций, рассмотренных выше, а также специальной frames-опции, определяющей число участвующих в процессе анимации фреймов (по умолчанию полагается frames=8). Механизм создания набора (цикла) фреймов и организация их смены, собственно составляющих суть процесса анимации, полностью соответствуют (с очевидными изменениями) 2D-случаю, рассмотренному выше, и здесь детально не обсуждаются.
По animate3d-функции создается графическая структура следующего вида:
PLOT3D(ANIMATE([3D-ГО_1, 3D-ГО_2, ..., 3D-ГО_n)))
где 3D-ГО_k представляет собой базовую графическую plot3d-структуру GRID-типа для к-го фрейма анимируемого ГО, организация которой рассматривалась нами выше. На основе знания организации animate-структуры относительно несложно можно осуществлять ее редактирование, расширяя тем самым возможности анимации. Однако в случае 3D-ГО это представляется более трудоемкой процедурой, чем в 2D-случае и ее проведение может потребоваться лишь в случае достаточно продвинутого программирования обработки графической информации в среде Maple-языка [11-14,88,110,112-120].
Выбор анимируемого 3D-ГО переводит ядро в режим анимации с одновременным выходом в графическое подокно 3D-анимации, имеющее практически тот же вид, что и окно анимации для 2D-случая за исключением одного естественного отличия. Если для случая 2D-анимации 4-я строка окна содержала поле с координатами выбранной точки области 2D-ГО, то для случая 3D-анимации на этом месте располагаются поля-регуляторы значений углов поворота в горизонтальной (v-окно) и вертикальной (ϕ-окно) плоскостях. Через эти же поля-регуляторы можно изменять значения указанных углов поворота, определяющих ориентацию 3D-ГО в пространстве. В остальном же оба окна анимации идентичны как по структуре, так и по функциональному наполнению, а также по принципу предоставляемых ими средств для управления процессом анимации.
С учетом сказанного проиллюстрируем принцип работы с анимируемым 3D-ГО на следующем простом фрагменте с учетом статичности книжной иллюстрации:
> with(plots): Fnt:= [TIMES, BOLDITALIC, 18]: setoptions3d(font=Fnt, titlefont=Fnt): T:= textplot3d([2, 0, 2, "RAC_IAN_REA_RANS"], color=red, font=Fnt): S:=plot3d({-x^2-y^2 + 17, x^2 + y^2 - 17}, x=-3..3, y=-3..3): display3d(S, T, insequence=true, orientation=[-9, 90]);По вызову with(plots) обеспечивается доступ ко всем средствам plots-модуля, включая и animate3d-функцию, и посредством setoptions3d-функции делаются глобальные установки для plot3d-функций, определяющих объекты для анимации. В первом примере фрагмента определяются две 3D-графические структуры типов GRID (S) и TEXT (T), для которых определяется общий анимируемый 3D-ГО на основе display3d-функции с опцией insequence=true. Процесс анимации состоит в чередовании двух фреймов, определенных указанными выше 3D-структурами. В частности, display-функции особенно полезны в случае необходимости анимации ГО, определяемых списочными структурами значений координат их точек, а также графическими примитивами. Последние два примера фрагмента иллюстрируют анимацию как единственного, так и двух 3D-ГО, заданных параметрически, на основе animate3d-функции. В примерах фрагмента используется ряд опций plot3d, управляющих как созданием фреймов для обеспечения процесса анимации, так и визуализацией собственно самого процесса анимации. Вместе с тем, иллюстрация процесса анимации в отрыве от ПК носит достаточно условный характер.
Вызов animate3d-функции возвращает график анимируемого 3D-ГО, точнее его первый фрейм. Последующее его выделение (визуализируется рамкой ГО) переводит ядро в состояние графического подокна animation, структура которого, практически, одинакова для 2D- и 3D-случаев. Для дальнейшего управления процессом анимации выделенного ГО вполне достаточно средств 4-й строки подокна. Однако, в целом ряде случаев возникает необходимость выделения из анимируемой цепочки фреймов выделить отдельный. Данная задача решается несложной процедурой frame_n. Вызов процедуры frame_n(d, F, x, {, y} , t {, gopt} {, frame=n}) возвращает n-й фрейм анимируемого объекта, определяемого теми же фактическими аргументами, что и для процедуры animate{3d}. Детальнее с данной процедурой и примерами ее применения можно ознакомиться в [41,103,109].
frame_n := proc(d::{2, 3}, F) local as; if type(args -1[ ], 'equation') and lhs args[-1]( ) = 'frame' then if belong(rhs args[-1]( ), rhs args[( d + 2])) then as := plots[`if`(d = 2, 'animate', 'animate3d')](args 2 .. -2[ ]); return plots[display](op(op(as)[1])[rhs(args[-1])]) else error "<%1> is inadmissible value for the frame number"rhs(, args -1[ ]) end if end if; plots [`if`(d = 2, 'animate', 'animate3d')](args 2 .. -1[ ]) end proc |
Читателю в порядке как полезного, так и захватывающего по зрелищности упражнения рекомендуется практическое освоение средств анимации пакета на различного рода примерах. В подавляющей мере сказанное относительно процесса анимации 2D-ГО переносится и на случай 3D-ГО. В частности, копируется в СБО (Clipboard) также только первый фрейм анимируемого 3D-ГО. Данное обстоятельство следует иметь ввиду.
Рассмотренные выше графические средства языка позволяют как создавать графическую структуру данных на основе требований пользователя (функциональная зависимость, массив или матрица данных, списочная структура и др.), так и выводить созданный на их основе графический объект, определяя для него целый ряд характеристик, обеспечиваемых как базовыми {plot, plot3d}-опциями, так и специальными опциями, связанными со спецификой той или иной графической функции. При этом, базовые функциональные средства обеспечиваются plot-функцией и plot-опциями, тогда как расширенные – средствами plots-модуля пакета, рассмотренными в предыдущих разделах главы.