将球体转换为面片后,我绘制了面片的第一个顶点,发现顶点不在球体上。
代码
[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()
,而第二次和第三次调用surf2patch()
没有输入[x, y]值,因此它们会自动生成不同于原始[x,y,z ] .
课
如果您期望多个返回值,请显式分配它们。