从一组点着色三角剖分

Coloring Triangulation from Set of Points

我有一个 n 行 4 列的矩阵。前 3 列表示点的 x、y、z 位置。最后一列表示该点的颜色值 'p'。

有没有办法用'p'定义的每个三角形的表面颜色来绘制这些点的三角剖分?或者可能是由创建该特定三角形表面的 'p' 值的平均值定义的颜色?

我尝试了文档中的一些选项,但无济于事。

我的尝试:

interiorPoints = [matrix(:,1),matrix(:,2),matrix(:,3)];
DT = DelaunayTri(interiorPoints); 
hullFacets = convexHull(DT);
c=matrix(:,4);
trisurf(hullFacets,DT.X(:,1),DT.X(:,2),DT.X(:,3),c)

但是我得到一个错误:

Warning: Error creating or updating Patch

Error in value of property FaceVertexCData

Number of colors must equal number of vertices or faces

为什么 trisurf(x,y,z,c) 方法不起作用

您不能使用 trisurf(x,y,z,c) 方法,因为 c 必须与 Triangulation 矩阵的长度相同,但事实并非如此。这是因为您不会从矩阵中生成 与矩阵中的点相同数量 的三角形面。

值得一提的是不推荐(the documentation) that you use MATLAB DelaunayTri() function. Instead, you should use MATLAB's delaunayTriangulation() function.

三角形表面着色的工作方法

下面,我详细介绍/评论了一段代码,该代码块将根据存储在 matrix 变量第 4 列中的颜色值为从 interiorPoints 变量绘制的三角形表面着色。

在此代码中,我将颜色值映射到不同深浅的蓝色,并将颜色值映射到 MATLAB 的 jet 颜色图。如果您愿意,可以在 matrix 变量中创建第 5 列和第 6 列,以便您可以指定 RGB 颜色分量以获得更鲜艳的颜色映射:

interiorPoints = [matrix(:,1),matrix(:,2),matrix(:,3)];
c=matrix(:,4);

% MATLAB recommends that you use delaunayTriangle...
% DT = DelaunayTri(interiorPoints); 

DT = delaunayTriangulation(x,y,z)
hullFacets = convexHull(DT)

% Create an empty RGB colormap
custom_cm = zeros(length(c),3);
% Or, instead of creating an empty color map, you could modify one of MATLAB's available color maps
modify_cm = colormap(jet) % Replace 'jet' with any other of MATLAB's available color maps 

% "B" is the 3rd component of this RGB color map
custom_cm(:,3) = ((c-min(c))/(max(c)-min(c))*length(c)) / length(c)

% Expand the scaled custom_cm column for multiplication with the original color matrix
cm_multiplier = repmat(custom_cm(:,3), 1, 3);
% Multiply element-wise the expanded custom_cm with the original color matrix
modify_cm = cm_multiplier.*modify_cm;

trisurf(hullFacets, DT.Points(:,1), DT.Points(:,2), DT.Points(:,3))

% Use the entirely custom color mapping
colormap(custom_cm)

% Or, use the modified color mapping
colormap(modify_cm)

我没有将数据存储在您的 matrix 变量中,因此我对一些示例数据进行了三角测量,并根据我作为第 4 列生成的一组随机数据对其进行了着色。以下是使用完全自定义的颜色图的结果:

这是使用修改后的 jet 颜色图的效果:

希望对您有所帮助,编码愉快!