繁体   English   中英

在MATLAB中绘制3D

[英]Plotting 3D in MATLAB

嗨,大家好,如果这个问题看起来真的很蠢,对不起。 我是编程新手,需要使用MATLAB绘制以下图像。
我已经尝试了一遍又一遍,似乎无法理解MATLAB的工作原理。
有没有人可以帮助编写代码来绘制这样的图片并向我解释编程的工作原理?

我通常不会回答我给Coodz的问题,但是绘制这张图太诱人了。 此图将几种绘图方法结合在一起:

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

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

view(3)移动相机,使其成为3D图的默认MATLAB方向。 我们还使xy方向像图一样反转。 我们还使用set和使用该gcaG ETTING在情节的焦点与c 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;

上面将生成一个2D的点网格,其分辨率为您的图形所需的1/6

步骤#4-绘制点

确保hold on以便我们可以在同一图形上放置更多内容,然后使用plot3放置以下几点:

hold on;
plot3(X, Y, Z, 'b.', 'MarkerSize', 32);

这将绘制我们的点并使它们变蓝。 这也使标记大小的直径为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');

text通过接受(x,y,z)坐标起作用,您可以将文本放置在该位置。 从技术上讲,图表的中间是(1/3,1/3,1/3) ,但是如果我将其放在此处,您不会真正看到该文本。 我决定将其设置为(0.3,0.3,0.4) 最后,我们将从基点到点画一条线。 line接受xyz点的向量。 每列代表一个点,因此我在(1/2,1/2,0)的底部到(1/3,1/3,1/3)的中间画一条线。 我还把线弄黑了。

最后,我要为轴添加一些标题:

xlabel('R');
ylabel('P');
zlabel('S');

现在我们得到:

在此处输入图片说明

... 我喜欢!


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

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

您可以使用fill3(X,Y,Z,C)函数。 X,Y和Z三元组指定多边形顶点。 C指定颜色,其中C是当前颜色图的向量或索引矩阵, 在这里您可以看到如何创建此颜色向量。

如果要显示轴网格线,则应使用grid on。

这里是一个例子:

x = [0 1 1];                      
y = [0 1 0];
z = [0 1 0];
c = [0 0 1];
figure(1) % open a new figure
subplot(1,1,1) % create a subplot with 1 row and 1 column and select first
fill(x,y,z,c)
grid on
hold on
PointXYZ = 0;
plot3(PointXYZ,PointXYZ,PointXYZ,'*m')

plot3函数显示一组数据点的三维图,在这种情况下为(0,0,0)。 '* m'定义图表线属性。

这是一个例子。 要显示所有点,必须创建坐标矢量,并在plot3中使用它们。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM