我想绘制一个三角形网格,并用不同的颜色给每条边上色。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)])
指定红色、绿色和蓝色的强度。
我希望这能有所帮助。