Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/matlab/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/cocoa/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Matlab 着色不适用于指定面颜色的面片?_Matlab_Mesh - Fatal编程技术网

Matlab 着色不适用于指定面颜色的面片?

Matlab 着色不适用于指定面颜色的面片?,matlab,mesh,Matlab,Mesh,我不明白为什么下面的代码会抛出警告: % mesh of a plane at z=0 for x,y in [0,5] with 20 vertices per side n = 20; [x,y] = ndgrid( linspace(0,5,n) ); x = x(:); y = y(:); z = zeros(n^2,1); % triangulation to obtain faces, and draw a patch with random color for each face

我不明白为什么下面的代码会抛出警告:

% mesh of a plane at z=0 for x,y in [0,5] with 20 vertices per side
n = 20;
[x,y] = ndgrid( linspace(0,5,n) );
x = x(:); y = y(:); z = zeros(n^2,1);

% triangulation to obtain faces, and draw a patch with random color for each face
F = delaunay(x,y);
V = [x,y,z];
patch( 'Vertices', V, 'Faces', F, 'FaceVertexCData', rand( size(F,1), 1 ) );
axis tight; grid on; box off;

% faceted shading works fine, but interp doesn't seem to work
shading('faceted'); % works fine
shading('interp'); % throws a warning

   Warning: Error creating or updating Patch
    Error in value of property  FaceVertexCData
    Number of colors must equal number of vertices

希望这些注释足以解释问题-但简单地说,当属性FaceVertexData指定面颜色而不是顶点时,面颜色的插值似乎不起作用。

如警告消息所述,如果要使用“interp”着色方法,您需要让FaceVertexData为每个顶点都有一个条目。当前,每个面都有一个条目

patch( 'Vertices', V, 'Faces', F, 'FaceVertexCData', rand( size(V,1), 1 ) );
shading('interp')
这不是问题或错误,因为着色将面片对象的属性设置为“interp”,这明确要求每个顶点的FaceVertexCData中都有一个条目

“interp”-在每个面上插值颜色。首先,将CData或FaceVertexData指定为每个顶点包含一个值的数组。通过使用每个顶点上的值的双线性插值来确定面颜色


仅供参考,如果要将每个面的颜色向量转换为每个顶点的颜色向量,可以使用以下函数:

function cdata = face2vertex(cdata,faces,nvert)

    fmax = max(faces(:));
    if nargin < 3, nvert=fmax; end
    if size(faces,1)~=3, faces=faces'; end

    assert( size(faces,1)==3, 'Bad faces size.' );
    assert( size(faces,2)==numel(cdata), 'Input size mismatch.' );
    assert( nvert >= fmax, 'Number of vertices too small.' );

    faces = faces(:);
    cdata = repelem( cdata(:), 3 ); % triplicate face colors

    nfpv  = accumarray( faces, 1, [nvert,1] ); % #of faces per vertex
    cdata = accumarray( faces, cdata, [nvert,1] ) ./ max(1,nfpv);

end
此函数接收输入:

NFACE x 1颜色列向量cdata, 一个NFACE x 3顶点索引数组,每行一个三角形, (可选)顶点数,这将覆盖从面索引推断的输出大小。
并返回颜色的Nvertices x 1列向量,这样对于每个顶点,颜色在包含它的面上平均。

您的回答让我笑了,因为这正是警告所说的;我会读书,但我不明白为什么会这样?根据文档规定,为每个面指定FaceVertexData是合法的,着色文档没有提及选项interp的任何特定问题。你认为这是一个错误吗?如果不是,为什么文档中没有提到这个问题?请不要把它当作个人问题,如果我的问题不清楚,请告诉我。我在摘录下添加了一些文本,但我会否决你的答案,因为我认为它没有用处。@Sheljohn这不是一个错误。我已经包括了官方文档的链接,并添加了一个摘录,其中明确定义了行为,因为它允许我绕过这个限制,所以我将在两天内选择我的答案,但感谢您的回答!