Смекни!
smekni.com

Программирование и разработка приложений в Maple (стр. 114 из 135)

Таблица 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-ГО. Данное обстоятельство следует иметь ввиду.

7.4. Создание графических объектов на основе базовых примитивов

Рассмотренные выше графические средства языка позволяют как создавать графическую структуру данных на основе требований пользователя (функциональная зависимость, массив или матрица данных, списочная структура и др.), так и выводить созданный на их основе графический объект, определяя для него целый ряд характеристик, обеспечиваемых как базовыми {plot, plot3d}-опциями, так и специальными опциями, связанными со спецификой той или иной графической функции. При этом, базовые функциональные средства обеспечиваются plot-функцией и plot-опциями, тогда как расширенные – средствами plots-модуля пакета, рассмотренными в предыдущих разделах главы.