在 MATLAB 中绘制 3D

Bra*_*010 -1 3d matlab

嗨,伙计们,对不起,如果这个问题看起来很愚蠢。我对编程完全陌生,需要使用 MATLAB 绘制以下图像。
我一遍又一遍地尝试,似乎无法理解 MATLAB 是如何工作的。
有没有人可以帮助编写代码来绘制这样的图片并向我解释编程是如何工作的?

ray*_*ica 5

我通常不回答给我一些很酷的问题,但是画这个图太诱人了,无法通过。该图结合了多种绘图方法:

  1. 使用创建三角形patch

  2. 设置轴属性以反转轴顺序并设置颜色属性以使三角形透明。这是使用set.

  3. 使用 生成点网格meshgrid

  4. 使用 绘制点plot3

  5. 使用 使文本可见text

  6. 使用line和设置轴标签绘制黑色垂直线。

第 1 步 - 绘制三角形

创建该三角形的最佳方法是使用该patch函数。 patch接受一组顶点以及您如何遍历这些顶点的顺序,以及可选的面部颜色。因此,第一部分代码是这样的:

vert = [0 1 0; 1 0 0; 0 0 1];
patch('Vertices', vert, 'Faces', 1:3, 'FaceColor', 'cyan');
Run Code Online (Sandbox Code Playgroud)

vert是一个顶点列表。每行由形状包含的控制点组成。每一列是一个坐标。第一列是R,第二列是P,第三列是S。因为我们的三角形中有三个点,所以有三排点。每一行由每个三角形的一个角点组成。请注意我特别订购积分的方式。您需要按顺时针(或逆时针……由您决定)顺序定义点,因为稍后将使用它。

现在看看我是如何调用的patch。我们需要关注三个属性:

  1. Vertices 由定义我们形状的点组成
  2. Faces要求您指定以正确顺序绘制哪些点。通过指定Faces = 1:3 --> [1 2 3],我将按该顺序绘制第一个、第二个和第三个点。这以顺时针顺序遍历点,然后为我们提供填充的三角形。
  3. FaceColor允许您指定三角形的颜色。我做了这个cyan

因此,我们首先得到这个:

在此处输入图片说明

……没有那么令人印象深刻吧?

第 2 步 - 玩弄图形

输出将是一个填充的形状,但这最初将在 2D 中可视化......就像我们在上面看到的那样。我们需要做的下一件事是旋转相机,使其正确地可视化三角形。此外,轴是反向的,不像传统的轴。我们也必须扭转这些。另外,我们可能想制作一个grid并使脸部颜色透明。

您可以在此处使用此代码执行此操作:

view(3)
set(gca, 'xdir', 'reverse')
set(gca, 'ydir', 'reverse')
grid;
alpha('color')
Run Code Online (Sandbox Code Playgroud)

view(3)移动相机,使其成为 3D 绘图的默认 MATLAB 方向。我们还使xy方向像情节一样颠倒。我们还使用set和使用gcaģ ETTING的Ç urrent中的情节的焦点XES,并设置xxdir)和y方向(ydir)中reverse。我还制作了一个grid并设置了alpha属性以使其FaceColor透明。

这是我们得到的:

在此处输入图片说明

……好吧……还不错。

第 3 步 - 生成三角形中的点

我们需要提出我们的观点。你可以meshgrid像上面那样做。这个平面遵循 的方程z = 1 - x - y,但我们需要确保我们过滤掉那些小于 0 的值,我们不应该将它们可视化。您可以先生成您meshgrid的点数,然后将任何小于 0 的值设置为NaN不显示它们。为了绝对确定并避免浮点错误,我将检查小于 -0.1:

[X,Y] = meshgrid(0:(1/6):1);
Z = 1 - X - Y;
Z(Z < -0.01) = NaN;
Run Code Online (Sandbox Code Playgroud)

以上生成了一个 2D 点网格,这些点是1/6您的图形所需的分辨率。

第 4 步 - 绘制点

确保你hold on这样我们可以在同一张图上放更多的东西,然后plot3用来把这些点放在一起:

hold on;
plot3(X, Y, Z, 'b.', 'MarkerSize', 32);
Run Code Online (Sandbox Code Playgroud)

这将绘制我们的点并使它们变成蓝色。这也使标记大小的直径为 32 像素,因此我们可以更好地看到事物。

我们现在得到这个:

在此处输入图片说明

……不错,不错。

步骤 #5 和 #6 - 添加文本框,绘制线条并添加一些轴标签

我们现在将NE文本添加到绘图的中间。我们还想从底部到图的中间画一条线:

text(0.3,0.3,0.4, 'NE');
line([1/2 1/3], [1/2 1/3], [0 1/3], 'color', 'black');
Run Code Online (Sandbox Code Playgroud)

text通过接受(x,y,z)坐标来工作,您可以在该位置放置文本。图表的中间在技术上是(1/3,1/3,1/3),但如果我把它放在这里,你并不能很好地看到文字。我决定把它放在(0.3,0.3,0.4). 最后,我们将画一条从基地到点的线。 line接受x,yz点的向量。每列代表一个点,所以我画了一条从底部 at(1/2,1/2,0)到中间 at 的线(1/3,1/3,1/3)。我也把这条线变黑了。

最后,我将在轴上添加一些标题:

xlabel('R');
ylabel('P');
zlabel('S');
Run Code Online (Sandbox Code Playgroud)

我们现在得到:

在此处输入图片说明

... 我喜欢!


为了您复制和粘贴的乐趣,这里是您可以用来运行并获得上图的完整代码:

vert = [0 1 0; 1 0 0; 0 0 1];
patch('Vertices', vert, 'Faces', 1:3, 'FaceColor', 'cyan')
view(3)
set(gca, 'xdir', 'reverse')
set(gca, 'ydir', 'reverse')
grid
alpha('color')
[X,Y] = meshgrid(0:(1/6):1);
Z = 1 - X - Y;
Z(Z < -0.01) = NaN;
hold on;
plot3(X, Y, Z, 'b.', 'MarkerSize', 32);
text(0.3,0.3,0.4, 'NE');
line([1/2 1/3], [1/2 1/3], [0 1/3], 'color', 'black');
xlabel('R'); ylabel('P'); zlabel('S');
Run Code Online (Sandbox Code Playgroud)