Построение трехмерных изображений

Не всегда весь объем визуализируемой информации удобно представить в виде набора двумерных кривых. Иногда, по смыслу задачи, данные должны быть представлены как объекты трехмерного пространства. Для изображения таких объектов рассмотрим несколько функций.

Способ обращения к команде plot3, а также список дополнительных параметров полностью совпадает с описанным в п. 2.5.1 и далее. Аналогично функциям plot( ) - plot3( ) существует пара функция comet( ) - comet3( ). Функция comet3( ) используется так же, как и comet. При использовании для обрисовки трехмерной кривой функции (объекта) line( ) можно обращаться к этой функции как к функции plot( ), т.е. line(x,y,z).

Трехмерные поверхности обычно описываются функцией двух переменных z(x, у).Специфика построения трехмерных графиков ("по точкам") требует не просто задания ряда значений векторов х и у. Она требует определения для X и Y двумерных массивов — матриц, которые используются для дальнейших вычислений и построений трехмерных поверхностей. Для создания таких массивов служит функция meshgrid( ). В основном она используется совместно с функциями построения графиков трехмерных поверхностей.

Функция meshgrid( )записывается в следующих формах:

[X,Y] = meshgrid(x) — аналогична [X,Y] = meshgrid(x,y);

[X,Y,Z] = meshgrid(x,y,z)

и возвращает трехмерные массивы, используемые для вычисления функций трех переменных и построения трехмерных графиков;

[X.Y] = meshgrid(x.y)

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

Пример3.2-13
>> [X,Y]=meshgrid(0:3,-3:0); >> X = 0 1 2 3 0 1 2 3 0 1 2 3 0 1 2 3 >> Y = -3 -3 -3 -3 -2 -2 -2 -2 -1 -1 -1 -1 0 0 0 0 >>

Эти данные используются функциями

mesh(X,Y,Z) – построение сетчатого графика, где X,Y,Z – матрицы одинаковой размерности;

plot3(X,Y,Z) –построение точек, соединенных отрезками прямых (аналог plot); urf(X,Y,Z) –построение поверхности и др.

Кроме численных методов построения можно использовать символьные: ezmesh( ), ezsurf( ), ezplot3( ) и т. п. Синтаксис использования этих функций прост.

Рассмотрим пример 3.2-14 построения графика синуса на интервале от -4 до 4.

Пример3.2-14
>> ezsurf('sin((x^2+y^2)^(0.5))/((x^2+y^2)^(0.5))',[-10 10],[-10 10]) >>

Рис. 3.2-16

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

Кроме этого, эти функции позволяют строить графики, заданные параметрически, задавать различные параметры графиков и другие возможности (посмотрите help).

Трехмерные сеточные поверхности изображаются с помощью функции mesh( ). Команда mesh(z)изображает в трехмерной перспективе поверхность, описываемую элементами матрицы z. Эта поверхность определяется Z-координатами точек над прямоугольной сеткой в X-Y плоскости. Попробуйте выполнить самостоятельно команду mesh(eye(10)). Для того чтобы нарисовать функцию z=f(x,y) над прямоугольником, необходимо определить вектора xx и yy , которые определят разбиение сторон прямоугольника. С помощью команды meshgrid можно создать матрицу x, каждая строка которой будет совпадать с xx, а размер столбцов которой будет совпадать с длиной вектора yy, и, аналогично, матрицу y, каждый столбец которой совпадает с yy, следующим образом [x,y] = meshgrid(xx,yy);. После этого необходимо определить матрицу z, вычисляя каждый ее элемент как функцию f в соответствующих точках, определяемых матрицами x и y, после чего использовать команду mesh.Вы можете, например, нарисовать поверхность на квадрате [-2,2] х [-2,2] с помощью следующего набора команд

Пример3.2-15
>> xx = -2:.1:2; >> yy = xx; >> [x,y] = meshgrid(xx,yy); >> mesh(z) >>

Первые три строки можно заменить на [x,y] = meshgrid(-2:.1:2, -2:.1:2); .

Более полно с возможностями изображения трехмерных поверхностей можно познакомиться с помощью оперативной помощи (help plot3/mesh/surf).

Одним из популярных способов визуализации поверхностей является изображение изолиний. MatLab предоставляет возможность построения изолиний двух типов -двумерных или плоских, фактически являющихся проекциями соответствующих линий постоянного значения на плоскость X-Y, и трехмерных изолиний, нарисованных в какой-либо перспективе.

Простейшим способом изобразить изолинии на плоскости – это обратиться к функции contour(Z), где Z -это матрица, содержащая значения исследуемой поверхности на равномерной сетке, т.е. Zij = f(i, j). При таком обращении система MatLab сама выберет число изолиний и значения функции, при которой они будут построены. Если вы хотите сами задать число выводимых изолиний, то необходимо обращение вида contour(Z,n_of_lines), если же необходимо задать сами эти уровни, то это можно сделать с помощью обращения contour(Z,values_of _levels). Если вам необходимо нарисовать одну изолинию с определенным значением функции, то вектор, содержащий уровни, должен иметь два одинаковых элемента, равных этому уровню.

Отмеченные выше три способа вызова функции построения изолиний строят их по отношению к номерам строк и столбцов матрицы Z так, что элемент Z(1,1) будет помещаться в левом нижнем углу рисунка. Можно построить изолинии относительно выбранных вами масштабов по оси X и Y . Для этого необходимо передать функции вектора или матрицу координат, определяющие координаты каждого из элементов матрицы Z. Эта передача осуществляется путем одного из следующих обращений:

Пример3.2-16
>>contour(x,y,Z); contour(x,y,Z,n_of_lines); >>contour(x,y,Z,values_of_levels); >>

В трехмерной графике выполняются представления функции z=z(x,y), отличающиеся способом соединения точек: линия, сечения, сетчатая или сплошная поверхность.

plot3(x,y,z) в тех же вариациях, что и plot( ), предполагает задание одномерных и двумерных массивов (строятся точки с координатами x(i,:),y(i,:),z(i,:) для каждого столбца и соединяются прямыми линиями. Если используется [x,y]=meshgrid( ), то строятся сечения.

Пример3.2-17
>> t=0:pi/50:10*pi; >> [x,y]=meshgrid([-2:0.1:2],[-2:0.01:2]);
>> plot3(sin(t),cos(t),t) >>z=exp(-x.^2-y.^2); >> plot3(x,y,z)
>>
Построение трехмерных изображений - student2.ru Рис.3.2-24

В примере mesh(x,y,z,c), mesh(z,c), mesh(z) определяют задание сетчатой поверхности (массив с определяет цвета узлов поверхности; если x,y не указаны, то x=1:n, y=1:m, где [m,n]=size(z).

Пример 3.2-18
>> [x,y]=meshgrid(-8:0.5:8);
>> t=sqrt(x.^2+y.^2)+0.001;
>> z=sin(t)./t;
>> mesh(x,y,z)
>> meshc(x,y,z)
>>

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

Построение трехмерных изображений - student2.ru Рис. 3.2-25  

Функции surf(x,y,z,c), surf(z,c), surf(z) определяют задание сплошной поверхности, отличаясь от mesh( ) системой окраски; аналогичная функция surfс( ) задает проекции линий уровня.

Реализация трехмерной графики может сопровождаться множеством вспомогательных команд, например:

· hiddenon/off включает или выключает режим удаления невидимых линий (по умолчанию on);

· shadingfaceted / flat / interp устанавливает затенение поверхностей (по умолчанию faceted дает равномерную окраску ячеек с черными гранями, flat - цветами узлов сетки, interp- интерполяцией цветов.

Создание графического объекта исходит автоматически при обращении к командам, порождающим объекты Line( ) и Surface( ), но может выполняться и командой

axec('<имя свойства>',<значение>, ...).Есть и команды более высокого уровня:

axis([xminxmaxyminymax]),

axis([xminxmaxyminymaxzminzmax]),которые устанавливает масштаб по осям;

axesoff/onвыключает (включает) вывод на координатные оси обозначений и маркеров;

gridon/off, gridвключает (выключает) или переключает режим нанесения координатной сетки на осях;

boxon/off, boxвключает (выключает) или переключает режим рисования контура параллелепипеда, трехмерный объект;

zoomon/offвключает (выключает) режим интерактивного масштабирования графиков (левая мышь около точки увеличивает масштаб вдвое, правая - уменьшает; удержанием левой мыши можно выделить прямоугольную область для детального просмотра;

zoomout восстанавливает исходный график.

В отличие от meshс (...) и surfс(...) функция contour рисует только линии уровня соответствующих поверхностей и выступает в многообразии синтаксических форм: contour(X,Y,Z) - для массива Z =Z(X,Y), contour(X,Y,Z,n) - то же с указанием числа линий уровня (по умолчанию 10), contour(X,Y,Z,v) - то же для массива указанных значений ;contour(Z), contour(Z,n), contour(Z,v) - аналогичные функции без указания диапазонов для аргументов и contour(...,LineSpec) - аналогичные функции c указанием типа и цвета линий (см. plot); [C,h]=contour (...) возвращает массив С и вектор дескрипторов, позволяя тем самым продолжить работу с рисунком (давать оцифровку линий, заголовки и др.).

Функция contourf(...) закрашивает области между линиями уровня, аналогична contourf(...) с разницей в формате[C,h, cf]=contour (...), где cf определяет матрицу раскраски.

Пример 3.2-26 Пример 3.2-27

>> [x,y]=meshgrid(-8:0.5:8); >> [x,y]=meshgrid(-2:0.25:2);
>> t=sqrt(x.^2+y.^2)+0.001; >> t=sqrt(x.^2+y.^2)+0.001;
>> z=sin(t).^3./t; >> z=sin(t).^3./t;
>> [c,h]=contour(x,y,z,20); >> >> [c,h,cf]=contourf(x,y,z,4); >>
Построение трехмерных изображений - student2.ru Рис. 3.2.26 Построение трехмерных изображений - student2.ru Рис. 3.2.27
Построение трехмерных изображений - student2.ru Рис. 3.2.28 Функция contour3(...) по синтаксису полностью аналогична contour(...), но изображает не проекции линий уровня, а рисует их в пространственной интерпретации; так команда [c,h]=contour3(x,y,z,20); дает фигуру (рис. 3.2.28).

Наши рекомендации