# Лекция 2. Графические функции

### Белошапкин В.В.

Copyright © Красноярский государственный университет 2003

### Содержание

###

####

###

###

###

###

    Графические объекты
    Как нарисовать несколько графиков в одном графическом окне
    Вывод текста в графическое окно
    Трехмерная графика
    Создание avi-файлов
    Задачи

     Графические объекты

         Я уже показал в первой лекции как строятся двумерные и трехмерные кривые.
    Функция figure создает объект графическое окно. Например, команда figure(1)
    создает в памяти объект "графическое окно" и отображает объект на экране с подписью
    в верхней части окна "Figure No. 1". Если окно с таким именем уже существовало, то оно
    получает фокус ввода и становится активным. Вообще говоря, вызов функции figure перед
    началом процесса рисования необязателен. Любые функции для рисования, такие как plot или
    plot3, автоматически открывают графическое окно перед началом рисования. Если окно уже
    было открыто, то рисование выполняется в последнем открытом окне. Выполним программу
    l2_1.m.
    clear all                    %чистим память
    hf=figure(1);                %открываем графическое окно.
    x=0.1:pi/100:2*pi;           % заполняем массивы x и y
    y=cos(x).*log(x);
    hp=plot(x,y);                %рисуем график y(x)

         На рис. 2.1 показана оболочка Matlab и результат работы программы l2_1.m.

    Рис. 2.1

    Весь рисунок с именем "Figure No.1" состоит из трех объектов - графического окна,
    осей координат и самого графика. Все три объекта хранятся в памяти. Каждый обект
    имеет поля данных, которые определяют его вид на экране. Для получения доступа
    к полям графических объектов необходимо иметь указатели на эти объекты. Во второй
    строке программы l2_1.m в переменную hf записывается указатель на графическое окно.
    В пятой строке в переменную hp записывается указатель на график. Указатель на оси
    координат можно получить с помощью функции gca (от английских get current axis).
    Получить указатель на текущее графическое окно можно командой gcf (от английских
    get current figure). Имея указатели на графические объекты можно изменять
    значения полей объектов и соответственно их вид на экране. Чтобы узнать какие
    поля объекта hf (в программе l2_1.m это указатель на графическое окно) можно
    изменять, введем в командном окне set(hf). Команда set при таком вызове выведет
    на консоль все поля объекта hf и их возможные стандартные значения. На рис. 2.2
    показан фрагмент консоли Matlab после выполнения команды.

    Рис. 2.2 Поля объекта hf и их возможные стандартные значения

    Если некоторое поле объекта может принимать только стандартный набор значений,
    эти значения указаны справа от двоеточия после имени поля.
    Значение по умолчанию заключено в фигурные скобки.
    Например после поля visible указаны два возможных значения - 'on' и 'off'.
    По умолчанию поле имеет значение 'on' - объект виден на
    экране. Если этому полю присвоить значение 'off' с помощью команды set(hf,'visible','off'), обект исчезнет с экрана. Команда set нечувствительна к регистру, которым набирается имя поля. Например, команда set(hf,'Visible','off') полностью эквивалентнакоманде set(hf,'VISIBLE','off') и команде set(hf,'visible','off').     После имени поля Color в списке полей объекта hf никаких стандартных значенийне указано. Цвет в matlab всегда формируется с помощью вектор-строки из трех чисел,определяющих интенсивности красного, зеленого и синего цветов в результирующем цвете.Интенсивности базовых изменяются в пределах от нуля до единицы. Например,если необходимо задать красный цвет для объекта hf нужно ввести командуset(hf,'color',[1 0 0]). Первое число в векторе-строке [1 0 0] определяет интенсивностькрасного цвета, второе - зеленого и третье - синего.      Поле units определяет в каких единицах задается положение и размеры видимогоокна на экране.   По умолчанию положение окна  и размеры задаются в пикселях (светящихсяточках на экране).  <I>Начало координат на экране всегда располагается в левом нижнем углу. Ось x-ов направлена слева направо, ось y-ов снизу вверх. </I>Использование пикселей, сантиметров или дюймов для определения размеров ии позиции окна на экране делает график зависящим от разрешения  экрана, что совершенно неудобно при разработке графических интерфейсов,которые должны выглядеть одинаково при любом разрешении монитора. Поле units может принимать значение 'normalized'. При таком значении поляunits ширина и высота экрана принимаются равными по единице, а точка 0,0находится в левом нижнем углу экрана. Например, чтобы поместить графическое окно hf в левый нижний угол экрана и задать ширину и высоту по 1/2 нужноввести команду set(hf,'units','normalized','position',[0 0 0.5 0.5]);.Значение поля 'position' определяется вектор-строкой из четырех чисел.Первые два числа определяют x и y координаты левого нижнего угла окна,а вторые два числа определяют ширину и высоту.    Поле InvertHardCopy будут ли инвертироваться цвета при выводе на принтер. Поле PaperPosition определяет положение и размер графика при выводе на принтер.<I>
    Чтобы получить текущее значение какого либо поля объекта, можно воспользоватьсякомандой get.
    Например, посмотреть значение поля 'visible' объекта hf можно командой get(hf,'visible'), а посмотреть значения всех полей - get(hf);.</I>
    Рассмотрим теперь поля объекта оси координат. Чтобы получить указательна текущие оси координат используем функцию gca.
    Вводим в командном окне set(gca).
    Список полей объекта gca показан на рис. 2.3.

     Рис. 2.3 Список полей объекта gca

     В следующей таблице приводится описание некоторых полей для осей координат.
                                Поле
                                                        Назначение

         Box
         Определяет обведена ли область осей рамкой или нет. Чтобы отменить рамку надо ввести команду set(gca,'box','off');.

         Color
         Цвет.

         Fontname
         Имя шрифта.

         FontUnits
         Единицы измерения размера шрифта.

         FontSize
         Размер шрифта.

         Position
         Расположение и размер осей координат в графическом окне в единицах, определяемых значением поля Units. Значение поля задается вектор-строкой из четырех чисел [x y w h]. x,y - координаты левого нижнегоугла осей координат в окне. Точка 0,0 находится в левом нижнем углуокна. w,h - ширина и высота осей координат.

         Units
         Единицы измерения для поля Position. Если полю Units присвоить значениеNormalized при помощи команды set(gca,'units','normalized');, тогда при любом размере графического окна на экране считается, что координаты левого нижнего угла - 0,0 , а правого верхнего 1,1.

         NextPlot
         Имеет два значения - add и replace. Значение add означает, что следующий график будет наложен на предыдущий. Значение replace означает, чтоследующий график заменит предыдущий.

         TickDir
         Значения in и out определяют направление штрихов на осях координат.

         Xdir
         Значения normal и reverse определяют направление оси x.

         XGrid
         Два значения on и off определяют наличие или отсутствие линий, проведенных через штрихи на оси x-ов параллельно оси y-ов.

         XLim
         Пределы по оси x-ов.

         XScale
         Значения linear и log определяют линейный или логарифмический масштаб.

         XTick
         Определяет через какие точки на оси x-ов прведены штрихи. Задается вектором произвольной длины. Например set(gca,'XTick',[0 0.2 0.4 0.6 1]);.

          Назначение значений для полей производится функцией set, а для получения значений полей используется
    функция get. Несколько примеров:
    set(gca,'box','off');
    set(gca,'units','normalized');
    set(gca,'position',[0 0 0.5 0.5]);
    set(gca,'xtick',[0.1 0.3 0.5 0.7 0.9]);.

         В строке пятой программы l2_1.m в переменную hp был занесен указатель на график.
    Посмотреть все поля объекта hp можно командой set(hp). Некоторые поля из полного списка.

                         Поле
                                 Описание

        Color
        Цвет графика. Определяется вектором из трех значений. Например, команда set(hp,'color',[0 0 1]); назначает объекту hp синий цвет.

        LineStyle
        Определяет маркер, которым рисуется график. Возможные значения [ {-} | -- | : | -. | none ]

        LineWidth
        Ширина линии.

        MarkerSize
        Размер маркера для отрисовки.

        Ydata
        y - массив для отрисовки графика. Например, команда set(hp,'ydata',y1); назначает новые y-данные для графика hp. Массив y1 должен иметь такой же размер, как и массив в Xdata.

        Xdata
        x - массив для отрисовки графика.

    Как нарисовать несколько графиков в одном графическом окне
         Для решения задачи необходимо создать одно графическое окно, два объекта axes (оси координат)
    с полями position, определяющими положение осей в графическом окне, и затем в каждых
    осях построить график. Пример содержится в файле  l2_2.m .
    clear all
    hf=figure('numbertitle','off','visible','off'); %создаем объет графическое окно
    set(hf,'name','two graphics');                  %присваиваем имя объекту hf
    h1=axes;                                        %создаем два объекта оси координат
    h2=axes;
    set(h1,'units','normalized');           %положения осей измеряется в нормализованных единицах
    set(h2,'units','normalized');
    set(h1,'position',[0.1 0.1 0.8 0.4]);   %задаем положения и размеры осей
    set(h2,'position',[0.1 0.6 0.8 0.4]);
    x1=0:0.1:6;
    y1=cos(x1.^2);
    x2=0:0.1:6;
    y2=sin(x1.^2);
    set(hf,'currentaxes',h1);     %назначаем оси h1 текущими осями координат для окна hf
    hp1=plot(x1,y1);              %рисуем график в осях h1
    set(hf,'currentaxes',h2);     %назначаем оси h2 текущими осями координат для окна hf
    hp2=plot(x2,y2);               %рисуем график в осях h2
    set(hf,'visible','on');       %делаем окно hf видимым

        Имеется и другой вариант решения рассматриваемой задачи. Можно использовать функцию
    subplot, которая разбивает текущее графическое окно на несколько подокон  одинакого
    размера. Например, чтобы разбить текущее графическое окно на четыре нужно ввести команду
    subplot(2,2).  Геометрия и нумерация созданных окон показана на рисунке.

                1
                 2

                3
                 4

     Для отрисовки графика в третьем окне нужно ввести команду пару команд.hp1=subplot(2,2,3);plot(x,y);

     Вывод текста в графическое окно

    Для вывода текста в графическом окне обычно используется функция gtext, позволяющаяс помощью мышки поставить текст в нужную позицию. Ввведем команду ht = gtext('my grafik');.Вслед за этим необходимо переместить мышь в поле графического окна и нажатием левой кнопки указать положение текста. После этого текст появится на экране в указанной позиции.
    Графический текст является графическим объектом со своими полями данных. Чтобы просмотреть все поля объекта и их возможные стандартные значения нужно иметь указатель на графический объект (в нашем случае указатель хранится в переменной ht) и воспользоваться командой set. Например, set(ht);. В следующей таблице приводятся некоторые поля и их описание. ПолеОписаниеcolorЗадает цвет текста. Например, чтобы задать зеленый цвет нужно ввести команду set(ht,'color',[0 1 0]);.fontnameОпределяет имя шрифта. fontunitsОпределяет единицы измерения размера шрифта. Возможны значения [ inches | centimeters | normalized | {points} | pixels ]. fontsizeОпределяет размер шрифта в единицах, определенных полем fontunits.unitsЕдиницы для измерения поля position. Возможные значения [ inches | centimeters | normalized | points | pixels | characters | {data} ]. По умолчанию поле units имеет значение data, что означает что поле position определяет положение текста на экране в единицах, нанесенных на осях координат. positionЗадает положение текста в графическом окне в единицах, определенных полем units. Поле задается вектор-строкой из трех чисел [x y z]. Если график двумерный, координата z=0. Например, set(ht,'position',[ 1 0.5 0]);.  rotationОпределяет поворорт текста в градусах. Например, команда set(ht,'rotation',45); поворачивает текст ht на 45 градусов.backgroundcolorОпределяет цвет фона. Например, пурпурный фон текста можно задать командой set(ht,'backgroundcolor',[1 0 1]);.stringСтрока текста. Например, set(ht,'string','new stping');.visibleОпределяет виден ли текст на экране. Возможные значения 'on' и 'off'. Например, чтобы сделать текст ht невидимым нужно ввестикоманду set(ht,'visible','off');.
    В файле settxt.m приведен пример функции,
    которая позволяет с помощью мышки переместить текст в любое место на графическом окне.
    Для вызова этой функции достаточно ввести в командном окне команду settxt(ht); и указать
    нажатием левой кнопки мыши новое положение для текста. Функция завершает работу при нажатии
    правой или средней кнопок мыши. Вот текст этой функции.function settxt(ht) but=1; while but==1 [xi yi but]=ginput(1); set(ht,'position',[xi yi]); end      Функция settxt получает один аргумент. При вызове функции это должен быть указательна объект, который необходимо переместить в новую позицию. Цикл while всегда заканчиваетсяоператором end. В нашем случае цикл while работает до тех пор пока переменная but имеет значение единица. Функция ginput с аргументом 1 останавливает работу цикла и ожидаетввода мыши в поле графического окна и однократного нажатия (аргумент 1) любой из кнопок мыши. После этого она возвращает координаты xi и yi, где была нажата кнопка иномер нажатой кнопки в переменную but. Левая кнопка соответствует but=1, средняя but=2 и правая but=3.

     Трехмерная графика

         Для построения поверхностей используются функции surf и mesh.
    В файле  l2_3.m  содержится пример построения поверхности z(x,y)=x2+y2.
    clear all
    x=-8:0.1:8;
    y=x;
    [X Y]=meshgrid(x,y);      %строим гридовские матрицы
    Z=X.^2+Y.^2;
    figure(1);                %открываем графическое окно
    colormap(jet(256));  %назначаем 256-цветную шкалу jet для отрисовки
    surf(x,y,Z);          % рисуем поверхность
    shading('interp');    %сглаживаем
    Во второй и третьей строках создаются два вектора x и y, определяющие сетку на плоскости xy для
    построения поверхности. В четвертой строке из векторов x и y с помощью функции meshgrid
    строятся гридовские матрицы X и Y.
    В пятой строке строится матрица Z со значениями функции z(x,y)
    в каждой точке сетки, определенной векторами x и y.
    В седьмой стороке вводится 256 цветная шкала для отрисовки.
     Это необходимо для использования функции shading,
    сглаживающей поверхности. По умолчанию matlab использует
    64 цветную шкалу. В восьмой строке функция surf рисует поверхность z(x,y).
    В качестве задачи предлагается модифицировать текст программы l2_3 так,
    чтобы для вычисления матрицы Z использовались не гридовские матрицы X и Y,
    а оператор цикла for. Сравните быстродействие двух программ.
    В качестве следующего примера рассмотрим задачу об отрисовке сферы.Параметрические уравнения
    сферы имеют вид:

    В файле  mysphere.m
    приведена функция для вычисления трех векторовx,y и z,
    содержащих n координат точек, принадлежащих сфере единичного радиуса.

    function [x,y,z]=mysphere(n)
    teta=0:pi/n:pi;
    phi=0:2*pi/n:2*pi;
    [T P]=meshgrid(teta,phi);
    x=sin(T).*cos(P);
    y=sin(T).*sin(P);
    z=cos(T);

    Для отрисовки сферы достаточно выполнить скрипт  l2_4.m .

    clear all
    colormap(jet(256));
    [a,b,c]=mysphere(100);
    surf(a,b,c);
    shading('interp');

    Создание avi-файлов

         В файле  test_avi.m  создания и проигрывания avi-файла.

     clear all                                      %1
    fig=figure;                                    %2
    set(fig,'DoubleBuffer','on','visible','off');  %3
    set(gca,'NextPlot','replace','Visible','off')  %4
    mov = avifile('soliton.avi')                   %5
    x=-4*pi:0.1:4*pi;                              %6
    t = 0:.1:2*pi;                                 %7
    y=cos(x-t(1))./cosh(x-t(1));                   %8
    hp=plot(x,y);                                  %9
    number =length(t);                             %10
    for i=1:number                                 %11
    y=cos(x-t(i))./cosh(x-t(i));                   %12
    set(hp,'ydata',y);                             %13
    F=getframe(gca);                               %14
    mov = addframe(mov,F);                         %15
    end                                            %16
    mov = close(mov);                              %17
    m1=aviread('soliton.avi');                    %18
    movie(m1);                                     %19

    В пятой строке открывается avi-файл с именем soliton.avi. В цикле for кадры записываются в
    файл. В строке 14 очередной кадр заносится в переменную F. В строке 15 очередной кадр
    из переменной F записывается в файл. Функция aviread в 18-ой строке считывает avi-файл
    soliton.avi с диска в переменную m1. Функция movie в 19-ой строке проигрывает считанный
    файл.

    Задачи

    1. Написать функции, которые с помощью двух кнопок мыши врашают текст вправо и влево или
    изменяют размер текста.

    2. Модифицировать текст программы l2_3 так, чтобы для вычисления матрицы Z использовались
    не гридовские матрицы X и Y, а оператор цикла for. Сравнить быстродействие двух программ.

    3. Поверхность сплющенного сфероида определяется уравнениями:

     Написать функцию для вычисления координат поверхности сфероида и построить график.