从一组点着色三角剖分
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 列,以便您可以指定 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 列生成的一组随机数据对其进行了着色。以下是使用完全自定义的颜色图的结果:
这是使用修改后的 jet
颜色图的效果:
希望对您有所帮助,编码愉快!
我有一个 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 列,以便您可以指定 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 列生成的一组随机数据对其进行了着色。以下是使用完全自定义的颜色图的结果:
这是使用修改后的 jet
颜色图的效果:
希望对您有所帮助,编码愉快!