我正在尝试编写一个能够回答以下问题的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);
我得到了下图:
我不知道如何解释为什么上锥体会这样着色。
有什么办法可以解决吗?请帮忙,谢谢!
答案 0 :(得分:3)
您为同一z
,x
添加了多个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);
答案 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)-1
和j
中的1:length(Y)-1
。
在问题中给出了坐标的方式,生成了额外的简并三角形四边形,将锥体的上边界边缘与原点z > 0
连接起来。这些面或多或少地与表示锥体的正半部的四边形斑块重叠:较小四边形坐标中的圆角误差导致与三角形斑块的不完美对齐,这反过来导致绘制时涉及的深度测试的不规则性补丁。
当翻转第二个圆锥周围的坐标顺序时,您可以轻松地看到这些附加面,这会导致从连接相应边界边的四边形构建一个额外的“圆柱体”:
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)]);