MATLAB:如何在三维空间中绘制一个矩形

huangapple go评论84阅读模式
英文:

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,可以使用以下volumesurfaceArea命令:

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

MATLAB:如何在三维空间中绘制一个矩形

shp1=alphaShape(P(:,1),P(:,2),P(:,3))

figure(2);
plot(shp1)
axis equal

MATLAB:如何在三维空间中绘制一个矩形

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

MATLAB:如何在三维空间中绘制一个矩形

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

MATLAB:如何在三维空间中绘制一个矩形

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

MATLAB:如何在三维空间中绘制一个矩形

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

MATLAB:如何在三维空间中绘制一个矩形

huangapple
  • 本文由 发表于 2023年6月16日 00:15:04
  • 转载请务必保留本文链接:https://go.coder-hub.com/76483622.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定