2

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

4

3 回答 3

4

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

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

三=[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 如下:

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

C=[10 20 30 40 50]

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

于 2011-09-11T18:50:11.170 回答
0

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

type trimesh

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

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

于 2011-06-08T16:38:22.080 回答
0

如果您不提供C矩阵 Matlab 字面设置C=Z. 因此C,是一个与您的高度矩阵 ( Z) 大小相同的矩阵。你没有专门给它颜色;相反,你给它一个数字向量,Matlab 根据它的 current 将其解释为颜色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)])指定了红色、绿色和蓝色的强度。

我希望这有帮助。

于 2011-06-08T16:38:42.217 回答