Добавил:
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

1-2 Моделирование / Matlab. Практический подход. Самоучитель

.pdf
Скачиваний:
753
Добавлен:
31.01.2021
Размер:
12.72 Mб
Скачать

Глава 2. Графика в Matlab

При вызове команды meshz(X,Y,Z) создается график, представленный на рис. 2.37.

Рис. 2.37. Трехмерная поверхность с "подложкой"

В этом случае график отображается с "подложкой": область под поверхностью представляет собой заполненный объем. Это довольно специфический режим отображения поверхностей, который, тем не менее, бывает в некоторых случаях весьма удобен и полезен.

С помощью функции mesh() создаваемые трехмерные поверхности отображаются в виде сетки. Если необходимо сделать поверхность сплошной, обычно используют функцию surf(). Результат создания трехмерной поверхности с помощью команды surf(X,Y,Z) представлен на рис. 2.38.

Кроме базовой сетки, выполнена также заливка цветом. Во всем остальном график схож с тем, что создавался функцией mesh() (см. рис. 2.36).

Функция surfc() позволяет отображать не только трехмерную поверхность, но и контурные линии в горизонтальной координатной плоскости – в полной аналогии с функцией meshc(). На рис. 2.39 представлен результат создания графика с помощью команды surfc(X,Y,Z).

В некоторых случаях удобным может быть режим, в котором график (трехмерная поверхность) "подсвечивается" (рис. 2.40).

81

Самоучитель Matlab

Рис. 2.38. Трехмерная поверхность с заливкой цветом

Рис. 2.39. Трехмерная поверхность с заливкой цветом и контурными линиями

82

Глава 2. Графика в Matlab

Рис. 2.40. Трехмерная поверхность в режиме выделения цветом

Речь идет о цветовом выделении поверхности графика так, как если бы он находился под действием источника света. Для отображения графика в таком режиме используют функцию surfl(). В частности, график (поверхность) на рис. 2.40 создан с помощью команды surfl(X,Y,Z).

Параметрические кривые и поверхности

Скажите, доктор Ватсон, Вы понимаете всю важность моего открытия?

К/ф "Приключения Шерлока Холмса и доктора Ватсона. Знакомство"

Как известно, самый простой способ задать пространственную кривую состоит в том, чтобы параметризировать ее, то есть ввести параметр, и координаты точек на пространственной кривой представить в виде функции от этого параметра. Для создания пространственных кривых в Matlab используют функцию plot3(). В самом простом случае аргументами функции указывают векторы координат точек на пространственной кривой. Пример такой кривой представлен на рис. 2.41.

Для создания пространственной кривой использовалась следующая последовательность команд:

83

Самоучитель Matlab

Рис. 2.41. Пространственная кривая

>>t=0:0.01:2*pi;

>>x=cos(10*t).*sin(t/2);

>>y=sin(10*t).*sin(t/2);

>>z=cos(t/2);

>>plot3(x,y,z)

>>grid on

>>axis equal

Вданном случае речь идет о своеобразной винтовой линии, накрученной на

сферу. Пространственная кривая задается в параметрическом виде зависи-

мостями x(t) = cos(10t)sin(t 2) , y(t) = sin(10t)sin(t2) и z(t) = cos(t2) , где параметр 0 ≤ t ≤ 2π . Точка с координатами (x,y,z) находится на поверхности единичного радиуса (с центром в начале координат). Для реализации векторов с координатами точек на кривой создается вектор значений параметра t параметрической зависимости (команда t=0:0.01:2*pi). На основе этого вектора командами x=cos(10*t).*sin(t/2), y=sin(10*t).*sin(t/2) и z=cos(t/2) создается три вектора с координатами. Затем командой plot3(x,y,z) строится пространственная кривая. Командами grid on и axis equal отображается координатная сетка и устанавливается одинаковый масштаб по координатным осям.

Впараметрическом виде может быть задана и поверхность. В этом случае координаты точек на поверхности определяются как функции от двух пара-

84

Глава 2. Графика в Matlab

метров. Процесс создания параметрически заданной поверхности в Matlab мало отличается от создания поверхности, заданной в явном виде. В частности, на основе параметрических зависимостей строятся матрицы узловых точек и значения функции в этих узловых точках, после чего поверхность строится с помощью функции mesh() или surf().

В качестве иллюстрации рассмотрим процесс построения сферы, при условии, что она задана в параметрическом виде. Для сферы единичного радиуса с центром в начале координат координаты на поверхности сферы задаются зависимостями x(ϕ, θ) = cos(ϕ)sin(θ), y(ϕ, θ) = sin(ϕ)sin(θ) и z(ϕ, θ) = cos(θ) , где параметры 0 ≤ ϕ ≤ 2π и 0 ≤ θ π . Построить сферу можно с помощью серии следующих команд:

>>phi=0:0.1:2*pi;

>>theta=0:0.1:pi;

>>[Phi,Theta]=meshgrid(phi,theta);

>>X=cos(Phi).*sin(Theta);

>>Y=sin(Phi).*sin(Theta);

>>Z=cos(Theta);

>>mesh(X,Y,Z)

>>axis equal

Результат представлен на рис. 2.42.

Рис. 2.42. Сфера построена на основе параметрических зависимостей

85

Самоучитель Matlab

В данном случае командами phi=0:0.1:2*pi и theta=0:0.1:pi создаются векторы со значениями параметров. При построении поверхности, заданной в параметрическом виде, весь процесс содержит несколько дополнительных этапов по сравнению со случаем, когда поверхность задана явно. При этом цель та же: создать три матрицы – две матрицы с узловыми точками и матрицу со значениями функции в узловых точках. Если поверхность задана явно, то обычно с помощью функции meshgrid() на основании векторов узловых точек строятся матрицы узловых точек. В данном случае на основании векторов значений параметров построим сначала матрицы узловых точек по параметрам, а затем на основании этих матриц создадим матрицы узловых точек в декартовых координатах.

Матрицы узловых точек Phi и Theta по параметрам возвращаются при выполнении команды [Phi,Theta]=meshgrid(phi,theta). На основании матриц Phi и Theta командами X=cos(Phi).*sin(Theta), Y=sin(Phi).*sin(Theta) и Z=cos(Theta) в соответствии с параметрическими соотношениями для координат точек на поверхности строятся матрицы базовых точек в декартовых координатах. Командой mesh(X,Y,Z) отображается поверхность, а команда axis equal необходима для того, чтобы установить равный масштаб по всем координатным осям – в противном случае сфера будет больше походить на эллипс.

Параметры трехмерной графики

Все те вопросы, которые были поставлены, мы их все соберем в одно место.

В. Черномырдин

Настроек, применяемых при работе с графикой, в Matlab очень много. Этой теме можно было бы посвятить отдельную книгу. Это замечание относится отдельно как к двумерной графике, так и к трехмерной. Настройки могут выполняться как в графическом окне посредством утилит интерфейса, так и с помощью команд, вводимых и выполняемых в рабочей области. Здесь отметим только некоторые, наиболее показательные и часто используемые команды.

В первую очередь остановимся на функции view(), которая позволяет задать способ ориентации трехмерного графика при отображении. Аргументом функции указывается вектор со значением азимутального и полярного углов, определяющих направление на график, вдоль которого выполняется проекция. Пример отображения одного и того же графика "под разными углами" представлен на рис. 2.43.

86

Глава 2. Графика в Matlab

Рис. 2.43. Трехмерный график под разными углами зрения

Графики строятся с помощью такой последовательности команд:

>>u=0:0.1:2*pi;

>>v=0:0.1:pi;

>>[U,V]=meshgrid(u,v);

>>X=V.*cos(U);

>>Y=V.*sin(U);

>>Z=cos(3*V).*U;

>>subplot(2,2,1);mesh(X,Y,Z);view([0 30]);title('view([0 30])')

>>subplot(2,2,2);mesh(X,Y,Z);view([60 45]);title('view([60 45])')

>>subplot(2,2,3);mesh(X,Y,Z);view([120 60]);title('view([120 60])')

>>subplot(2,2,4);mesh(X,Y,Z);view([180 90]);title('view([180 90])')

Собственно, в четырех подокнах графического окна отображается одна и та же поверхность, заданная в параметрическом виде уравнениями x(u,v) = v cos(u), y(u,v) = v sin(u) и z(u,v) = u cos(3v), параметры

0 ≤ u ≤ 2π и 0 ≤ v π . Однако каждый раз выбирается разное направление проекции. Направление задается функцией view(). Аргументом функции указывается вектор с двумя элементами – значениями (в градусах) азимутального и полярного углов. Для удобства с помощью функции title() в подокнах отображается текст команды выбора направления на график с аргументами функции view().

87

Самоучитель Matlab

Обычно при цветовом выделении поверхности удобно отображать рядом с поверхностью цветовую шкалу. Для этого используется команда colorbar. Пример использования команды приведен ниже:

>>figure

>>surf(X,Y,Z)

>>view([120 60])

>>colorbar

В результате получаем графическое окно с графиком поверхности и цветовой шкалой, как на рис. 2.44.

Рис. 2.44. На графике отображена цветовая шкала

График создается в новом окне на основе введенных ранее данных (см. предыдущий пример отображения графиков под разным углом).

При отображении поверхности в виде сетки по умолчанию действует режим, при котором части поверхности на заднем фоне, которые закрываются впереди расположенными частями поверхности, не отображаются. Выйти из этого режима можно с помощью инструкции hidden off. Результат представлен на рис. 2.45.

Поверхность создавалась такими командами:

>>mesh(X,Y,Z)

>>hidden off

88

Глава 2. Графика в Matlab

Рис. 2.45. Поверхность в виде сетки отображается в режиме прозрачности

При этом сетка становится "прозрачной" – становятся видимыми и дальние части поверхности. Для поверхностей, созданных с помощью функции surf(), инструкция hidden off воздействия не имеет.

Тем не менее, самый простой способ придать графику нужный вид – воспользоваться встроенными утилитами настройки, которые доступны в графическом окне и реализуются через систему кнопок и меню. Общая схема настройки трехмерной графики в основном мало отличается от того, как выполняется настройка внешнего вида двумерных кривых. Поскольку ничего принципиально сложного в этом нет, думается, читатель при необходимости освоит эти методы самостоятельно.

Анимация

После истории с часами я готов верить всему, что Вы скажете. Но, черт возьми, как?!

К/ф "Приключения Шерлока Холмса и доктора Ватсона. Кровавая надпись"

В Matlab можно создавать не только превосходные графики, но и довольно неплохую анимацию. Существует несколько фундаментальных подходов относительно создания анимации. Здесь рассмотрим один – пожалуй, наиболее простой. В этом случае задача по созданию анимации сводится, по большо-

89

Самоучитель Matlab

му счету, к созданию набора анимационных кадров и, затем, к их последовательному отображению. Полезными при этом могут оказаться две функции: функция movie() для отображения последовательности кадров и функция getframe(), используемая для создания анимационного кадра. Если вызвать функцию getframe() без аргументов, то в качестве значения возвращается изображение (структура, имеющая два поля – матрицу изображения cdata и матрицу цветовой палитры colormap). Аргументом функции getframe() можно передать ссылку (указатель) на графическое окно или систему координат. В свою очередь, получить ссылку на текущее графическое окно можно с помощью функции gcf. Более простой способ – указать номер графического окна (номер графического окна указывается в его названии после слова Figure). Ссылку на текущую систему координат можно получить с помощью функции gca. Кроме ссылки на графическое окно, вторым аргументом можно указать четырехкомпонентный вектор, определяющий область графического окна, которая записывается в кадр. Первые два элемента вектора определяют позицию нижней левой точки области на графике в пикселях по отношению к нижней левой точке рисунка или системы координат (в зависимости от того, какая ссылка указана первым аргументом функции getframe()), третий и четвертый - ширину и высоту области соответственно. Далее приведены примеры использования этих функций для создания единичных кадров. В частности, выполняем такую последовательность команд (жирным шрифтом выделен ввод пользователя):

>>x=0:0.1:2*pi;

>>y=sin(x).^2./x;

>>z=cos(x)./(1+x);

>>plot(x,y,'r-o',x,z,'b--+')

>>grid on

>>F1=getframe(1,[100 50 300 200])

F1 =

cdata: [200x300x3 uint8] colormap: []

>>figure;image(F1.cdata)

В результате выполнения кода создается график двух функций (в одном графическом окне) и на основании этого графика создается один анимационный кадр. График функций представлен на рис. 2.46.

Созданный кадр (изображение) представлен на рис. 2.47.

Разберем детальнее использованный код. Думается, команды создания исходного графика особых комментариев не требуют. Командой

F1=getframe(1,[100 50 300 200]) в переменную F1 записывается кадр, который получается на основе фрагмента созданного перед этим графика. Это область размерами 300 на 200 пикселей, левый нижний угол которой нахо-

90