如何使用带有颜色选项的 matlab 三网格?



我想绘制一个三角形网格,并用不同的颜色给每条边上色。trimesh的matlab文档指出有一个颜色参数,但它没有说明它的结构应该是什么——由于三角形共享边,我如何知道在向量C内定位哪种颜色?

我昨天遇到了这个问题,我想我已经找到了解决方案。事实证明,一般来说,如果你想非常详细地说明哪边是哪种颜色,你必须非常狡猾。

为了了解问题所在,我将首先回顾命令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。

问题是,如果不使用特殊的技巧,这种着色方案可能会使边缘无法完全按照您的意愿着色。举个例子:如果你的边比顶点多(就像我的例子中那样),并且你希望每条边的颜色都不同,那你就不走运了,因为边是根据分配给顶点的颜色来着色的。但是,如果我们对每个顶点进行多个复制(因此,对每个边进行多个复制),那么我们就可以重新开始工作了。此外,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矩阵的末尾,这样它们的颜色就会覆盖以前任何不需要的颜色。如果你不在乎填充面,你甚至可以有一个除了边什么都没有的三矩阵。这有点像黑客,但它有效。

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

type trimesh

这样做可以让您看到TRIMESH实际上是通过使用一组面\顶点数据调用PATCH函数来创建网格图的。因此,您可以使用着色补丁的文档来确定如何定义TRIMESH的颜色数据参数,以便获得所需的边缘着色。

请注意,传递给TRIMESH的颜色数据参数最终定义了创建的结果补丁对象的'FaceVertexCData'属性。

如果您不提供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中定义自己的颜色图。根据文件,

颜色映射是0.0到1.0之间的实数的m乘3矩阵。每一行都是定义一种颜色的RGB矢量。颜色图的第k行定义第k种颜色,其中map(k,:) = [r(k) g(k) b(k)])指定红色、绿色和蓝色的强度。

我希望这能有所帮助。

相关内容

  • 没有找到相关文章

最新更新