surfnorm
曲面图法线
说明
surfnorm(
创建带法线的曲面,并将 Z
)Z
中元素的列索引和行索引分别用作 x 坐标和 y 坐标。
示例
创建带曲面图法线的曲面图
修改曲面图的外观
通过以 'none'
为值指定 EdgeColor
名称-值对组,创建一个无边曲面。
[X,Y,Z] = cylinder(1:10); surfnorm(X,Y,Z,'EdgeColor','none')
使用曲面图法线照亮曲面
使用曲面的曲面图法线照亮平面。
首先,显示一个平面。
surf(ones(49),'EdgeColor','none');
显示用作光源的曲面。
surf(peaks);
现在,再绘制一次平面,这次用来自曲面的光照。要完成此操作,首先计算曲面的曲面图法线。
[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
输入参数
X
— x 坐标
矩阵
x 坐标,指定为与 Y
和 Z
大小相同的矩阵。
您可以使用 meshgrid
函数创建 X
和 Y
矩阵。
Surface
对象的 XData
属性存储 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
— y 坐标
矩阵
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 坐标,指定为矩阵。Z
必须至少有三行三列。Z
也设置曲面颜色。
曲面对象的 ZData
属性存储 z 坐标。
示例: Z = [1 2 3; 4 5 6; 7 8 9]
数据类型: single
| double
| int8
| int16
| int32
| int64
| uint8
| uint16
| uint32
| uint64
ax
— 绘图所用的坐标区
坐标区对象
要在其中绘图的坐标区,指定为 axes
对象。如果未指定坐标区,则 surfnorm
在当前坐标区中绘图。
名称-值参数
将可选的参数对组指定为 Name1=Value1,...,NameN=ValueN
,其中 Name
是参数名称,Value
是对应的值。名称-值参数必须出现在其他参数之后,但参数对组的顺序无关紧要。
在 R2021a 之前,使用逗号分隔每个名称和值,并用引号将 Name
引起来。
示例: surfnorm(X,Y,Z,'FaceAlpha',0.5,'EdgeColor','none')
创建一个半透明曲面,并且不绘制边缘。
注意
此处所列的属性只是一部分。有关完整列表,请参阅 Surface 属性。
EdgeColor
— 边缘线条颜色
[0 0 0]
(默认) | 'none'
| 'flat'
| 'interp'
| RGB 三元组 | 十六进制颜色代码 | 'r'
| 'g'
| 'b'
| ...
边线颜色,指定为下面列出的值之一。默认颜色 [0 0 0]
对应于黑边。
值 | 描述 |
---|---|
'none' | 不绘制边。 |
'flat' | 根据 |
'interp' | 根据
|
RGB 三元组、十六进制颜色代码或颜色名称 | 对所有边使用指定的颜色。此选项不会使用
|
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" |
以下是 MATLAB® 在许多类型的绘图中使用的默认颜色的 RGB 三元组和十六进制颜色代码。
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" |
LineStyle
— 线型
"-"
(默认) | "--"
| ":"
| "-."
| "none"
线型,指定为下表中列出的选项之一。
线型 | 描述 | 表示的线条 |
---|---|---|
"-" | 实线 |
|
"--" | 虚线 |
|
":" | 点线 |
|
"-." | 点划线 |
|
"none" | 无线条 | 无线条 |
FaceColor
— 面颜色
'flat'
(默认) | 'interp'
| 'none'
| 'texturemap'
| RGB 三元组 | 十六进制颜色代码 | 'r'
| 'g'
| 'b'
| ...
面颜色,指定为下表中的值之一。
值 | 描述 |
---|---|
'flat' | 根据 |
'interp' | 根据
|
RGB 三元组、十六进制颜色代码或颜色名称 | 对所有面使用指定的颜色。此选项不会使用
|
'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" |
以下是 MATLAB 在许多类型的绘图中使用的默认颜色的 RGB 三元组和十六进制颜色代码。
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" |
FaceAlpha
— 面透明度
1 (默认) | 范围 [0,1]
中的标量 | 'flat'
| 'interp'
| 'texturemap'
面透明度,指定为下列值之一:
范围
[0,1]
中的标量 - 在所有面上使用统一的透明度。值为1
时完全不透明,值为0
时完全透明。介于0
和1
之间的值表示半透明。此选项不会使用AlphaData
属性中的透明度值。'flat'
- 根据AlphaData
属性中的值,对每个面使用不同的透明度。第一个顶点的透明度值确定整个面的透明度。首先您必须将AlphaData
属性指定为矩阵,大小与ZData
属性相同。FaceColor
属性也必须设置为'flat'
。'interp'
- 根据AlphaData
属性中的值,对每个面使用插值透明度。通过基于各顶点处透明度数值进行插值,每个面上的透明度会渐变。首先您必须将AlphaData
属性指定为矩阵,大小与ZData
属性相同。FaceColor
属性也必须设置为'interp'
。'texturemap'
- 变换AlphaData
中的数据,以便其符合曲面。
FaceLighting
— 光源对象对面的影响
'flat'
(默认) | 'gouraud'
| 'none'
光源对象对面的影响,指定为下列值之一:
'flat'
- 将光源均匀地应用于每个面上。使用此值可查看分面着色对象。'gouraud'
- 改变各个面的光源。计算顶点处的光线,然后以在各个面中进行光线插值。使用此值可查看曲面。'none'
- 不将来自光源对象的光源应用于各个面。
要向坐标区中添加光对象,请使用 light
函数。
注意
'phong'
值已被删除。请改用 'gouraud'
。
输出参数
提示
要反转法线的方向,请调用带转置参数的
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 之前推出
MATLAB 命令
您点击的链接对应于以下 MATLAB 命令:
请在 MATLAB 命令行窗口中直接输入以执行命令。Web 浏览器不支持 MATLAB 命令。
Select a Web Site
Choose a web site to get translated content where available and see local events and offers. Based on your location, we recommend that you select: .
You can also select a web site from the following list:
How to Get Best Site Performance
Select the China site (in Chinese or English) for best site performance. Other MathWorks country sites are not optimized for visits from your location.
Americas
- América Latina (Español)
- Canada (English)
- United States (English)
Europe
- Belgium (English)
- Denmark (English)
- Deutschland (Deutsch)
- España (Español)
- Finland (English)
- France (Français)
- Ireland (English)
- Italia (Italiano)
- Luxembourg (English)
- Netherlands (English)
- Norway (English)
- Österreich (Deutsch)
- Portugal (English)
- Sweden (English)
- Switzerland
- United Kingdom (English)