如何使用matlab的trimesh与颜色选项?

时间:2011-06-08 15:04:24

标签: matlab plot mesh

我想绘制一个三角形网格,并用不同的颜色为每个边缘着色。 trimesh的matlab文档说明有一个颜色参数,但它没有说明它的结构应该是什么 - 因为三角形共享边缘,我怎么知道在矢量C内部定位哪个颜色的位置?

3 个答案:

答案 0 :(得分:4)

我昨天正在努力解决这个问题,我想我有解决方案。事实证明,一般来说,如果你想要非常详细地说明哪种颜色是哪种颜色,你必须非常偷偷摸摸。

所以你明白问题是什么,我首先回顾命令trimesh(Tri,X,Y,Z,C)如何首先分配颜色。参数C是一个数字向量,其长度等于顶点(不是边)的数量。颜色边缘的方式如下。如果我们有4个顶点,我们分配

Tri = [1 2 3; 3 2 4]

C = [10 20 30 40]

然后在Tri中找到的第一条边是1到2,它使用点1的颜色着色,即10。找到的下一条边是2到3,使用第2点的颜色着色,这是20.下一个边缘是3到1,颜色为30.下一个边缘为3到2,颜色为30;请注意,此边缘已经着色20,但这种新颜色会覆盖旧颜色。然后边缘2到4的颜色为20,边缘4到3的颜色为40。

问题在于,如果不使用特殊技巧,这种着色方案几乎不可能完全按照您的要求对边缘进行着色。你的例子:如果边缘多于顶点(如我的例子中所示)并且你希望每条边都有不同的颜色,那么你就不幸了,因为根据分配给顶点的颜色边缘是的颜色< / em>的。但是如果我们为每个顶点制作多个副本(因此,每个边缘的多个副本),那么我们就会重新开始工作。此外,我们的生活变得更加容易,因为Tri不仅接受面孔,还接受个别边缘。

作为我的意思的一个例子,假设您希望边缘2到3在上面的示例中具有颜色50。为此,创建一个新点,即点5,它与点2相同(即,相同的(x,y,z)坐标)。重新定义Tri和C如下:

Tri = [1 2 3; 3 2 4; 3 5 3]

C = [10 20 30 40 50]

请注意,Tri中的最后三个数字不定义面,而是定义边(边3到5,它与2到3相同)。该边缘将被分配的任何颜色点5着色。通过这种方式,您可以单独覆盖每个边的颜色。只需确保将这些边缘放在Tri矩阵的末端,以便它们的颜色覆盖任何先前不需要的颜色。如果你不关心填充面,你甚至可以得到一个只有边缘的Tri矩阵。它有点像黑客,但它确实有效。

答案 1 :(得分:0)

您可以使用TRIMESH命令查看TYPE函数的基础代码,如下所示:

type trimesh

通过这样做,您可以通过使用一组face \ _ vertex数据调用TRIMESH函数来查看PATCH实际创建网格图。因此,您可以使用documentation for coloring patches来确定如何为TRIMESH定义颜色数据参数,以便获得所需的边缘颜色。

请注意,传递给TRIMESH的颜色数据参数最终定义了创建的生成的补丁对象的'FaceVertexCData' property

答案 2 :(得分:0)

如果你没有提供C矩阵,Matlab字面设置C=Z。因此,C是与高度矩阵(Z)大小相同的矩阵。你没有专门给它颜色;相反,你给它一个数字向量,Matlab根据它的当前colormap解释为颜色。

试试这个

[x,y]=meshgrid(1:15,1:15);
tri = delaunay(x,y);
z = peaks(15);
trimesh(tri,x,y,z)

然后玩彩色贴图

colormap HSV
colormap spring
colormap gray

等等。

我很确定你可以在Matlab中定义自己的色彩映射。根据文件,

  

色彩图是 m -by-3矩阵,实数介于0.0和1.0之间。每行是定义一种颜色的RGB矢量。 colormap的第k行定义第k个颜色,其中map(k,:) = [r(k) g(k) b(k)])指定红色,绿色和蓝色的强度。

我希望这会有所帮助。