球をパッチに変換した後、パッチの最初の頂点をプロットしたところ、頂点が球上にないことに気付きました。
コード
[faces, vertices] = surf2patch(sphere(),'triangle');
sphere();
hold on;
plot3(vertices(1,1), vertices(1,2), vertices(1,3),'*r');
結果の図は次のようになります
頂点が球の表面にないのはどうしてですか? 私は何か誤解していますか?
ありがとう
説明
関数が別の関数の引数である場合、Matlab はこれを単一の戻り値を持つ関数呼び出しとして扱います。 上記の関数呼び出しのコンテキストでは、
[faces, vertices] = surf2patch(sphere(),'triangle');
次と同等です。
z = sphere();
[faces, vertices] = surf2patch(z,'triangle');
ドキュメントから思い出してください:
[x, y, z] = sphere()
3D 座標[x, y, z]のセットを計算します。
z = sphere()
同じ[x, y, z]を計算し、 zのみを返します。
sphere()
with (nargout = 0) は同じ[x, y, z]を計算し、プロットします。これは、上の図に示されている色球です。
surf2patch.mのソースを調べると、単一のz引数を指定して呼び出すと、 xとyの値が自動的に想定されることがわかります。これらの値は、引数なしで呼び出してプロットされた[x, y, z] とは異なります。sphere()
テスト
自分の目で確かめるために、 surf2patch.m内でブレークポイントを有効にして次のコードをトレースし、入力引数を調べます。
[x,y,z] = sphere()
[facesA, verticesA] = surf2patch(x,y,z,'triangle')
[facesB, verticesB] = surf2patch(sphere(), 'triangle')
[facesC, verticesC] = surf2patch(z, 'triangle')
出力[facesA, verticesA]は からのプロットと一致することがわかりますsphere()
が、2 番目と 3 番目の呼び出しでsurf2patch()
は入力[x, y]値がないため、元の[x,y,zとは異なる値に自動生成されます。 ] .
レッスン
複数の戻り値が予想される場合は、それらを明示的に割り当てます。