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
    评论
好的,这个问题属于技术问题,我可以为你提供代码实现。以下是用C语言实现的基于KD-Tree的两个点集最小和最大距离的代码: ```c #include <stdio.h> #include <stdlib.h> #include <math.h> #define K_DIM 2 //定义维度为2 #define MAX_CHILDREN 2 //定义最大子节点数目为2 //定义二维坐标点结构体 typedef struct Point { double x[K_DIM]; //二维坐标点 } Point; //定义节点结构体 typedef struct Node { Point p; //节点对应的坐标点 struct Node* children[MAX_CHILDREN]; //子节点数组 } Node; //定义比较函数,用于排序 int compare(const void* p1, const void* p2, int dim) { Point* a = (Point*)p1; Point* b = (Point*)p2; return (a->x[dim] < b->x[dim]) ? -1 : 1; } //定义KD-Tree的构建函数 Node* build_kdtree(Point* points, int n, int depth) { if (n <= 0) return NULL; Node* root = (Node*)malloc(sizeof(Node)); int mid = n / 2; qsort(points, n, sizeof(Point), compare); root->p = points[mid]; root->children[0] = build_kdtree(points, mid, (depth + 1) % K_DIM); root->children[1] = build_kdtree(points + mid + 1, n - mid - 1, (depth + 1) % K_DIM); return root; } //定义计算两个点之间的距离函数 double distance(Point a, Point b) { double dis = 0; for (int i = 0; i < K_DIM; i++) { dis += (a.x[i] - b.x[i]) * (a.x[i] - b.x[i]); } return sqrt(dis); } //定义计算最小和最大距离函数 void min_max_distance(Node* root1, Node* root2, double* min_dis, double* max_dis) { if (!root1 || !root2) return; double dis = distance(root1->p, root2->p); if (dis < *min_dis) *min_dis = dis; if (dis > *max_dis) *max_dis = dis; int dim = 0; if (root1->p.x[dim] < root2->p.x[dim]) { min_max_distance(root1->children[0], root2, min_dis, max_dis); if (root2->p.x[dim] - root1->p.x[dim] < *min_dis) { min_max_distance(root1->children[1], root2, min_dis, max_dis); } } else { min_max_distance(root1->children[1], root2, min_dis, max_dis); if (root1->p.x[dim] - root2->p.x[dim] < *min_dis) { min_max_distance(root1->children[0], root2, min_dis, max_dis); } } } int main() { Point points1[] = {{2, 3}, {5, 4}, {9, 6}, {4, 7}, {8, 1}}; //第一个点集 Point points2[] = {{7, 2}, {6, 5}, {10, 3}, {1, 8}, {3, 5}}; //第二个点集 int n1 = sizeof(points1) / sizeof(Point); int n2 = sizeof(points2) / sizeof(Point); Node* root1 = build_kdtree(points1, n1, 0); //建立第一个点集的KD-Tree Node* root2 = build_kdtree(points2, n2, 0); //建立第二个点集的KD-Tree double min_dis = INFINITY; double max_dis = 0; min_max_distance(root1, root2, &min_dis, &max_dis); //计算最小和最大距离 printf("Minimum distance: %lf\n", min_dis); printf("Maximum distance: %lf\n", max_dis); return 0; } ``` 这段代码使用了KD-Tree来实现两个点集之间的最小和最大距离的计算,先根据点的x坐标排序,然后分别递归进行左右子树的构建,最后递归计算最小和最大距离即可。 希望这个代码能够帮到你!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

没有水杯和雨伞的工科男

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

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

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

打赏作者

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

抵扣说明:

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

余额充值