Самоучитель Matlab
Рис. 2.52. Пятидесятый кадр анимации
Рис. 2.53. Семьдесят пятый кадр анимации
96
Глава 2. Графика в Matlab
Рис. 2.54. Сотый кадр анимации
Таким образом, создан своеобразный вращающийся пропеллер. Рассмотрим подробнее программный код, с помощью которого создается анимация.
Командой phi=0:0.01:2*pi создается вектор значений полярного угла для дальнейшего использования при создании функциональных зависимостей. Командой N=100 определяется значение переменной-количества кадров анимации. С помощью команд X=cos(phi) и Y=sin(phi) создаются векторы узловых точек и значения функции в этих точках для окружности единичного радиуса. Эти векторы используются для отображения центральногокруганаанимационныхкадрах.Далееследуетоператорцикла.Инструкция for k=1:N в его начале означает, что индексная переменная k пробегает значения от 1 до N с шагом дискретности 1 (шаг дискретности по умолчанию). Командой alpha=phi-pi*k/N создается вектор значений полярного угла, повернутого по отношению к стандартному углу phi на величину pi*k/N против часовой стрелки. Командой r=max(0,3*cos(2*alpha))
создается вектор базовых точек для заданной в полярных координатах функции вида r(ϕ) = 3 cos(2(ϕ −kπ N )) - то есть "лепесток" с поворотом. Командами x=r.*cos(phi) и y=r.*sin(phi) создаются соответствующие зависимости в декартовых координатах, а командой area(x,y) создается графическое окно с графиком, закрашенным цветом. Чтобы следующий график выводился в том же окне, используем инструкцию hold on.
97
Самоучитель Matlab
Этот следующий график (закрашенная окружность) создается командой area(X,Y). Командой grid on отображается координатная сетка. Для установки одного масштаба по координатным осям используем инструкцию axis equal, а командой axis([-4 4 -4 4]) задается диапазон значений по каждой из координатных осей. Следующая команда нужна для того, чтобы отобразить на графике текст с номером кадра. Для этого используем функцию text(). Первые два аргумента функции text() – значения координат точки на графике, определяющих место вывода текста. Третий аргумент – текстовая строка, которая выводится на графике. В данном случае это вектор, состоящий из двух элементов. Первый – текстовая строка 'Frame N'. Второй аргумент – результат преобразования числа k (индексная переменная) к текстовому формату. Для перевода числа в текст используем функцию num2str(). Далее в функции text() идут аргументы, определяющие параметры текста. Аргументы указываются в формате опция-значение. Сначала в одинарных кавычках указывается имя устанавливаемой опции (параметра) текста, а после запятой – применяемое значение для опции. Так, размер шрифта (опция FontSize) устанавливается равным 15, а цвет фона области вывода текста (опция BackgroundColor) задается в формате RGB. Для этого используется вектор из трех числовых значений (содержание красного, зеленого и синего цветов).
Командой F(k)=getframe создается кадр и записывается в качестве k-го элемента вектора F. Команда hold off нужна для того, чтобы выйти из режима удержания графики (то есть выйти из режима отображения новых графиков без замещения уже существующих). В противном случае при создании последующих кадров новая картинка накладывалась бы на уже существующую. Инструкция end свидетельствует о том, что тело оператора цикла закончилось. Наконец, посредством команды movie(F,2) анимационные кадры отображаются один за другим два раза.
Использование изображений
Мы продолжаем то, что мы уже много наделали.
В. Черномырдин
Растровое графическое изображение в Matlab – это трехмерный массив (доступ к элементам осуществляется по трем индексам). Размер по первым двум размерностям определяется количеством пикселей в изображении. Третий индекс может принимать всего три значения (1, 2 и 3). Цвет каждого пикселя в изображении определяется в формате RGB. Если изображение записано в массив A, то значение для содержания красного цвета в формате RGB для пикселя, находящегося на пересечении i-й строки и j-го столбца,
98
Глава 2. Графика в Matlab
определяется элементом A(i,j,1), для зеленого – элементом A(i,j,2), а для синего – элементом A(i,j,3) соответственно. Таким образом, растровое изображение состоит из трех двумерных матриц, каждая из которых задает содержание соответственно красного, зеленого и синего цветов.
Чтобы отобразить растровое изображение, массив, в который записано изображение, указывают аргументом функции image(). Рассмотрим следующий программный код:
>>for i=1:300 for j=1:500
A(i,j,1)=rem(i,30)/30;
A(i,j,2)=rem((i^2+j^2),200)/200;
A(i,j,3)=rem(j,50)/50;
end
end
>> image(A)
В результате создается изображение, представленное на рис. 2.55.
Рис. 2.55. Отображение созданного изображения
В данном случае изображение создается попиксельно, с помощью вложенных операторов цикла. Индексная переменная i пробегает значение от 1 до 300. Индексная переменная j пробегает значения от 1 до 500. Изображение формируется поэлементным заполнением массива A, и его размеры – 300 на
99
Самоучитель Matlab
500 пикселей. Содержание красного цвета для пикселя с координатами i и j задается командой A(i,j,1)=rem(i,30)/30, в которой использована функция rem() вычисления остатка от деления. Получаемые значения не больше нуля и не превышают единицы и чередуются через каждые 30 пикселей вдоль вертикали. Для определения содержания синего цвета используется команда A(i,j,3)=rem(j,50)/50. Значения чередуются через каждые 50 пикселей по горизонтали. Содержание зеленого цвета определяется командой A(i,j,2)=rem((i^2+j^2),200)/200. В этом случае получаются периодические структуры из серии "круги на воде". Для отображения созданной таким образом картинки используем команду image(A).
Намного чаще изображения не создаются, а считываются из файла. Для считывания графического файла используют функцию imread(). Аргументом функции указывают полное имя считываемого файла (аргумент заключается в одинарные кавычки). Результатом вызова функции является трехмерный массив растрового изображения файла. Обычно его присваивают в качестве значения какой-нибудь переменной. Рассмотрим следующий код:
>>P=imread('F:\Книги\В работе\Matlab\Docs\tiger.jpg');
>>image(P)
Командой считывается файл tiger.jpg, расположенный в каталоге F:\ Книги\В работе\Matlab\Docs. Результат записывается в переменную P. Командой image(P) считанное изображение отображается в графическом окне. Результат показан на рис. 2.56.
По умолчанию изображение масштабируется под размер графического окна. В данном случае эффект искажения изображения не заметен, поскольку пропорции в исходном изображении близки к пропорциям графического окна. Однако такое счастливое совпадение имеет место далеко не всегда. Считаем другой файл с изображением:
>>B=imread('bee.jpg');
>>image(B)
>>axis image
В частности, считывается файл bee.jpg, размещенный в рабочем каталоге Matlab (в этом случае аргументом функции imread() достаточно указать только имя файла, без полного пути к нему). Результат выполнения первых двух команд представлен на рис. 2.57.
Поскольку, в отличие от предыдущего случая, соотношение сторон для рисунка далеко от единицы, при отображении рисунка возникает значительное, видимое на глаз, искажение пропорций. Устранить его можно, воспользовавшись командой axis image. В результате окно с изображением изменится так, как показано на рис. 2.58.
100