Материал: Matlab. Практический подход. Самоучитель

Внимание! Если размещение файла нарушает Ваши авторские права, то обязательно сообщите нам

Самоучитель 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

Источник: https://studfile.net/preview/16433384/