MATLAB--实现根据点集进行多面体的绘制

本人目前的工作是系统能够根据给出的点集构造凸多面体,然后进行碰撞检测

1、本人查询网上的资料

https://www.ilovematlab.cn/thread-469922-1-1.html

这个链接给的是一个的例子,非常好的一个例子(我也是借鉴这个例子)

此外,我想说明,我的是一个长方体,我希望对其进行一定的边缘曲面化,所以,我想到的一个简单的方案就是通过将我他原来的长方体进行平移扩充,然后将所得到的点集进行求并,然后采用上面给出的方法得到我们最终想要的凸体的点集,以及f,然后通过patch 得到我们最终想要的图形

 

2、我的过程

step1 首先计算出顶点集

a.给出长方体的的参数

figure
couch.L_Couch=2000;
couch.W_Couch=600;
couch.H_Couch=200;

x_Couch=0;
y_Couch=0;
z_Couch=0;



Vertices1=[  x_Couch-couch.W_Couch/2 y_Couch-couch.L_Couch/2 z_Couch-couch.H_Couch/2;
    x_Couch+couch.W_Couch/2 y_Couch-couch.L_Couch/2 z_Couch-couch.H_Couch/2;
    x_Couch+couch.W_Couch/2 y_Couch+couch.L_Couch/2 z_Couch-couch.H_Couch/2;
    x_Couch-couch.W_Couch/2 y_Couch+couch.L_Couch/2 z_Couch-couch.H_Couch/2;
    
    x_Couch-couch.W_Couch/2 y_Couch-couch.L_Couch/2 z_Couch+couch.H_Couch/2;
    x_Couch+couch.W_Couch/2 y_Couch-couch.L_Couch/2 z_Couch+couch.H_Couch/2;
    x_Couch+couch.W_Couch/2 y_Couch+couch.L_Couch/2 z_Couch+couch.H_Couch/2;
    x_Couch-couch.W_Couch/2 y_Couch+couch.L_Couch/2 z_Couch+couch.H_Couch/2;
    ];

 

step2 将所得到的顶点集进行x 方向 y方向  z方向的前后的移动 然后得到6组新的长方体的顶点,然后将其求并集,具体的代码如下所示:(应注意Arc_r_distance这个参数的作用是前后左右平移的距离)

Arc_r_distance=100;
x_Couch=Arc_r_distance;
y_Couch=0;
z_Couch=0;

Vertices2=[  x_Couch-couch.W_Couch/2 y_Couch-couch.L_Couch/2 z_Couch-couch.H_Couch/2;
    x_Couch+couch.W_Couch/2 y_Couch-couch.L_Couch/2 z_Couch-couch.H_Couch/2;
    x_Couch+couch.W_Couch/2 y_Couch+couch.L_Couch/2 z_Couch-couch.H_Couch/2;
    x_Couch-couch.W_Couch/2 y_Couch+couch.L_Couch/2 z_Couch-couch.H_Couch/2;
    
    x_Couch-couch.W_Couch/2 y_Couch-couch.L_Couch/2 z_Couch+couch.H_Couch/2;
    x_Couch+couch.W_Couch/2 y_Couch-couch.L_Couch/2 z_Couch+couch.H_Couch/2;
    x_Couch+couch.W_Couch/2 y_Couch+couch.L_Couch/2 z_Couch+couch.H_Couch/2;
    x_Couch-couch.W_Couch/2 y_Couch+couch.L_Couch/2 z_Couch+couch.H_Couch/2;
    ];
x_Couch=-Arc_r_distance;
y_Couch=0;
z_Couch=0;
Vertices3=[  x_Couch-couch.W_Couch/2 y_Couch-couch.L_Couch/2 z_Couch-couch.H_Couch/2;
    x_Couch+couch.W_Couch/2 y_Couch-couch.L_Couch/2 z_Couch-couch.H_Couch/2;
    x_Couch+couch.W_Couch/2 y_Couch+couch.L_Couch/2 z_Couch-couch.H_Couch/2;
    x_Couch-couch.W_Couch/2 y_Couch+couch.L_Couch/2 z_Couch-couch.H_Couch/2;
    
    x_Couch-couch.W_Couch/2 y_Couch-couch.L_Couch/2 z_Couch+couch.H_Couch/2;
    x_Couch+couch.W_Couch/2 y_Couch-couch.L_Couch/2 z_Couch+couch.H_Couch/2;
    x_Couch+couch.W_Couch/2 y_Couch+couch.L_Couch/2 z_Couch+couch.H_Couch/2;
    x_Couch-couch.W_Couch/2 y_Couch+couch.L_Couch/2 z_Couch+couch.H_Couch/2;
    ];
x_Couch=0;
y_Couch=Arc_r_distance;
z_Couch=0;

Vertices4=[  x_Couch-couch.W_Couch/2 y_Couch-couch.L_Couch/2 z_Couch-couch.H_Couch/2;
    x_Couch+couch.W_Couch/2 y_Couch-couch.L_Couch/2 z_Couch-couch.H_Couch/2;
    x_Couch+couch.W_Couch/2 y_Couch+couch.L_Couch/2 z_Couch-couch.H_Couch/2;
    x_Couch-couch.W_Couch/2 y_Couch+couch.L_Couch/2 z_Couch-couch.H_Couch/2;
    
    x_Couch-couch.W_Couch/2 y_Couch-couch.L_Couch/2 z_Couch+couch.H_Couch/2;
    x_Couch+couch.W_Couch/2 y_Couch-couch.L_Couch/2 z_Couch+couch.H_Couch/2;
    x_Couch+couch.W_Couch/2 y_Couch+couch.L_Couch/2 z_Couch+couch.H_Couch/2;
    x_Couch-couch.W_Couch/2 y_Couch+couch.L_Couch/2 z_Couch+couch.H_Couch/2;
    ];
x_Couch=0;
y_Couch=-Arc_r_distance;
z_Couch=0;

Vertices5=[  x_Couch-couch.W_Couch/2 y_Couch-couch.L_Couch/2 z_Couch-couch.H_Couch/2;
    x_Couch+couch.W_Couch/2 y_Couch-couch.L_Couch/2 z_Couch-couch.H_Couch/2;
    x_Couch+couch.W_Couch/2 y_Couch+couch.L_Couch/2 z_Couch-couch.H_Couch/2;
    x_Couch-couch.W_Couch/2 y_Couch+couch.L_Couch/2 z_Couch-couch.H_Couch/2;
    
    x_Couch-couch.W_Couch/2 y_Couch-couch.L_Couch/2 z_Couch+couch.H_Couch/2;
    x_Couch+couch.W_Couch/2 y_Couch-couch.L_Couch/2 z_Couch+couch.H_Couch/2;
    x_Couch+couch.W_Couch/2 y_Couch+couch.L_Couch/2 z_Couch+couch.H_Couch/2;
    x_Couch-couch.W_Couch/2 y_Couch+couch.L_Couch/2 z_Couch+couch.H_Couch/2;
    ];
x_Couch=0;
y_Couch=0;
z_Couch=Arc_r_distance;

Vertices6=[  x_Couch-couch.W_Couch/2 y_Couch-couch.L_Couch/2 z_Couch-couch.H_Couch/2;
    x_Couch+couch.W_Couch/2 y_Couch-couch.L_Couch/2 z_Couch-couch.H_Couch/2;
    x_Couch+couch.W_Couch/2 y_Couch+couch.L_Couch/2 z_Couch-couch.H_Couch/2;
    x_Couch-couch.W_Couch/2 y_Couch+couch.L_Couch/2 z_Couch-couch.H_Couch/2;
    
    x_Couch-couch.W_Couch/2 y_Couch-couch.L_Couch/2 z_Couch+couch.H_Couch/2;
    x_Couch+couch.W_Couch/2 y_Couch-couch.L_Couch/2 z_Couch+couch.H_Couch/2;
    x_Couch+couch.W_Couch/2 y_Couch+couch.L_Couch/2 z_Couch+couch.H_Couch/2;
    x_Couch-couch.W_Couch/2 y_Couch+couch.L_Couch/2 z_Couch+couch.H_Couch/2;
    ];

x_Couch=0;
y_Couch=0;
z_Couch=-Arc_r_distance;

Vertices7=[  x_Couch-couch.W_Couch/2 y_Couch-couch.L_Couch/2 z_Couch-couch.H_Couch/2;
    x_Couch+couch.W_Couch/2 y_Couch-couch.L_Couch/2 z_Couch-couch.H_Couch/2;
    x_Couch+couch.W_Couch/2 y_Couch+couch.L_Couch/2 z_Couch-couch.H_Couch/2;
    x_Couch-couch.W_Couch/2 y_Couch+couch.L_Couch/2 z_Couch-couch.H_Couch/2;
    
    x_Couch-couch.W_Couch/2 y_Couch-couch.L_Couch/2 z_Couch+couch.H_Couch/2;
    x_Couch+couch.W_Couch/2 y_Couch-couch.L_Couch/2 z_Couch+couch.H_Couch/2;
    x_Couch+couch.W_Couch/2 y_Couch+couch.L_Couch/2 z_Couch+couch.H_Couch/2;
    x_Couch-couch.W_Couch/2 y_Couch+couch.L_Couch/2 z_Couch+couch.H_Couch/2;
    ];
NewVertices=[Vertices2;Vertices3;Vertices4;Vertices5;Vertices6;Vertices7]

 

step3 使用我的文章的开头给出的计算凸体的顶点和面的方法。

Vertices=NewVertices

x1=Vertices(:,1);
y1=Vertices(:,2);
z1=Vertices(:,3);
shp=alphaShape(x1,y1,z1,4000); % MATLAB R2014b 引入的函数
[F2,V2]=boundaryFacets(shp); % MATLAB R2014b 引入的函数

如上面的代码。最终得到的F2 V2 就是我们的目标的参数,然后通过patch得到图形

 

step4 通过Patch 函数进行显示


S2.Vertices = V2  %进行位置刷新操作
S2.Faces = F2;
S2.FaceVertexCData = jet(size(V2,1));%V2表示顶点的数量
S2.FaceColor = 'interp';
S2Obj = patch(S2);  %将s2构成一个结构体
hold off
axis equal
axis([-3000 3000 -3000 3000 -3000 3000])
%axis([-1200 1200 -1200 1200 -1200 1200])
rotate3d on;

 

 

step5 最终得到的图形如下图所示

  • 2
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

没有水杯和雨伞的工科男

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值