分享

三维绘图(2)| 曲面裁剪、向量场可视化、矩阵可视化、三维图形的旋转......

 小温爱怡宝 2023-07-23 发布于江西

9.2三维绘图(2)

  • 9.2.5 用NaNs裁剪曲面

  • 9.2.6 可视化向量场

  • 9.2.7 矩阵可视化

  • 9.2.8 三维图形的旋转

    • 补充

9.2.5 用NaNs裁剪曲面

如果曲面图的矩阵包含NaN,则不绘制这些元素。这使您能够切割(裁剪)表面的部分。例如,语句

 [x y] = meshgrid(-2:.2:2-2:.2:2);
z=x.* exp(-x.^2 - y.^2);
c = z; % preserve the original surface
c(1:11,1:21) = NaN*c(1:11,1:21);
%通过 c(1:11,1:21) = NaN * c(1:11,1:21) 将第一个区域的数据设置为 NaN。
%其中,1:11 表示行的范围,1:21 表示列的范围,将这个区域的值替换为 NaN。
mesh(c), xlabel('x-axis'), ylabel('y-axis')

要在Matlab中使用NaNs裁剪曲面,你可以使用NaN值来表示不需要显示的区域。NaN是一种特殊的数值,表示"不是一个数字"。

首先,你需要定义一个表示曲面的三维矩阵。这个矩阵的每个元素代表曲面上的一个点的高度或数值。然后,你可以使用NaN值来裁剪曲面。你可以将不需要显示的区域的高度或数值设置为NaN。例如,你可以使用以下代码来裁剪曲面的一部分:

% 定义网格的x、y坐标矩阵
x = linspace(-55100);
y = linspace(-55100);
[X, Y] = meshgrid(x, y);

% 计算每个网格点的高度或数值
Z = sin(sqrt(X.^2 + Y.^2)) ./ (sqrt(X.^2 + Y.^2));

% 将不需要显示的区域的高度或数值设置为NaN
Z(X < -2 | X > 2 | Y < -2 | Y > 2) = NaN;

% 绘制裁剪后的曲面
surf(X, Y, Z);

这段代码会生成一个以sin函数为基础的曲面,并将x和y坐标在-2到2之外的区域的高度或数值设置为NaN。这样,这些区域就不会显示出来。

9.2.6 可视化向量场

函数quiver可以绘制小箭头以指示梯度或其他向量场。虽然它生成的是2D图形,但通常与等高线图函数contour一起使用,这就是为什么在此简要介绍它的原因。例如,考虑两个变量 的标量函数,V的梯度被定义为向量场.

以下表述用箭头表示平面各点处 的方向

[x y] = meshgrid(-2:.2:2-2:.2:2);
V = x.^2 + y;
dx = 2*x;
dy = dx; % dy和dx一样大
dy(:,:) = 1% dy和dx一样大,但都是1
contour(x, y, V), hold on
quiver(x, y, dx, dy), hold off

“等高线”表示平面族;任何一点的梯度都垂直于经过该点的水平面。在等高线调用中需要向量x和y来指定等高线图的轴。

如果你不能(或不想)对V求导,你可以用梯度函数来估计导数:[dx dy] = gradient(V, 0.2, 0.2);, 值0.2是近似值中使用的x和y方向的增量。


要在Matlab中可视化向量场,你可以使用quiver函数。quiver函数可以绘制二维向量场的箭头图。

首先,你需要定义表示向量场的x、y坐标矩阵和对应的向量矩阵。x、y坐标矩阵表示向量场中每个点的位置,向量矩阵表示每个点的向量。

然后,你可以使用quiver函数来绘制向量场。这个函数的输入参数包括x、y坐标矩阵、向量矩阵,以及可选的箭头长度和其他绘图选项。例如,你可以使用以下代码来绘制一个简单的向量场:

% 定义网格的x、y坐标矩阵
x = linspace(-5510);
y = linspace(-5510);
[X, Y] = meshgrid(x, y);

% 计算每个网格点的向量
U = -Y;
V = X;

% 绘制向量场
quiver(X, Y, U, V);

首先,使用 linspace 函数创建了一个长度为 10 的线性间隔,范围从 -5 到 5。然后,使用 meshgrid 函数将 x 和 y 轴的坐标点组成一个二维矩阵。这样就创建了一个网格,其中每个点都有一个对应的 x 和 y 坐标。

接下来,根据需要定义了每个网格点的向量。在这个例子中,我们的向量场的每个向量都是垂直旋转的,即 x 分量为 y 坐标的负值,y 分量为 x 坐标的值。

最后,使用 quiver 函数绘制向量场。quiver 函数的第一个参数是网格点的 x 坐标,第二个参数是 y 坐标,第三个参数是 x 分量的值,第四个参数是 y 分量的值。这样,quiver 函数会根据给定的坐标和向量绘制出相应的向量场。


quiver的其他可选参数指定了箭头的长度。

可以使用 quiver 函数的可选参数来指定箭头的长度。下面是一个示例:

% 定义网格的x、y坐标矩阵
x = linspace(-5510);
y = linspace(-5510);
[X, Y] = meshgrid(x, y);

% 计算每个网格点的向量
U = -Y;
V = X;

% 绘制向量场,并设置箭头长度为2
quiver(X, Y, U, V, 2);

在这个例子中,我们在 quiver 函数的最后一个参数中设置了箭头的长度为 2。这样,绘制出的每个箭头都会按照指定的长度进行缩放。

除了箭头长度之外,quiver 函数还有其他可选参数,如箭头宽度、颜色、线型、缩放因子等。你可以根据需要进行调整。例如,要设置箭头的宽度为 1,可以将代码修改为:

quiver(X, Y, U, V, 2'LineWidth'1);

9.2.7 矩阵可视化

网格函数也可以用来“可视化”一个矩阵。下图由以下语句生成:

a = zeros(30,30);
a(:,15) = 0.2*ones(30,1);
a(7,:) = 0.1*ones(1,30);
a(15,15) = 1;
mesh(a)

矩阵 a 是。中间的元素是1,第7行的所有元素都是0.1,第15列的所有元素都是0.2 , 网格然后将a的行和列解释为 坐标网格,值形成点上方的网格表面。


首先,你需要定义一个表示矩阵的二维矩阵。这个矩阵的每个元素代表矩阵中的一个值。

然后,你可以使用surf函数来绘制矩阵的3D图。这个函数的输入参数包括矩阵的x、y坐标矩阵和对应的z值矩阵,以及可选的颜色映射和其他绘图选项。例如,你可以使用以下代码来绘制一个简单的矩阵的3D图:

% 定义矩阵的x、y坐标矩阵
x = 1:10;
y = 1:10;
[X, Y] = meshgrid(x, y);

% 定义矩阵的z值矩阵
Z = rand(1010);

% 绘制矩阵的3D图
surf(X, Y, Z);

这段代码会生成一个以矩阵的值为基础的3D图。每个点的位置由x、y坐标矩阵确定,点的高度由z值矩阵确定。

补充说明:magic(10) 是一个 MATLAB 中的函数,可以生成一个 10x10 的矩阵,矩阵中的每一行、每一列以及对角线上的元素之和都相等,常被称为幻方。具体实现可以使用以下代码:

A = magic(10)

运行后,MATLAB 会生成一个 10x10 的矩阵 A,矩阵中的元素如下所示:

A = 

    92    99     1     8    15    67    74    51    58    40
    98    80     7    14    16    73    55    57    64    41
     4    81    88    20    22    54    56    63    70    47
    85    87    19    21     3    60    62    69    71    28
    86    18    25     2     9    61    68    75    52    34
    17    24    76    83    90    42    49    26    33    65
    23    30    82    89    91    48    32    39    41    72
    29    36    63    65    67    29    31    38    45    77
    35    42    60    62    49    51    28    30    37    84
    41    58    59    50    52    39    46    48    55    57

每一行、每一列以及对角线上的元素之和都等于 505。


再看一个示例使用surf函数绘制3D图形:

% 创建一个示例矩阵
matrix = magic(10);

% 使用surf函数绘制3D图形
surf(matrix);
surf

在这个示例中,我们创建了一个示例矩阵matrix,然后使用surf函数绘制了该矩阵的3D图形。surf函数会根据矩阵中的值,自动调整颜色和高度来表示数据的变化。

另外,如果你想要以网格形式绘制3D图形,可以使用mesh函数。例如:

% 使用mesh函数绘制3D图形
mesh(matrix);

mesh函数与surf函数类似,但它以网格形式绘制图形,更加突出数据的结构。

mesh

9.2.8 三维图形的旋转

函数view可以指定你从哪个角度观察一个3D图形。为了看到它的操作过程,请运行以下程序,该程序将旋转可视化的矩阵图:

a = zeros(30,30);
a(:,15) = 0.2*ones(30,1);
a(7,:) = 0.1*ones(1,30);
a(15,15) = 1;
el = 30;
for az = -37.5:15:-37.5+360
mesh(a), view(az, el)
pause(0.5)
end

函数view接受两个参数。第一个参数az是方位角或极坐标角度(以度为单位)。az将视点(你)绕z轴旋转,即绕图中的“顶点”(15,15)以逆时针方向旋转。az的默认值为-37.5度。因此,该程序以15度的步长逆时针方向绕z轴旋转视点,起始位置为默认位置。

view的第二个参数是垂直仰角el(以度为单位)。这是视点与x-y平面成的角度。el为90度表示你位于正上方。正值的仰角表示你在x-y平面上方;负值表示你在x-y平面下方。el的默认值为30度。

命令pause(n)会暂停执行n秒。

点击坐标轴,图形的轮廓将出现,帮助你可视化旋转。拖动鼠标以你想要旋转的方向。释放鼠标按钮后,旋转后的图形将重新绘制。


可以使用rotate3d函数来实现三维图形的旋转。该函数允许你通过鼠标交互地旋转和缩放三维图形。

以下是一个简单示例:

% 创建一个示例的三维图形
[X, Y, Z] = sphere(30);
figure;
surf(X, Y, Z);

% 启用三维图形的交互旋转
rotate3d on;

在这个示例中,我们使用sphere函数创建了一个球面的三维图形,并使用surf函数绘制出来。然后,通过调用rotate3d on来启用三维图形的交互旋转功能。

当你运行这段代码并显示图形后,你可以通过鼠标在图形上点击并拖动来旋转图形。你还可以使用鼠标滚轮来进行缩放操作。

再看一个例子:

% 创建一个曲面对象
[X, Y, Z] = peaks(30);
surf(X, Y, Z)

% 设置旋转角度和轴向
angle = 45% 旋转角度(以度为单位)
axis = [110]; % 旋转轴向(x、y和z轴的组合)

% 旋转曲面对象
rotate(gca, axis, angle)

%"gca"是"get current axes"的缩写

在这个示例中,我们首先使用peaks函数创建了一个曲面对象,并使用surf函数将其绘制出来。然后,我们设置了旋转角度为45度,并指定了旋转轴向为x、y和z轴的组合。最后,我们使用rotate函数来旋转曲面对象。

你可以根据自己的需求调整旋转角度和轴向,以及曲面对象的类型和属性。

补充

函数peaks是Matlab中的一个内置函数,用于生成一个二维或三维的山峰图。

在二维情况下,peaks函数生成一个二维高度图,其中x和y轴表示坐标,z轴表示高度。这个函数的语法是:

Z = peaks

这将生成一个51x51的矩阵Z,其中包含了山峰图的高度值。

在三维情况下,peaks函数生成一个三维山峰图,其中x、y和z轴分别表示坐标和高度。这个函数的语法是:

[X, Y, Z] = peaks

这将生成三个51x51的矩阵X、Y和Z,分别表示山峰图的x、y和z坐标。

peaks函数的输出可以用于绘制二维或三维的山峰图,例如使用surf函数绘制三维山峰图:

[X, Y, Z] = peaks;
surf(X, Y, Z);

    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多