Main Content

surfnorm

説明

surfnorm(X,Y,Z)は 3 次元表面プロットを作成し、その面法線を表示します。面法線とは、変動の少ない表面に垂直な、または変動の多い表面の点における正接面に垂直な架空のラインです。

この関数は行列Zの値を、XYで定義される x-y 平面のグリッドの上の高さとしてプロットします。表面の色は、Zで指定された高さに応じて異なります。行列XYおよびZは,同じサイズでなければなりません。

surfnorm(Z)は表面とその法線を作成し、Zの要素の列インデックスと行インデックスをそれぞれ x 座標および y 座標として使用します。

surfnorm(ax,___)は、現在の座標軸ではなく、axで指定される座標軸にプロットします。座標軸を最初の入力引数として指定します。

surfnorm(___,Name,Value)は、1 つ以上の名前と値のペアの引数を使用して、表面のプロパティを指定します。たとえば、'FaceAlpha',0.5は半透明な表面を作成します。

[Nx,Ny,Nz] = surfnorm(___)は、何もプロットせずに、3 次元表面の面法線の x、y および z 成分を返します。

すべて折りたたむ

円錐を作成します。次に、データを表面としてプロットし、面法線を表示します。表面では、高さと色の両方にZが使用されます。

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

Figure contains an axes object. The axes object 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 object. The axes object contains 2 objects of type surface, line.

曲面の面法線を使用して、平面を照らします。

まず、平面を表示します。

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

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

曲面を表示して、光源として使用します。

surf(peaks);

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

次に、再び平面を描画しますが、今回は曲面からのライティングを使用します。これを行うには、まず曲面の面法線を計算します。

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

面法線の成分x、yおよびzを組み合わせて単一の 49 x 49 x 3 の配列にします。

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

再び平面を作成します。今回は、この配列をVertexNormalsプロパティの値として指定します。MATLAB® は、VertexNormalsプロパティを使用して表面のライティングを計算します。ライティング アルゴリズムをgouraudに設定し、camlightを使用してライトを追加します。

surf(ones(49),'VertexNormals',b,'EdgeColor','none'); lightinggouraudcamlight

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

入力引数

すべて折りたたむ

x座標。YおよびZと同じサイズの行列として指定します。

行列Xと行列Yを作成するには、関数meshgridを使用できます。

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 座標。XおよびZと同じサイズの行列として指定します。

行列Xと行列Yを作成するには、関数meshgridを使用できます。

surface オブジェクトの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は、少なくとも 3 行 3 列でなければなりません。Zは表面の色も設定します。

surface オブジェクトのZDataプロパティには z 座標が保存されます。

例:Z = [1 2 3; 4 5 6; 7 8 9]

データ型:single|double|int8|int16|int32|int64|uint8|uint16|uint32|uint64

プロット対象の座標軸。axesオブジェクトとして指定します。座標軸を指定しない場合、surfnormは現在の座標軸にプロットします。

名前と値の引数

引数のオプションのペアをName1=Value1,...,NameN=ValueNとして指定します。ここでNameは引数名で、Valueは対応する値です。名前と値の引数は他の引数の後になければなりませんが、ペアの順序は重要ではありません。

R2021a より前では、コンマを使用してそれぞれの名前と値を区切り、Nameを引用符で囲みます。

例:surfnorm(X,Y,Z,'FaceAlpha',0.5,'EdgeColor','none')は、エッジが描画されない半透明の表面を作成します。

メモ

ここでは,プロパティの一部だけを紹介しています。完全な一覧については、Surface のプロパティを参照してください。

エッジのラインの色。次のいずれかの値として指定します。既定の色は[0 0 0]で、これは黒色のエッジに対応します。

説明
'none' エッジを描画しません。
'flat'

CDataプロパティの値に基づいてエッジごとに異なる色を使用します。まず、CDataプロパティをZDataと同じサイズの行列として指定しなければなりません。各面の最初の頂点 (正の x 方向と y 方向) のカラー値が、隣接するエッジの色を決定します。この値はEdgeAlphaプロパティが'interp'に設定されている場合は使用できません。

Sample of a surface with each edge a different color based on sample values in the CData property

'interp'

CDataプロパティの値に基づいて、エッジごとに内挿によるカラーリングを使用します。まず、CDataプロパティをZDataと同じサイズの行列として指定しなければなりません。頂点でのカラー値を線形内挿することにより、各エッジの端から端に向かって色が変化します。この値はEdgeAlphaプロパティが'flat'に設定されている場合は使用できません。

Sample of a surface with each edge showing different interpolated coloring based on sample values in the CData property

RGB 3 成分、16 進数カラー コード、色名

指定した色をすべてのエッジに使用します。このオプションはCDataプロパティのカラー値を使用しません。

Sample of a surface with all edges shown in red

RGB 3 成分および 16 進数カラー コードは、カスタム色を指定するのに役立ちます。

  • RGB 3 成分は、色の赤、緑、青成分の強度を指定する 3 成分の行ベクトルです。強度値は[0,1]の範囲でなければなりません。たとえば[0.4 0.6 0.7]のようになります。

  • 16 進数カラー コードは、ハッシュ記号 (#) で始まり、3 桁または 6 桁の0からFまでの範囲の 16 進数が続く文字ベクトルまたは string スカラーです。これらの値では大文字小文字は区別されません。したがって、カラー コード'#FF8800''#ff8800''#F80'、および'#f80'は等価です。

あるいは、名前を使用して一部の一般的な色を指定できます。次の表に、名前の付いた色オプション、等価の RGB 3 成分、および 16 進数カラー コードを示します。

色名 省略名 RGB 3 成分 16 進数カラー コード 外観
“红色” 'r' [1 0 0] '#FF0000'

Sample of the color red

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

Sample of the color green

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

Sample of the color blue

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

Sample of the color cyan

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

Sample of the color magenta

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

Sample of the color yellow

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

Sample of the color black

“白色” 'w' [1 1 1] '#FFFFFF'

Sample of the color white

MATLAB®の多くのタイプのプロットで使用されている既定の色の RGB 3 成分および 16 進数カラー コードを次に示します。

RGB 3 成分 16 進数カラー コード 外観
[0 0.4470 0.7410] '#0072BD'

Sample of RGB triplet [0 0.4470 0.7410], which appears as dark blue

[0.8500 0.3250 0.0980] '#D95319'

Sample of RGB triplet [0.8500 0.3250 0.0980], which appears as dark orange

[0.9290 0.6940 0.1250] '#EDB120'

Sample of RGB triplet [0.9290 0.6940 0.1250], which appears as dark yellow

[0.4940 0.1840 0.5560] '#7E2F8E'

Sample of RGB triplet [0.4940 0.1840 0.5560], which appears as dark purple

[0.4660 0.6740 0.1880] '#77AC30'

Sample of RGB triplet [0.4660 0.6740 0.1880], which appears as medium green

[0.3010 0.7450 0.9330] '#4DBEEE'

Sample of RGB triplet [0.3010 0.7450 0.9330], which appears as light blue

[0.6350 0.0780 0.1840] '#A2142F'

Sample of RGB triplet [0.6350 0.0780 0.1840], which appears as dark red

ライン スタイル。次の表にリストされたオプションのいずれかとして指定します。

ライン スタイル 説明 結果として得られる線
“- - -” 実線

Sample of solid line

'--' 破線

Sample of dashed line

':' 点線

Sample of dotted line

'-.' 一点鎖線

Sample of dash-dotted line, with alternating dashes and dots

'none' ラインなし ラインなし

面の色。次の表のいずれかの値として指定します。

説明
'flat'

CDataプロパティの値に基づいて面ごとに異なる色を使用します。まず、CDataプロパティをZDataと同じサイズの行列として指定しなければなりません。各面の最初の頂点 (正の x 方向と y 方向) のカラー値が、面全体の色を決定します。この値はFaceAlphaプロパティが'interp'に設定されている場合は使用できません。

Sample of a surface with each face a different color based on sample values in the CData property

'interp'

CDataプロパティの値に基づいて、面ごとに内挿によるカラーリングを使用します。まず、CDataプロパティをZDataと同じサイズの行列として指定しなければなりません。頂点のカラー値を内挿することにより、各面の端から端へと色が変化します。この値はFaceAlphaプロパティが'flat'に設定されている場合は使用できません。

Sample of a surface with each face showing different interpolated coloring based on sample values in the CData property

RGB 3 成分、16 進数カラー コード、色名

指定した色をすべての面で使用します。このオプションはCDataプロパティのカラー値を使用しません。

Sample of a surface with all faces shown in red

'texturemap' CDataのカラー データを表面に適合するように変換します。
'none' 面を描画しません。

RGB 3 成分および 16 進数カラー コードは、カスタム色を指定するのに役立ちます。

  • RGB 3 成分は、色の赤、緑、青成分の強度を指定する 3 成分の行ベクトルです。強度値は[0,1]の範囲でなければなりません。たとえば[0.4 0.6 0.7]のようになります。

  • 16 進数カラー コードは、ハッシュ記号 (#) で始まり、3 桁または 6 桁の0からFまでの範囲の 16 進数が続く文字ベクトルまたは string スカラーです。これらの値では大文字小文字は区別されません。したがって、カラー コード'#FF8800''#ff8800''#F80'、および'#f80'は等価です。

あるいは、名前を使用して一部の一般的な色を指定できます。次の表に、名前の付いた色オプション、等価の RGB 3 成分、および 16 進数カラー コードを示します。

色名 省略名 RGB 3 成分 16 進数カラー コード 外観
“红色” 'r' [1 0 0] '#FF0000'

Sample of the color red

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

Sample of the color green

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

Sample of the color blue

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

Sample of the color cyan

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

Sample of the color magenta

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

Sample of the color yellow

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

Sample of the color black

“白色” 'w' [1 1 1] '#FFFFFF'

Sample of the color white

MATLAB の多くのタイプのプロットで使用されている既定の色の RGB 3 成分および 16 進数カラー コードを次に示します。

RGB 3 成分 16 進数カラー コード 外観
[0 0.4470 0.7410] '#0072BD'

Sample of RGB triplet [0 0.4470 0.7410], which appears as dark blue

[0.8500 0.3250 0.0980] '#D95319'

Sample of RGB triplet [0.8500 0.3250 0.0980], which appears as dark orange

[0.9290 0.6940 0.1250] '#EDB120'

Sample of RGB triplet [0.9290 0.6940 0.1250], which appears as dark yellow

[0.4940 0.1840 0.5560] '#7E2F8E'

Sample of RGB triplet [0.4940 0.1840 0.5560], which appears as dark purple

[0.4660 0.6740 0.1880] '#77AC30'

Sample of RGB triplet [0.4660 0.6740 0.1880], which appears as medium green

[0.3010 0.7450 0.9330] '#4DBEEE'

Sample of RGB triplet [0.3010 0.7450 0.9330], which appears as light blue

[0.6350 0.0780 0.1840] '#A2142F'

Sample of RGB triplet [0.6350 0.0780 0.1840], which appears as dark red

面の透明度。次の値のいずれかとして指定します。

  • 範囲[0,1]のスカラー — すべての面に一様な透明度を使用します。値1は完全に不透明で、値0は完全に透明です。01の間の値は半透明です。このオプションはAlphaDataプロパティの透明度値を使用しません。

  • 'flat'AlphaDataプロパティの値に基づいて面ごとに異なる透明度を使用します。面全体の透明度は、最初の頂点の透明度値によって決まります。まずAlphaDataプロパティをZDataプロパティと同じサイズの行列として指定しなければなりません。FaceColorプロパティも、'flat'に設定しなければなりません。

  • 'interp'AlphaDataプロパティの値に基づいて面ごとに内挿された透明度を使用します。頂点の値を内挿することにより、各面に異なる透明度が使用されます。まずAlphaDataプロパティをZDataプロパティと同じサイズの行列として指定しなければなりません。FaceColorプロパティも、'interp'に設定しなければなりません。

  • 'texturemap'AlphaDataのデータを表面に適合するように変換します。

面に対する light オブジェクトの効果。次の値のいずれかとして指定します。

  • 'flat'— 各面にライトを一様に適用します。この値は小平面で構成されたオブジェクトを表示する場合に使用します。

  • 'gouraud'— 面のライトを変化させます。各頂点のライトを計算し、面上でライトを線形内挿します。この値は曲面を表示する場合に使用します。

  • 'none'— light オブジェクトのライトを面に適用しません。

light オブジェクトを座標軸に追加するには、関数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 より前に導入