Дополнительно к отмеченным, нами был создан еще ряд средств, полезных для работы с графическими объектами. Так, следующий фрагмент предоставляет две процедуры, позволяющие тестировать корректность графических {plot|plot3d}-опций.
type/plotopt := proc(po::equation) local a b, ; assign(b = interface(warnlevel)), interface(warnlevel = 0); try a := plot ,(I po) catch : return false, null interface(( warnlevel = b)) end try ; true, null interface(( warnlevel = b)) end proc type/plot3dopt := proc(po::equation) local a; try a := plot3d 1, .. ,( 0 1 0 .. 1, po) catch : return false end try ; true end proc > map(type, [thickness=2, color=aaa, font=[TIMES, BOLD, 16]], 'plotopt'); [true, false, true] > map(type, [filled=FAIL, scaling=CONSTRAINED, style=WIREFRAME], 'plot3dopt'); [false, true, true] |
Вызов процедуры type(x, plotopt) возвращает true-значение, если x - корректная plot-опция, и false-значение иначе. Очевидно переносится это и на вызов type(x, plot3dopt).
Вызов процедура p3listlist возвращает список [[x1,y1, F(x1,y1)], ..., [xn, yn, F(xn, yn)]] типа listlist, обеспечивая конвертацию структуры 3D-GRID Array-типа в список. Процедура полезна при обработке PLOT3D-структур, например, при числовой обработке 3D-ГО.
p3listlist := proc(P::function) local a b c d, , , ; if convert(P, 'string')[1 .. 6] ≠ "PLOT3D" then error "factual argument should be PLOT3D data structure, but has received %1", P else assign(a = [op(1, op(P)[1]), op(2, op(P)[1])], c = op(3, op(P)[1])); b := [rhs(op 2,( c)[1]), rhs(op 2,( c)[2])]; if nargs = 2 and type(args 2[ ], 'symbol') then assign(args 2[ ] = c) end if; d := [(rhs(a[1]) − lhs( [a 1]))/(b[1] − 1), (rhs(a[2]) − lhs( [a 2]))/(b[2] − 1 ]) ; assign('a' = map(lhs, [a[1], a[2]])), [seq( seq([a[2] + d[2]×k, a[1] + d[1]×j, c[k + 1, j + 1]], j = 0 .. b[2] − 1), k = 0 .. b[1] − 1)] end if end proc |
Следует помнить, что не все определенные явно опции можно переопределять в GUI. Переходим теперь к рассмотрению функциональных средств Maple-языка, поддерживающих работу с 3D-графикой. Изложение в целях удобства и приемственности проводится аналогично контексту 2D-графики в виду того, что различия 2D- и 3D-графических средств в значительной мере определяются размерностью при большой их общности.
Графические средства Maple-языка по представлению 3-мерных функциональных зависимостей во многом аналогичны средствам для 2-мерного случая, между тем, здесь имеется и ряд принципиальных отличий, которые будут рассмотрены в этом разделе. В первую очередь, это обусловлено появлением дополнительной размерности, что определяет появление и новых свойств таких, как цветовая иллюминация поверхностей, выбор точки обзора 3D-ГО, более сложные функции расцветки поверхностей и др.
Графическое представление 3D-функциональных зависимостей. Для представления 3dфункциональных зависимостей Maple-язык располагает базовой plot3d-функцией, имеющей три основных формата кодирования, а именно:
(1) plot3d(F(x, y), x=a..b, y=c..d {, z=e..f} {, <Опции>})
(2) plot3d({F1(x, y) ,..., Fn(x, y)}, x=a..b, y=c..d {, z=e..f} {, <Опции>})
(3) plot3d([X(t, p), Y(t, p), Z(t, p)], t=a..b, p=c..d {, <Опции>})
и возвращающей 3D-ГО в виде графика соответственно единственной функции, определенной функциональным F(x, y)-выражением по ведущим (x, y)-переменным, нескольких функций, определенных списком [F1(x, y) ,...., Fn(x, y)], и параметрически заданной функции, определенных на диапазонах a..b и c..d значений (x, y)-переменных (t, p-параметров) в единой системе декартовых (X, Y, Z)-координат. Так как plot3d-функция возвращает 3D-ГО только с вычисляемыми (X, Y, Z)-точками, то для обеспечения этого требования предполагается, что функциональные зависимости являются действительными. В дальнейшем предполагается, что все графические функции, возвращающие графики (точнее графические структуры данных) функциональных 3D-зависимостей, требуют действительных значений над областью их определения, аналогично 2D-случая.
Первые три аргумента каждого формата plot3d-функции, в общем случае, обязательны
(о них будет уточнено несколько ниже), определяя соответственно функциональную зависимость и области значений ее ведущих переменных, тогда как четвертый аргумент первых двух форматов необязателен и определяет выводимый диапазон значений функциональной зависимости. Как правило, данный аргумент не кодируется во избежание возможной потери частей выводимого графика. Наконец, в качестве необязательного пятого аргумента всех форматов plot3d-функции допускается использование специальных графических опций, управляющих режимами создания, вывода и оформления 3D-ГО.
В качестве первого фактического аргумента plot3d-функция допускает использование: (1) действительной функции или выражения от двух ведущих переменных, (2) Maple-процедуры и (3) параметрически определенной функции. В случае процедуры используется в общем случае конструкция вида plot3d(Proc, a..b,c..d). При определении многофункционального графика, содержащего графики нескольких функциональных зависимостей, определяемых первым аргументом-множеством plot3d-функции, они выводятся в единой координатной сетке с возможностью различного цветового оформления. При этом, следует иметь в виду, что в отличие от рассмотренной plot-функции, в качестве определителя многофункционального графика может выступать только множество, так как список идентифицирует параметрически заданную поверхность. Расцветка многофункционального 3D-ГО также существенно отличается от случая 2D-ГО.
Функциональная зависимость, заданная параметрически (формат 3), в качестве первого аргумента plot3d-функции предполагает списочную структуру. Ее элементы определяют {X(t,p), Y(t,p),Z(t,p)}-функции координат точки графика соответственно по осям {X,Y,Z}; диапазоны изменения значений (t, p)-параметров которых кодируются вторыи и третьим фактическими аргументами 3-го формата функции. Следующий простой фрагмент иллюстрирует применение plot3d-функции для получения графиков некоторых функциональных зависимостей:
> plot3d(y^2*sin(x) + x^2*cos(y), x=-3*Pi..3*Pi, y=-3*Pi..3*Pi, grid=[59, 59], axes=framed);Ввиду своей прозрачности каких-либо пояснений данный фрагмент не требует. Ниже представлены и другие интересные примеры применения plot3d-функции.
Подобно случая 2D вывод графика производится в той же секции ТД, что и определяющая его функция plot3d (в дальнейшем такую секцию ТД будем называть графической). При этом, установка курсора на ГО производится следующее. Графический объект ограничивается прямоугольной рамкой с управляющими точками по ее углам и серединам сторон. Будем в дальнейшем ГО с визуализированной вокруг него рамкой указанного вида называть выделенным. Путем фиксации мыши на нужной управляющей точке рамки можно соответственным образом производить сжатие/растяжение ГО в плоскости по осям координат как независимо (срединные точки), так и одновременно (угловые точки).
Выделенный ГО можно копировать в СБО для последующего импортирования как в другие места текущего ТД, другие ТД, так и в другие Windows-приложения в bitmapформате. Именно такой подход использовался нами при подготовке оригинал-макета настоящей книги к публикации.
Между тем, в опреративном режиме щелчком правой клавиши мыши по выделенному ГО открывается меню, в котором выбором опции «Export As» получаем возможность сохранять ГО в файле в следующих форматах (дополнительно к случаю 2D):
Drawing Exchange Format (DXF) и Persistence of Vision (POV)
Это позволяет проводить дальнейшее редактирование ГО, например, графическими редакторами и целым рядом других подобных средств. Подобный прием может быть использован и для сохранения ГО в других форматах для последующей обработки.
Управления созданием и выводом 3D-ГО. Для управления режимом и оформлением выводимых 3D-ГО служат (подобно случая 2D) специальные опции. Опции располагаются в произвольном порядке в качестве последнего фактического аргумента plot3d-функции, т.е. являются ключевыми. Функция plot3d имеет опции согласно следующей табл. 17, в которой каждая опция определяет соответственно:
Таблица 17
Опция | Опция графической plot3d-функции определяет: |
ambientlight =[к,з,с] | интенсивность красного, зеленого и синего цветов для пользовательской схемы освещенности; {к, з, с} принимают значения из интервала [0,1] |
axes | используемый тип осей координат {normal|boxed|frame|none} (none) |
axesfont | шрифт для меток маркируемых точек осей координат (Default) |
color | функцию окрашивания точек выводимой поверхности 3D-ГО (XYZ) |
coords | используемую для вывода систему координат (cartesian) |
contours | число контурных линий для выводимой поверхности (10) |
font | шрифт для текстовой информации 3D-Г0 в виде [шрифт, стиль, размер] |
grid=[n,m] | размерность ячеек (X, Y)-сетки, в узлах которой вычисляется функция |
gridstyle | используемый тип (X, Y)-сетки; допускается {rectangular|triangular} |
labels | идентификаторы меток для осей координат (No labels) |
labelfont | шрифт для идентификаторов меток осей координат (Default) |
light | направление источника освещенности и его цветовые характеристики |
lightmodel | выбор схемы освещенности выводимой поверхности (none) |
linestyle | стиль оформления линий, образующих выводимую поверхность (0) |
numpoints | минимальное число генерируемых опорных точек поверхности (25х25) |
orientation | углы, под которыми обозревается выводимая поверхность [45o, 45o] |
projection | перспективу обзора выводимой поверхности (orthogonal) |
scaling | режим шкалирования по осям координат 3D-ГО (unconstrained) |
style | стиль оформления выводимых поверхностей (patch) |
shading | режим раскрашивания выводимой поверхности (Default) |
symbol | тип символов для точек поверхности в point-режиме (Default) |
thickness | толщину линий, образующих выводимую поверхность (0) |
title | титульный заголовок для выводимой поверхности (none) |
titlefont | шрифт для заголовка выводимой поверхности (Default) |
tickmarks | число маркируемых точек по осям координат (Default) |
view | минимальные и максимальные координаты выводимых точек 3D-ГО |
При этом, в зависимости от релиза состав и назначение графических опций уточняются.