`surf` plot

时间:2015-05-12 17:02:13

标签: matlab matlab-figure

我正在尝试编写一个能够回答以下问题的matlab代码:

  

使用函数linspace,meshgrid,surf和dot操作,绘制   锥体的表面:z = sqrt(x ^ 2 + y ^ 2)并且z = -sqrt(x ^ 2 + y ^ 2)。   使用坐标变换的矢量形式x = rcos(θ),y = rsin(θ),其中0≤   θ≤2π且0≤r≤2。使分区由10个r值和22个θ值组成。

所以,我的代码看起来像这样:

clear all
clc

theta = linspace(0,2*pi,22); r = linspace(0,2,10);
[R,T] = meshgrid(r,theta);
x = R.*cos(T); y = R.*sin(T);
z = R;
X = [x x]; Y = [y y]; Z = [z -z];
surf(X,Y,Z);

我得到了下图: enter image description here

我不知道如何解释为什么上锥体会这样着色。

有什么办法可以解决吗?请帮忙,谢谢!

2 个答案:

答案 0 :(得分:3)

您为同一zx添加了多个y值。 事实上,我很惊讶它甚至以这种方式工作。

尝试分别绘制两个部分:

clear all
clc

theta = linspace(0,2*pi,22); r = linspace(0,2,10);
[R,T] = meshgrid(r,theta);
x = R.*cos(T); y = R.*sin(T);
z = R;
X = [x]; Y = [y]; Z = [z];
figure();
surf(X,Y,Z);

hold on;
surf(X,Y,-Z);

enter image description here

答案 1 :(得分:0)

至于解释为什么以这种方式着色,答案是Z-fighting。假设固定网格拓扑,surf创建连续的四边形。如何创建面是surf的硬编码属性,它假设前两个参数指定网格的点:构成具有索引(i,j)的面的四个网格坐标获得为

[X(i); Y(j)], [X(i); Y(j+1)], [X(i+1); Y(j)], [X(i+1); Y[(j+1)]

i范围内的1:length(X)-1j中的1:length(Y)-1

在问题中给出了坐标的方式,生成了额外的简并三角形四边形,将锥体的上边界边缘与原点z > 0连接起来。这些面或多或少地与表示锥体的正半部的四边形斑块重叠:较小四边形坐标中的圆角误差导致与三角形斑块的不完美对齐,这反过来导致绘制时涉及的深度测试的不规则性补丁。

当翻转第二个圆锥周围的坐标顺序时,您可以轻松地看到这些附加面,这会导致从连接相应边界边的四边形构建一个额外的“圆柱体”:

surf([x fliplr(x)], [y fliplr(y)], [z -fliplr(z)]);
alpha 0.5

Cone with extra quads

或者,问题中陈述的原始问题可以通过单击surf来解决,通过翻转上半部分,从上到下绘制整个图形,以及(可选)跳过冗余列零,这将导致所有坐标为零的退化补丁:

surf([fliplr(x) x(:,2:end)], [fliplr(y) y(:,2:end)], [fliplr(z) -z(:,2:end)]);