Смекни!
smekni.com

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

Смысл большинства опций достаточно прозрачен и полностью соответствует (с очевидными поправками на размерность) одноименным plot-опциям (табл. 15), однако требуются некоторые пояснения для новых опций, используемых plot3d-функцией, с которыми можно детально ознакомиться в [12] и в справке по пакету. Как отмечалось выше, пакет для обеспечения расширенных графических функций располагает модулем plots. В частности, он содержит setoptions3d-функцию, чей вызов позволяет переопределять значения по умолчанию для всех графических опций plot3d-функции на весь текущий сеанс. В [12] представлены рекомендации по организации эффективной работы с опциями.

Следующий фрагмент илюстрирует использование опций для управления созданием и выводом 3D-поверхностей, определяемых рядом функциональных зависимостей:

> with(plots): A:= [TIMES, BOLD, 10]: setoptions3d(axes=frame, axesfont=A, coords= cartesian, contours= 14, grid= [57, 57], font=[A[1], cat(A[2], ITALIC), 10], labelfont=A, lightmodel= light1, numpoints= 3237, thickness=2, tickmarks=[5, 5, 5], titlefont=[A[1], cat(A[2], ITALIC), 14]): plot3d({x^2*y^2, sin(x)^2+cos(y)^2, 21000}, x=-12..12, y=-12..12, axes=none, color=[0.39*x, 0.64*y, sin(x)], orientation=[25, 70], light=[45,45,0.64,0.59,0.39], style=hidden);

Примеры фрагмента дают определенное представление о возможностях plot3d-функции по графическому представлению 3D-зависимостей, определяемых функциями (включая заданных параметрически), процедурами и многофункциональных 3D-ГО. В порядке сравнения следует отметить, что упоминаемый пакет Mathematica располагает более развитым механизмом опций по созданию и управлению выводом функциональных 3D-графиков.

Текстовое оформление 3D-графических объектов. Из рассмотренной выше графической функции plot3d следует, что посредством поддерживаемых ею опций возможно в определенной мере производить текстовое оформление 3D-ГО (заголовки и осевые метки), однако их выразительные возможности весьма ограничены, к тому же относительно последних имеется ряд ограничений и особенностей [12], в значительной мере делающих эти средства не совсем приемлемыми для целого ряда важных приложений.

В качестве более гибкого средства текстового оформления 3D-ГО выступает модульная функция textplot3d(T {, <Опции>}), где в качестве второго необязательного аргумента выступают уже рассмотренные plot-опции и дополнительно одна специфическая для текста align-опция, определяющая режим расположения текстовой строки относительно опорной точки. В качестве значений для align-опции допускаются следующие: ABOVE (выше), BELOW (ниже), RIGHT (вправо) и LEFT (влево); по умолчанию полагается центровка текста по всем осям координат относительно опорной точки. Допускается одновременное применение триплетов значений align= {ABOVE, LEFT, RIGHT}.

В качестве первого обязательного аргумента textplot3d-функции выступает текстовый элемент (ТЭ) либо их список или множество. Отдельный ТЭ представляет собой четырехэлементную списочную структуру, в качестве первых трех элементов которой выступают координаты опорной точки, а в качестве четвертого - собственно сама текстовая строка, например, [6.4, 5.9, 10, `Russian Ecology Academy`]. Недостатком textplot3d-функции является невозможность изменения ориентации текстовой строки в зависимости от ориентации собственно самого 3D-ГО. Поэтому изменение ориентации ГО влечет за собой, как правило, искажение взаимного расположения текстовой и графической компонент объекта, требуя редактирования координат опорных точек первых. Текстовая компонента ТЭ должна быть {string|symbol}-типа. По color-опции производится расцветка текста, что позволяет улучшать оформление ГО.

В качестве простого примера представим создание единого 3D-ГО посредством функции display3d из пяти 3D_ГО-структур P, T1..T4.

> with(plots): a:=2*Pi: F:= [TIMES, BOLD]: T1:= textplot3d([12, 0.2, 37, `Monographs (8)`]):

T2:= textplot3d([18, -0.18, 38, `Papers (42)`]): T3:= textplot3d([-11, -0.25, 37, `Textbooks (30)`]): T4:=textplot3d([-8.5, 0.3, 36, `Books (38)`]): P:=plot3d([t^2*sin(t), sin(h)*cos(h), t*h], t= -a..a, h= -a..a, thickness= 2, color= [sin(t*h), cos(t^2*h), h*t^2], orientation= [47, 42], ambientlight=[0.42, 0.47, 0.6], light=[57, 52, 0.2, 0.3, 0.4], lightmodel=light2): display3d(P, T1, T2, T3, T4, titlefont=[op(F), 18], style=hidden, color=black, title="Transactions of the

Tallinn Research Group (1995 - 2006)", font=[op(F), 14]);

Transactions of the Tallinn Research Group (1995 - 2006)

С учетом сказанного каких-либо особых пояснений данный фрагмент не требует. Пример фрагмента иллюстрирует создание посредством display3d-функции единого 3D-ГО из заранее заготовленных 3D_ГО-структуры MESH-типа, созданной на основе функции plot3d, и четырех текстовых структур, созданных на основе textplot3d-функции. Следует иметь в виду, что идентификатор display3d является дополнительным именем displayфункции, рассмотренной выше. Однако первый идентификатор отмечает тот факт, что с display3d-функцией допустимо использование именно графических plot3d-опций. В [12] достаточно детально рассмотрены вопросы оформления составных 3D-ГО и представлен целый ряд рекомендаций.

Так, в ряде случаев в результате переопределения шрифтов для заголовка 3D-ГО возможна потеря текста (см. прилож. 1 [12]). Простая процедура устраняет данный недостаток:

T_Font := proc(ST::function, U::`=`) local n m h p Kr Ln F, , , , , , ; assign(Kr = convert(ST, 'symbol'), F = cat(currentdir( ), "/$Art16_Kr9$"));

`if`(nargs ≠ 2, ERROR "Number of arguments is wrong: %1", nargs( ), `if`( searchtext '( PLOT Kr', ) = 0 and searchtext '( PLOT3D Kr', ) = 0, RETURN( ),

`if`(lhs(args[2]) ≠ 'titlefont', RETURN( ), assign(h = length(Kr))))); assign(n = searchtext '( TITLE Kr', )), assign(m = n + searchtext ")",( Kr, n .. h) − 1);

p := n + searchtext '( FONT Kr', , n .. m) − 1; assign(Ln = open(F, 'WRITE')), writebytes(Ln, cat(`_Art:=`, substring(Kr, 1 .. n − 1))); if p = n − 1 then writebytes(Ln, cat substring(( Kr, n .. m − 1), ",", "FONT(", substring(convert(rhs args[2]( ), 'symbol'), 2 .. -2), ")" substring(, Kr, m .. h),

";")) else writebytes(Ln, cat substring(( Kr, n .. p + 4), substring(convert(rhs(args[2]), 'symbol'), 2 .. -2), substring(Kr, m .. h), ";")) , close(Ln) end if;

(proc( )x read x; fremove( )x end proc )(F)

end proc > S:= plot3d(x^2+y^2, x=-3..3, y=-3..3, title=`RAC_IAN_REA_RANS`, orientation=[30, 83]): T_Font(S, titlefont=[HELVETICA, BOLDOBLIQUE, 18]); _Art;

RAC_IAN_REA_RANS

Первый фактический ST-аргумент процедуры T_Font(ST, U) определяет 3D-ГО-структуру, а второй - опцию titlefont = <Значение>. Процедура определяет глобальную переменную _Art, значением которой является 3D-ГО-структура – результат соответствующей модификации исходной графической ST-структуры. Предыдущий фрагмент представляет исходный текст процедуры и пример ее применения. В качестве полезного упражнения читателю рекомендуется разобраться в организации процедуры T_Font.

Специальные типы 3D-графиков функциональных зависимостей. Наряду с рассмотренными базовыми средствами 3D-графики Maple-язык располагает целым рядом модульных функций, поддерживаемых вышеупомянутым модулем plots, которые существенно расширяют графические возможности пакета. Все эти средства становятся доступными после выполнения вызова with(plots) или иным рассмотренным выше способом. Выше из средств plots-модуля мы рассмотрели целый ряд функций 2D-графики, а для 3D-случая такие функции как: setoptions3d, display3d, textplot3d. Здесь мы кратко охарактеризуем ряд других, используемых для более специальных целей при работе с 3D-графикой. Не останавливаясь детальнее, упомянем соответствующие одноименным средствам для 2Dслучая такие функции как: complexplot3d, listcontplot3d, implicitplot3d, contourplot3d, polygonplot3d, fieldplot3d, gradplot3d, listplot3d, pointplot3d, listcontplot3d и coordplot3d, обеспечивающие работу со специальными типами графиков. Их описания достаточно прозрачны и особых пояснений не требуют. Остальные интересные средства в данном направлении представляет следующая сводная табл. 18.