Смекни!
smekni.com

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

По вызову функции convert(О, {PLOToptions|PLOT3Doptions}) предоставляется возможность конвертации графических опций, определяемых первым фактическим О-аргументом в терминах синтаксиса Maple-языка, во внутренний формат графических структур данных соответственно {PLOT|PLOT3D}-типа. При этом фактический О-аргумент функции кодируется либо в виде единственного уравнения <Опция> = <Значение>, либо списка таких уравнений. При этом, следует иметь в виду, что ряд графических опций, определенных в терминах Maple-языка, не конвертируется во внутренний формат, игнорируясь convert-функцией. Так как результат конвертации графических опций пригоден для непосредственного погружения во внутреннюю {2D|3D}_ГО-структуру данных, то рассмотренное средство представляется нам достаточно важным при программировании целого ряда сложных графических задач в среде Maple-языка [12]. Следующий простой фрагмент иллюстрирует средство такой конвертации:

> convert([title=`Activity Graphic of the TRG`, titlefont=[TIMES,BOLD,14], axes=boxed, thickness=2, color=green, labels=["Year", "Books"]], 'PLOToptions');

[AXESLABELS("Year", "Books"), TITLE(Activity Graphic of the TRG, FONT(TIMES, BOLD, 14)), AXESSTYLE(BOX), COLOUR(RGB,0., 1.00000000,0.), THICKNESS(2)]

Так как plot-структура имеет текстовый формат и прозрачную организацию, то в принципе, ее можно готовить в среде текстового процессора или непосредственно в среде текущего Maple-документа. Продемонстрируем принцип данной процедуры на весьма простом примере. Непосредственно внутри структуры создается последовательность 2элементных числовых списков, представляющих координаты точек будущей кривой (окружности). Затем строится plot-структура Svetla, описанной выше организации; после чего структура дополняется установками для необходимых plot-опций. Наконец, сформированная Svetla-структура вычисляется, выводя искомый 2D-ГО, а именно:

> Svetla:= PLOT(CURVES([evalf([cos(2*'k'*Pi/200), sin(2*'k'*Pi/200)])$'k' = 1..650],

THICKNESS(3), COLOUR(HSV, 0.96, 1, 0.57)), AXESTICKS(DEFAULT, DEFAULT,

FONT(TIMES, BOLD,10))): Svetla;

Целый ряд довольно интересных примеров прямого использования графических plotструктур для создания 2D-ГО можно найти в [12]. Отметим, работа с 2D-ГО на уровне определяющих их 2D_ГО-структур при определенном навыке не должна вызывать особых сложностей, позволяя создавать достаточно сложные графические объекты. Таким образом, в общем случае 2D-графические функции имеют дело со структурами данных четырех базовых типов, а именно: POLYGONS (многоугольники), TEXT (текст), CURVES (кривые), POINTS (точки), каждая из которых структурно достаточно проста и все они имеют единую принципиальную организацию следующего простого вида:

<Тип ГО>(<Описание объекта> {, <Опции>})

где описание объекта является определяющим для его типа, а опции необязательны и характеризуют присущие ему локальные свойства. По вызову графической функции {plot| polarplot}(<2D_ГО-структура>) выводится собственно сам 2D-ГО. Детальнее с графическими структурами, поддерживаемыми пакетом, можно ознакомиться в [12] и в определенной мере в справочной системе пакета.

Текстовое оформление 2D-графических объектов. Из рассмотренной выше графической функции plot следует, что посредством поддерживаемых ею опций можно в определенной мере производить текстовое оформление 2D-ГО (заголовки и осевые метки), однако их выразительные возможности весьма ограничены, к тому же относительно последних имеется ряд ограничений и особенностей, в значительной степени отмеченных нами в прилож. 1 [12] и делающих эти средства в ряде случаев не совсем приемлемыми для указанных целей. В качестве более гибкого средства текстового оформления 2D-ГО выступает модульная функция textplot(Txt {, <Опции>}), где в качестве второго необязательного аргумента выступают уже рассмотренные plot-опции и дополнительно одна специфическая для текста align-опция, определяющая режим расположения текстовой строки относительно опорной точки. В качестве значений для align-опции допускаются следующие: BELОW (ниже), ABОVE (выше), RIGHT (вправо) и LEFT (влево); по умолчанию полагается центровка текста по обоим осям координат относительно опорной точки. Допускается одновременное применение пар значений, например align={ABOVE, LEFT}. По color-опции производится расцветка текста, что позволяет улучшить оформление ГО.

> with(plots): F:= [TIMES, BOLD]: T1:= textplot([0, 4.2, "(Example of textual graphic design)"], align=ABOVE, font=[TIMES, BOLD, 14]): T2:= textplot([-0.3, 2.8, `Y-axis =>`], align={ABOVE, LEFT}, font=[op(F), 14]): T3:=textplot([4, -0.6, `X-axis`], font= [op(F), 14]): T4:= textplot({[3.8, 0.8, `<=Intersection point;`], [4, 0.42, `coordinats [1.82, 0.75]`]}, font=[op(F), 14]): T5:= textplot({[4.074, 3.413, "Tallinn - 9.01.2007"], [4.074, 2.9 ,`Tallinn Research Group`]}, font= [op(F), 14]): T6:= textplot([-4.7, -2.5, `www.aladjev.newmail.ru`], font=[op(F), 14]): G:= plot({[t, sin(t) + cos(t), t = -2*Pi..2*Pi], [t*sin(t), t*cos(t), t = -Pi..Pi]}, thickness= [2, 3], color= [red, green], title= `Intersection of parametric defined curves`, labels= [``, "Russian Academy of Natural Sciences"], labelfont= [op(F), 14],

titlefont= [TIMES, BOLD, 18]): display([G, T1, T2, T3, T4, T5, T6], axesfont= [op(F), 14]);

В случае вызова функции textplot([a,b], "<Текст>") генерируемая ею text-структура имеет весьма простую организацию:

PLOT(TEXT([a, b], <Текст> {, G}{, V}) {, <Опции>})

вычисление которой выводит заданный текст с [a, b]-координатами опорной точки в декартовой системе координат. Если не указаны явно ключевые параметры G и V, определяющие соответственно расположение выводимого текста по горизонтали и вертикали относительно опорной точки, то для них принимаются значения по умолчанию (центровка по обоим измерениям). Для обоих параметров структуры допустимыми являются значения G∈{ALIGNLEFT, ALIGNRIGHT} и V∈{ALIGNABOVE, ALIGNBELOW}. Дополняя text-структуру определениями plot-опций, можно соответствующим образом дооформлять текстовую информацию, выводимую в качестве составной 2D-ГО.

В качестве первого обязательного Txt-аргумента textplot-функции выступает текстовый элемент (ТЭ) либо их список/множество. Отдельный ТЭ представляет собой 3-элементную списочную структуру, в качестве первых двух элементов которой выступают координаты опорной точки, а в качестве третьего элемента - собственно сама текстовая строка, например, [5.7, -4.2, "Russian Ecology Academy"]. Прежде, чем переходить к вопросу совмещения сугубо графических объектов, подготовленных plot-функцией, с текстовыми объектами, подготовленными textplot-функцией, рассмотрим модульную displayфункцию, обеспечивающую такие интеграционные средства. Определения этой и предыдущей функции textplot находятся в пакетном модуле plots.

Модульная display-функция, имеющая следующий формат кодирования:

display(<2D_ГО-структура> {, insequence = {true|false}} {, <Опции>}) обеспечивает вывод 2D_ГО-структур, определяемых ее первым фактическим аргументом, в виде единого ГО, получающегося в результате объединения исходных графических компонент. В качестве фактических значений первого аргумента могут выступать список, множество или массив 2D_ГО-структур, которые требуется вывести в виде единого объединенного ГО. Если первый аргумент представляет собой список или множество и определен необязательный ключевой аргумент insequence=false (либо опущен, т.к. принимается по умолчанию), то display-функция выводит единый ГО, созданный объединением представленных им исходных 2D_ГО-структур. Если же при сделанном предположении определен аргумент insequence = true, то производится анимация ГО, определенного графическими структурами из первого аргумента функции.

Анимация в этом случае состоит в циклической смене на экране в едином фрейме ГО в том порядке, как они определены в первом аргументе display-функции. При этом, если списочная структура первого аргумента точно определяет порядок смены анимируемых ГО, то структура множественного типа в общем случае определяет иной порядок, обсуждение которого проводилось выше. В случае, если первый аргумент функции display имеет array-тип, то результирующий ГО наследует его структуру с исходными 2D_ГОструктурами в качестве элементов массива. Наконец, необязательный третий аргумент display-функции определяет глобальные установки для plot-опций, управляющих выводом и оформлением результирующего единого ГО и перекрывающих локальные установки одноименных им опций из отдельных исходных 2D-ГО-структур, определяемых первым аргументом функции. В этом отношении display-функция выступает в роли своего рода компановщика графических объектов на основе как сугубо графических, так и текстовых структур данных, включая и поддерживаемые пакетным plottools-модулем пакета графические примитивы, рассматриваемые ниже. Особенности взаимодействия локально и глобально определенных графических опций в условиях применения display-функции достаточно детально рассмотрены в [12].

В качестве простого примера создания единого ГО из семи 2D-ГО-структур G, T1..T6 посредством display-функции можно рассмотреть предыдущий фрагмент. Тогда как два примера следующего фрагмента иллюстрируют создание посредством display-функции единого ГО табличной структуры, элементами которой являются заранее определенные 2D_ГО-структуры S1..S3 и TxT, созданные функциями plot, polarplot и textplot соответственно. Во втором примере фрагмента иллюстрируется определение режима анимации трех структур типов CURVES и одной TEXT-типа (будучи динамическим, данный режим реализуем лишь на компьютере). С учетом вышесказанного каких-либо дополнительных пояснений данный фрагмент не требует.

> S1:= plot({[t, sin(t) + cos(t), t=-2*Pi..2*Pi], [t*sin(t), t*cos(t), t= -Pi..Pi]}, thickness= [2, 3], color= [ red, pink], title= `Plot_1`, axesfont= [op(F), 12]): S2:=polarplot({[t*cos(t^2), t^2, t=-2*Pi..2*Pi], [t^2, t, t=-Pi..Pi], [-t^2, t, t=-Pi..Pi]}, thickness= [2, 4, 4], color= [ gold, red, tan], axes=none, style= [line, point, point], title= "Plot_2", symbol=circle, numpoints=

180): S3:= plot({[t, sin(t)+cos(t), t=-2*Pi..2*Pi], [t*sin(t), t*cos(t), t=-Pi..Pi], [3*sin(t), 3*cos(t), t=-2*Pi..2*Pi]}, thickness= [2, 3], color= [ blue, brown, yellow], title= "Plot_3", axesfont= [op(F), 12], axes=boxed): TxT:= textplot([0, 2, `Example of tabular graphic structure`], axes=none): display(array(1..2, 1..2, [[S1, TxT], [S2, S3]]), font= [op(F), 14]);