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×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 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 進数カラー コード外観
"red""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

"white""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 進数カラー コード外観
"red""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

"white""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 より前に導入