我有一个包含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)
但是我收到了一个错误:
警告:创建或更新Patch
时出错属性FaceVertexCData
的值出错颜色数必须等于顶点或面的数量
答案 0 :(得分:1)
trisurf(x,y,z,c)
方法不起作用您无法使用trisurf(x,y,z,c)
方法,因为c
必须与您的Triangulation
矩阵的长度相同,但它不会。这是因为您不会从矩阵中生成相同数量的三角形面,因为矩阵中有点。
值得一提的是,我们不推荐使用MATLAB DelaunayTri()
函数(在the documentation中这样说)。相反,你应该使用MATLAB' delaunayTriangulation()
function。
下面,我详细/评论了一段代码,它会根据interiorPoints
变量第4列中存储的颜色值为从matrix
变量绘制的三角形曲面着色。
在这段代码中,我将颜色值映射到不同的蓝色阴影,并将颜色值映射到MATLAB的jet
颜色映射。如果您愿意,可以在matrix
变量中创建第5和第6列,以便指定R
,G
和B
颜色组件,以获得更鲜明的色彩映射:
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列生成的随机数据集对其进行着色。以下是使用完全自定义颜色贴图的结果:
我希望这有帮助,快乐编码!