`surf` 图中意外的颜色

Unexpected colors in `surf` plot

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

Using functions linspace,meshgrid,surf and dot operations, plot the surface of the cones: z=sqrt(x^2+y^2) and z=-sqrt(x^2+y^2). Use the vector form of the coordinate transformation x=rcos(θ),y=rsin(θ), where 0 ≤ θ ≤ 2π and 0 ≤ r ≤ 2. Make the partition composed of 10 values of r and 22 values of θ.

因此,我的代码如下所示:

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);

我得到下图:

我不知道如何解释为什么上面的锥体是那样的颜色。

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

您为同一个 xy 设置了多个 z 值。 事实上,我很惊讶它竟然以这种方式工作。

尝试分别绘制这两部分:

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);

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

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

i1:length(X)-1 范围内,j1:length(Y)-1 范围内。

问题中给出坐标的方式,生成了额外的退化三角形四边形,连接锥体的上边界边缘 z > 0 与原点。这些面或多或少与代表圆锥正半边的四边形面片完全重叠:较小四边形坐标中的舍入误差导致与三角形面片的对齐不完美,进而导致绘图时涉及的深度测试不规则补丁。

当翻转第二个圆锥的坐标顺序时,您可以很容易地看到这些额外的面,这会导致额外的 "cylinder" 由连接相应边界边的四边形构建:

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

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

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