MATLAB绘制平行六面体

如果给出一个平行六面体(甚至其他多面体)的各个顶点坐标,如何画出这个平行六面体。

在网上找了找方法,可以参考这篇博客 matlab中patch函数详解。然后我具体查看了 Multifaceted Patches 帮助,记录下来以备后查。

绘制主要就是利用 patch 函数,patch 的一般调用格式为patch(X,Y,C)(二维)和patch(X,Y,Z,C)(三维)。这里主要看三维情况下。X,Y,Z分别是各个点的 X 坐标,Y 坐标和 Z 坐标,C 是颜色参数。假设我们有一个立方体如下图所示,

那么对应于这个立方体的XYZ参数就是下图所示,

可以看出,XYZ都是一个4*6的矩阵,3个矩阵第 n 列合起来表示一个平面的4个顶点的坐标,6个平面所以有6列,每个平面4个顶点所以有4行。但是这样表示就会出现一个问题——一些点重复出现,这是由于相邻两个平面之间有2个顶点是共用的。可以看到上图中实际上给出了24个顶点的坐标,但是真正“独立”的只有8个,也就是立方体实际的顶点数,很明显这样做不是一个明智的做法。于是,另一种方法出来了。

这种表示方法可以只提供8个顶点的坐标(Vertices 属性)而不是24个,给这些顶点编号1~8,然后指定每个平面上的4个顶点(Faces 属性,要按连接顺序),再指定颜色就可以了。顶点编号可以自己任意(最好有顺序,方便记忆理解),如下图,

然后平面和顶点的对应关系如下图所示,

Vertices每一行是一个顶点的坐标,共8行8个顶点;Faces每一行是一个平面的4个顶点,共6行6个平面。

下面举个例子。

假设我要通过其他方法已经得到平行六面体的8个顶点的分别是 (0,0,0),(1,0,0),(1,1,0),(0,1,0),(0,0.5,0),(1,0.5,1),(1,1.5,1),(0,1.5,1),代码如下,

clear
vertices_matrix = [ 0 0 0;1 0 0;1 1 0;0 1 0;0 0.5 1;1 0.5 1;1 1.5 1;0 1.5 1];
faces_matrix = [1 2 6 5;  2 3 7 6;3 4 8 7;4 1 5 8;1 2 3 4;5 6 7 8];
h = patch('Vertices',vertices_matrix,'Faces',faces_matrix,...
    'FaceVertexCData',hsv(8), ...
    'FaceColor','interp');
view(3)
xlabel('x', 'FontName', 'courier new', 'FontWeight', 'bold');
ylabel('y', 'FontName', 'courier new', 'FontWeight', 'bold');
zlabel('z', 'FontName', 'courier new', 'FontWeight', 'bold');
grid on;
box on; 

结果如下图所示,

在MATLAB中运行出来后可以通过旋转来从不同角度观察。

另外,假如flat_matrix我写成这样,

faces_matrix = [1 2 5 6;  2 3 7 6;3 4 8 7;4 1 5 8;1 2 3 4;5 6 7 8];

也就是说我把第一个面的顶点顺序稍微变一下,5和6交换,那么结果如下图,

明显第一个面不对,有部分“镂空”了,这是因为改变点的连接顺序,所以一定要注意顶点顺序。

每个面的颜色可以不一样,例如第一个面黄色,第二个面蓝色……,可以通过 hsv 函数或者指定 FaceVertexCData 属性值并设置 FaceColor 属性值为flat实现,具体可以参考本文开始给出的 Multifaceted Patches 链接和 Specifying Patch Coloring

OK,昨晚睡不着跟室友聊到2点,现在好困,不过还是不想睡。扯远了~这篇就这样了~

Good Luck,Alan!

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏数值分析与有限元编程

可视化 | Tecplot作三角形单元后处理工具

对于有限元分析的后处理,除了单的信息,还包括单元信息,比如一个单元由哪些结点组成。Tecplot可以处理的单元类型有三角形单元,四边形单元,四面体单元和六面体单...

2884
来自专栏数据结构与算法

线性同余同余方程组解法(excrt)

【问题描述】 求关于 x 的同余方程组 x%a 1 =b 1  a1=b1 x%a 2 =b 2  a2=b2 x%a 3 =b 3  a3=b3 x%a...

4779
来自专栏算法与数据结构

Problem F: 分数类的类型转换

Description 封装一个分数类Fract,用来处理分数功能和运算,支持以下操作: 1. 构造:传入两个参数n和m,表示n/m;分数在构造时立即转化成最简...

1817
来自专栏数据结构与算法

P2513 [HAOI2009]逆序对数列

题目描述 对于一个数列{ai},如果有i<j且ai>aj,那么我们称ai与aj为一对逆序对数。若对于任意一个由1~n自然数组成的数列,可以很容易求出有多少个逆序...

2688
来自专栏数据结构与算法

15:细菌的繁殖与扩散

15:细菌的繁殖与扩散 总时间限制: 1000ms 内存限制: 65536kB描述 在边长为9的正方形培养皿中,正中心位置有m个细菌。假设细菌的寿命仅一天,但...

3407
来自专栏進无尽的文章

基础篇- iOS开发中常用的数学函数

752
来自专栏数说戏聊

06.简单计算&数据标准化&数据分组1.简单计算2.数据标准化3.数据分组

通常在综合评价分析、聚类分析、因子分析、主成分分析等分析开展之前,消除各个变量由于量纲不同、自身变异或者数值相差较大所引起的误差。

911
来自专栏Python小屋

详解Python使用模拟退火算法求解列表“最大值”

之前发过一个使用爬山算法的文章,请参考:Python使用爬山算法寻找序列“最大值” 模拟退火算法可以看作是爬山算法的一种改进,如果前方有更优解就前进,如果没有...

3596
来自专栏恰同学骚年

数据结构基础温故-5.图(中):最小生成树算法

图的“多对多”特性使得图在结构设计和算法实现上较为困难,这时就需要根据具体应用将图转换为不同的树来简化问题的求解。

572
来自专栏IT可乐

Java数据结构和算法(一)——简介

  本系列博客我们将学习数据结构和算法,为什么要学习数据结构和算法,这里我举个简单的例子。   编程好比是一辆汽车,而数据结构和算法是汽车内部的变速箱。一个开车...

2099

扫码关注云+社区