exponenta event banner

surfnorm

Нормали поверхности

Описание

пример

surfnorm(X,Y,Z) создает трехмерный график поверхности и отображает нормали ее поверхности. Нормаль поверхности - это воображаемая линия, перпендикулярная плоской поверхности или перпендикулярная касательной плоскости в точке на неплоской поверхности.

Функция отображает значения в матрице Z как высоты над сеткой в плоскости x-y, определяемой X и Y. Цвет поверхности изменяется в соответствии с высотой, указанной Z. Матрицы X, Y, и Z должен быть одинакового размера.

surfnorm(Z) создает поверхность с нормалями и использует индексы столбцов и строк элементов в Z в качестве координат x и y соответственно.

surfnorm(ax,___) строит графики в осях, указанных ax вместо текущих осей. Укажите оси в качестве первого входного аргумента.

пример

surfnorm(___,Name,Value) задает свойства поверхности, используя один или несколько аргументов пары имя-значение. Например, 'FaceAlpha',0.5 создает полупрозрачную поверхность.

пример

[Nx,Ny,Nz] = surfnorm(___) возвращает компоненты x, y и z нормалей трехмерной поверхности для поверхности без печати.

Примеры

свернуть все

Создайте конус. Затем постройте график данных в виде поверхности и отобразите нормали поверхности. Поверхность использует Z как для высоты, так и для цвета.

[X,Y,Z] = cylinder(1:10);
surfnorm(X,Y,Z)

Figure contains an axes. The axes contains 2 objects of type surface, line.

Создайте поверхность без кромок, указав EdgeColor пара имя-значение с 'none' в качестве значения.

[X,Y,Z] = cylinder(1:10);
surfnorm(X,Y,Z,'EdgeColor','none')

Figure contains an axes. The axes contains 2 objects of type surface, line.

Используйте нормали поверхности криволинейной поверхности для освещения плоской поверхности.

Сначала отобразите плоскую поверхность.

surf(ones(49),'EdgeColor','none');

Figure contains an axes. The axes contains an object of type surface.

Отображение криволинейной поверхности для использования в качестве источника освещения.

surf(peaks);

Figure contains an axes. The axes contains an object of type surface.

Теперь нарисуйте плоскую поверхность снова, на этот раз с освещением от криволинейной поверхности. Для этого сначала вычислите нормали поверхности криволинейной поверхности.

[nx, ny, nz] = surfnorm(peaks);

Объедините x, y, и поверхность z нормальные компоненты в единственное множество 49 на 49 на 3.

b = reshape([nx ny nz], 49,49,3);

Снова создайте плоскую поверхность, на этот раз предоставив этот массив в качестве значения для VertexNormals собственность. MATLAB ® использует VertexNormals для расчета освещения поверхности. Установите алгоритм освещения в значение gouraud и добавить источник света с помощью camlight.

surf(ones(49),'VertexNormals',b,'EdgeColor','none');
lighting gouraud
camlight

Figure contains an axes. The axes contains an object of type surface.

Входные аргументы

свернуть все

x-координаты, заданная как матрица того же размера, что и Y и Z.

Вы можете использовать meshgrid для создания X и Y матрицы.

XData имущества Surface объект сохраняет координаты X.

Пример: X = [1 2 3; 1 2 3; 1 2 3]

Пример: [X,Y] = meshgrid(-5:0.5:5)

Типы данных: single | double | int8 | int16 | int32 | int64 | uint8 | uint16 | uint32 | uint64

y-координаты, заданная как матрица того же размера, что и X и Z.

Вы можете использовать meshgrid для создания X и Y матрицы.

YData свойство объекта поверхности сохраняет координаты Y.

Пример: Y = [1 1 1; 2 2 2; 3 3 3]

Пример: [X,Y] = meshgrid(-5:0.5:5)

Типы данных: single | double | int8 | int16 | int32 | int64 | uint8 | uint16 | uint32 | uint64

z-координаты, заданные как матрица. Z должен иметь не менее трех строк и трех столбцов. Z также задает цвета поверхности.

ZData свойство объекта поверхности сохраняет координаты Z.

Пример: Z = [1 2 3; 4 5 6; 7 8 9]

Типы данных: single | double | int8 | int16 | int32 | int64 | uint8 | uint16 | uint32 | uint64

Оси для печати в, указанные как axes объект. Если оси не указаны, то surfnorm строит графики в текущих осях.

Аргументы пары «имя-значение»

Укажите дополнительные пары, разделенные запятыми Name,Value аргументы. Name является именем аргумента и Value - соответствующее значение. Name должен отображаться внутри кавычек. Можно указать несколько аргументов пары имен и значений в любом порядке как Name1,Value1,...,NameN,ValueN.

Пример: surfnorm(X,Y,Z,'FaceAlpha',0.5,'EdgeColor','none') создает полупрозрачную поверхность без нарисованных кромок.

Примечание

Перечисленные здесь свойства являются только подмножеством. Полный список см. в разделе Свойства поверхности.

Цвет линии кромки, указанный как одно из значений, перечисленных здесь. Цвет по умолчанию [0 0 0] соответствует черным краям.

СтоимостьОписание
'none'Не нарисуйте кромки.
'flat'

Использовать разные цвета для каждого ребра на основе значений в CData собственность. Сначала необходимо указать CData свойство как матрица того же размера, что и ZData. Значение цвета в первой вершине каждой грани (в положительных направлениях x и y) определяет цвет смежных ребер. Вы не можете использовать это значение, когда EdgeAlpha свойство имеет значение 'interp'.

'interp'

Использовать интерполированную раскраску для каждой кромки на основе значений в CData собственность. Сначала необходимо указать CData свойство как матрица того же размера, что и ZData. Цвет изменяется на каждом ребре путем линейной интерполяции значений цвета в вершинах. Вы не можете использовать это значение, когда EdgeAlpha свойство имеет значение 'flat'.

Триплет RGB, шестнадцатеричный код цвета или имя цвета

Используйте указанный цвет для всех ребер. Этот параметр не использует значения цвета в CData собственность.

Триплеты RGB и шестнадцатеричные цветовые коды полезны для задания пользовательских цветов.

  • Триплет RGB - это трехэлементный вектор строки, элементы которого задают интенсивности красной, зеленой и синей составляющих цвета. Интенсивности должны находиться в диапазоне [0,1]; например, [0.4 0.6 0.7].

  • Шестнадцатеричный цветовой код - это символьный вектор или строковый скаляр, начинающийся с хэш-символа (#), за которыми следуют три или шесть шестнадцатеричных цифр, которые могут варьироваться от 0 кому F. Значения не чувствительны к регистру. Таким образом, цветовые коды '#FF8800', '#ff8800', '#F80', и '#f80' эквивалентны.

Можно также задать некоторые общие цвета по имени. В этой таблице перечислены параметры именованного цвета, эквивалентные триплеты RGB и шестнадцатеричные цветовые коды.

Имя цветаКраткое имяТриплет RGBШестнадцатеричный цветовой кодВнешность
'red''r'[1 0 0]'#FF0000'

'green''g'[0 1 0]'#00FF00'

'blue''b'[0 0 1]'#0000FF'

'cyan' 'c'[0 1 1]'#00FFFF'

'magenta''m'[1 0 1]'#FF00FF'

'yellow''y'[1 1 0]'#FFFF00'

'black''k'[0 0 0]'#000000'

'white''w'[1 1 1]'#FFFFFF'

Вот триплеты RGB и шестнадцатеричные цветовые коды для цветов по умолчанию MATLAB ®, используемых на многих типах графиков.

Триплет RGBШестнадцатеричный цветовой кодВнешность
[0 0.4470 0.7410]'#0072BD'

[0.8500 0.3250 0.0980]'#D95319'

[0.9290 0.6940 0.1250]'#EDB120'

[0.4940 0.1840 0.5560]'#7E2F8E'

[0.4660 0.6740 0.1880]'#77AC30'

[0.3010 0.7450 0.9330]'#4DBEEE'

[0.6350 0.0780 0.1840]'#A2142F'

Стиль линии, указанный в качестве одного из параметров, перечисленных в этой таблице.

Стиль линииОписаниеРезультирующая линия
'-'Сплошная линия

'--'Пунктирная линия

':'Пунктирная линия

'-.'Пунктирная линия

'none'Без строкиБез строки

Цвет грани, указанный как одно из значений в этой таблице.

СтоимостьОписание
'flat'

Использовать разные цвета для каждой грани на основе значений в CData собственность. Сначала необходимо указать CData свойство как матрица того же размера, что и ZData. Значение цвета в первой вершине каждой грани (в положительных направлениях x и y) определяет цвет для всей грани. Вы не можете использовать это значение, когда FaceAlpha свойство имеет значение 'interp'.

'interp'

Использовать интерполированную раскраску для каждой грани на основе значений в CData собственность. Сначала необходимо указать CData свойство как матрица того же размера, что и ZData. Цвет изменяется для каждой грани путем интерполяции значений цвета в вершинах. Вы не можете использовать это значение, когда FaceAlpha свойство имеет значение 'flat'.

Триплет RGB, шестнадцатеричный код цвета или имя цвета

Используйте указанный цвет для всех граней. Этот параметр не использует значения цвета в CData собственность.

'texturemap'Преобразование цветовых данных в CData чтобы она соответствовала поверхности.
'none'Не нарисуйте грани.

Триплеты RGB и шестнадцатеричные цветовые коды полезны для задания пользовательских цветов.

  • Триплет RGB - это трехэлементный вектор строки, элементы которого задают интенсивности красной, зеленой и синей составляющих цвета. Интенсивности должны находиться в диапазоне [0,1]; например, [0.4 0.6 0.7].

  • Шестнадцатеричный цветовой код - это символьный вектор или строковый скаляр, начинающийся с хэш-символа (#), за которыми следуют три или шесть шестнадцатеричных цифр, которые могут варьироваться от 0 кому F. Значения не чувствительны к регистру. Таким образом, цветовые коды '#FF8800', '#ff8800', '#F80', и '#f80' эквивалентны.

Можно также задать некоторые общие цвета по имени. В этой таблице перечислены параметры именованного цвета, эквивалентные триплеты RGB и шестнадцатеричные цветовые коды.

Имя цветаКраткое имяТриплет RGBШестнадцатеричный цветовой кодВнешность
'red''r'[1 0 0]'#FF0000'

'green''g'[0 1 0]'#00FF00'

'blue''b'[0 0 1]'#0000FF'

'cyan' 'c'[0 1 1]'#00FFFF'

'magenta''m'[1 0 1]'#FF00FF'

'yellow''y'[1 1 0]'#FFFF00'

'black''k'[0 0 0]'#000000'

'white''w'[1 1 1]'#FFFFFF'

Вот триплеты RGB и шестнадцатеричные цветовые коды для цветов по умолчанию MATLAB, используемых на многих типах графиков.

Триплет RGBШестнадцатеричный цветовой кодВнешность
[0 0.4470 0.7410]'#0072BD'

[0.8500 0.3250 0.0980]'#D95319'

[0.9290 0.6940 0.1250]'#EDB120'

[0.4940 0.1840 0.5560]'#7E2F8E'

[0.4660 0.6740 0.1880]'#77AC30'

[0.3010 0.7450 0.9330]'#4DBEEE'

[0.6350 0.0780 0.1840]'#A2142F'

Прозрачность грани, заданная как одно из следующих значений:

  • Скаляр в диапазоне [0,1] - использовать равномерную прозрачность для всех граней. Значение 1 является полностью непрозрачным и 0 является полностью прозрачным. Значения между 0 и 1 полупрозрачные. Этот параметр не использует значения прозрачности в AlphaData собственность.

  • 'flat' - Использовать различную прозрачность для каждой грани на основе значений в AlphaData собственность. Значение прозрачности в первой вершине определяет прозрачность для всей грани. Сначала необходимо указать AlphaData свойство как матрица того же размера, что и ZData собственность. FaceColor свойство также должно иметь значение 'flat'.

  • 'interp' - использовать интерполированную прозрачность для каждой грани на основе значений в AlphaData собственность. Прозрачность изменяется для каждой грани путем интерполяции значений в вершинах. Сначала необходимо указать AlphaData свойство как матрица того же размера, что и ZData собственность. FaceColor свойство также должно иметь значение 'interp'.

  • 'texturemap' - Преобразование данных в AlphaData чтобы она соответствовала поверхности.

Влияние светлых объектов на грани, указанное как одно из следующих значений:

  • 'flat' - Равномерно наносить свет на каждую грань. Это значение используется для просмотра фасетных объектов.

  • 'gouraud' - Изменение света по граням. Рассчитайте свет в вершинах, а затем выполните линейную интерполяцию света по граням. Это значение используется для просмотра криволинейных поверхностей.

  • 'none' - Не применять свет от объектов света к граням.

Для добавления объекта-источника света к осям используйте команду light функция.

Примечание

'phong' значение удалено. Использовать 'gouraud' вместо этого.

Выходные аргументы

свернуть все

Нормальный x-компонент поверхности, возвращаемый как матрица. Дополнительные сведения о том, как вычисляются нормали поверхности, см. в разделе Алгоритмы.

Нормальный Y-компонент поверхности, возвращаемый как матрица. Дополнительные сведения о том, как вычисляются нормали поверхности, см. в разделе Алгоритмы.

Нормальный Z-компонент поверхности, возвращаемый как матрица. Дополнительные сведения о том, как вычисляются нормали поверхности, см. в разделе Алгоритмы.

Совет

  • Чтобы изменить направление нормалей, вызовите surfnorm с транспонированными аргументами:

    surfnorm(X',Y',Z')
    

  • Чтобы показать направление нормалей на поверхности, используйте команду surfnorm для вычисления нормалей поверхности, а затем quiver3 для их отображения.

    [Nx,Ny,Nz] = surfnorm(X,Y,Z); 
    quiver3(X,Y,Z,Nx,Ny,Nz) 
    

  • Нормали поверхности представляют условия в вершинах и не нормализуются. Нормали для элементов поверхности, обращенных в сторону от наблюдателя, не видны.

Алгоритмы

surfnorm использует бикубическую интерполяцию в направлениях x, y и z для вычисления нормалей поверхности данных. Чтобы разрешить интерполяцию на границах, функция использует квадратичную экстраполяцию для расширения данных. После выполнения бикубической посадки данных диагональные векторы вычисляются и пересекаются для формирования нормали в каждой вершине.

Представлен до R2006a