英文:
MATLAB: How to plot a rectangle in 3d space
问题
我有以下示例数据:
x = [2;4;6;8;10]
y = [10;20;30;40;50]
z = [5;5;5;5;5]
我试图在三维空间中绘制2D x/y 曲面,但由于 z 值是常数,我似乎无法弄清如何实现。我尝试过的所有示例都不起作用,因为这些点是共线的。
谢谢。
英文:
I have the following example data:
x = [2;4;6;8;10]
y = [10;20;30;40;50]
z = [5;5;5;5;5]
I am trying to plot a the 2d x/y surface in 3d space but since z is constant I can't seem to figure out how to do it. All examples I've tried to follow don't work since the points are colinear.
Thanks
答案1
得分: 2
在MATLAB中,有不同的方法来生成一个**'3D矩形',也被称为平行六面体**,Wolfram定义。
1.- 定义所有的实体点
xrange=[0:1:10];
yrange=[0:1:20];
zrange=[0:1:5];
[x,y,z]=meshgrid(xrange,yrange,zrange);
x=x(:);y=y(:);z=z(:);
P=[x y z];
figure(1);
plot3(P(:,1),P(:,2),P(:,3),'.');
axis equal
grid on
shp1=alphaShape(P(:,1),P(:,2),P(:,3))
figure(2);
plot(shp1)
axis equal
一旦建立了alphaShape
,可以使用以下volume
和surfaceArea
命令:
round(volume(shp1))
与
(xrange(end)-xrange(1))*(yrange(end)-yrange(1))*(zrange(end)-zrange(1))
以及
surfaceArea(shp1)
与
2*xrange(end)*yrange(end)+2*xrange(end)*zrange(end)+2*yrange(end)*zrange(end)
2.- 仅使用顶点
xrange2=[0 10];
yrange2=[0 20];
zrange2=[0 5];
[x2,y2,z2]=meshgrid(xrange2,yrange2,zrange2);
x2=[x2(:);5];
y2=[y2(:);10];
z2=[z2(:);2.5];
P2=[x2 y2 z2];
Tes=delaunayn(P2);
figure(3)
tetramesh(Tes,P2);
camorbit(40,0);
3.- 使用patch
命令
v1=[0 0 0;10 0 0;10 20 0;0 20 0
0 0 5;10 0 5;10 20 5;0 20 5];
f1=[1 2 3 4 1;5 6 7 8 5];
v2=[0 0 0;0 20 0;0 20 5;0 0 5
10 0 0;10 20 0;10 20 5;10 0 5];
f2=[1 2 3 4 1;5 6 7 8 5];
v3=[0 0 0;10 0 0;10 0 5;0 0 5
0 20 0;10 20 0;10 20 5;0 20 5];
f3=[1 2 3 4 1;5 6 7 8 5];
figure(4);
hp1=patch('Faces',f1,'Vertices',v1)
hp1.FaceColor=[0 .5 0];
hp1.FaceAlpha=.5;
hp1.EdgeColor='none';
hp2=patch('Faces',f2,'Vertices',v2)
hp2.FaceColor=[.5 0 0];
hp2.FaceAlpha=.5;
hp2.EdgeColor='none';
hp3=patch('Faces',f3,'Vertices',v3)
hp3.FaceColor=[0 0 .5];
hp3.FaceAlpha=.5;
hp3.EdgeColor='none';
grid on
xlabel('x');ylabel('y');zlabel('z');
campos([477 -1122 120])
4.- 拓展一个2D矩形
extrude
命令需要一个几何文件作为输入。
在MATLAB中,几何文件具有以下等效扩展名:.stl
、.step
和.ste
。.stl
文件可以使用SolidWorks等CAD应用程序生成。
在这里,由于案例很简单,不需要SolidWorks,可以直接生成所需的.stl
文件。
接下来,我生成一个三角剖分网格并将其保存为.stl
文件,然后使用importGeometry
命令构建一个可以作为extrude
命令的输入的2D矩形。
P=[0 0;10 0;10 20;0 20]; % points
T=[1 2 4;2 3 4]; % triangles definition
TR=triangulation(T,P)
figure(5)
triplot(TR)
axis equal
grid on
xlabel('x');ylabel('y');
stlwrite(TR,'base1.stl','text')
这是base1.stl
的内容:
solid MATLAB_1
facet normal 0 0 1
outer loop
vertex 0 0 0
vertex 10 0 0
vertex 0 20 0
endloop
endfacet
facet normal 0 -0 1
outer loop
vertex 10 0 0
vertex 10 20 0
vertex 0 20 0
endloop
endfacet
endsolid MATLAB_1
现在进行挤压:
model = createpde;
b1 = importGeometry(model,'base1.stl');
figure(6)
pdegplot(b1,'FaceLabels','on')
extrude(b1,5)
pdegplot(b1,'FaceLabels','on','FaceAlpha',0.5)
grid on
xlabel('x');ylabel('y');zlabel('z');
英文:
In MATLAB there are different was to generate a '3D rectangle' also known as parallelepiped, Wolfram definition.
1.- Defining all solid points
xrange=[0:1:10];
yrange=[0:1:20];
zrange=[0:1:5];
[x,y,z]=meshgrid(xrange,yrange,zrange);
x=x(:);y=y(:);z=z(:);
P=[x y z];
figure(1);
plot3(P(:,1),P(:,2),P(:,3),'.');
axis equal
grid on
shp1=alphaShape(P(:,1),P(:,2),P(:,3))
figure(2);
plot(shp1)
axis equal
once an alphaShape
is built the following volume
and surfaceArea
commands can be used :
round(volume(shp1))
same as
(xrange(end)-xrange(1))*(yrange(end)-yrange(1))*(zrange(end)-zrange(1))
surfaceArea(shp1)
same as
2*xrange(end)*yrange(end)+2*xrange(end)*zrange(end)+2*yrange(end)*zrange(end)
2.- Just using vertices
xrange2=[0 10];
yrange2=[0 20];
zrange2=[0 5];
[x2,y2,z2]=meshgrid(xrange2,yrange2,zrange2);
x2=[x2(:);5];
y2=[y2(:);10];
z2=[z2(:);2.5];
P2=[x2 y2 z2];
Tes=delaunayn(P2);
figure(3)
tetramesh(Tes,P2);
camorbit(40,0);
3.- With command patch
v1=[0 0 0;10 0 0;10 20 0;0 20 0
0 0 5;10 0 5;10 20 5;0 20 5];
f1=[1 2 3 4 1;5 6 7 8 5];
v2=[0 0 0;0 20 0;0 20 5;0 0 5
10 0 0;10 20 0;10 20 5;10 0 5];
f2=[1 2 3 4 1;5 6 7 8 5];
v3=[0 0 0;10 0 0;10 0 5;0 0 5
0 20 0;10 20 0;10 20 5;0 20 5];
f3=[1 2 3 4 1;5 6 7 8 5];
figure(4);
hp1=patch('Faces',f1,'Vertices',v1)
hp1.FaceColor=[0 .5 0];
hp1.FaceAlpha=.5;
hp1.EdgeColor='none';
hp2=patch('Faces',f2,'Vertices',v2)
hp2.FaceColor=[.5 0 0];
hp2.FaceAlpha=.5;
hp2.EdgeColor='none';
hp3=patch('Faces',f3,'Vertices',v3)
hp3.FaceColor=[0 0 .5];
hp3.FaceAlpha=.5;
hp3.EdgeColor='none';
grid on
xlabel('x');ylabel('y');zlabel('z');
campos([477 -1122 120])
4.- Extruding a 2D rectangle
Command extrude
requires as import a geometry file.
In MATLAB geometry files have these equivalent extensions : .stl
.step
and .ste
.stl
and can be generated with CAD applications like SolidWorks.
Here, given how simple is the case, there's no need for SolidWorks, one can directly generate the required .stl
file directly.
Following, I generate a triangulation mesh and save it to .stl
to then use command importGeometry
to build a 2D rectangle that has the right type to be used as input to command extrude
.
P=[0 0;10 0;10 20;0 20]; % points
T=[1 2 4;2 3 4]; % triangles definition
TR=triangulation(T,P)
figure(5)
triplot(TR)
axis equal
grid on
xlabel('x');ylabel('y');
stlwrite(TR,'base1.stl','text')
this is the contents of base1.stl
:
solid MATLAB_1
facet normal 0 0 1
outer loop
vertex 0 0 0
vertex 10 0 0
vertex 0 20 0
endloop
endfacet
facet normal 0 -0 1
outer loop
vertex 10 0 0
vertex 10 20 0
vertex 0 20 0
endloop
endfacet
endsolid MATLAB_1
now for the extrusion :
model = createpde;
b1 = importGeometry(model,'base1.stl');
figure(6)
pdegplot(b1,'FaceLabels','on')
extrude(b1,5)
pdegplot(b1,'FaceLabels','on','FaceAlpha',0.5)
grid on
xlabel('x');ylabel('y');zlabel('z');
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论