请注意,您最初尝试使用的函数
TRISURF将返回一个修补对象的句柄.如果你看看
'FaceColor' property for patch objects,你可以看到没有’texturemap’选项.该选项仅对
'FaceColor' property of surface objects有效.因此,您将需要找到一种将三角形表面绘制为表面对象而不是贴图对象的方法.这里有两种方法来解决这个问题:
如果你的数据是统一的网格…
如果您的表面数据的坐标表示均匀的网格,以便z是从x轴的xmin到xmax的长方形集合,y轴的ymin到ymax,则可以使用SURF而不是TRISURF :
Z = ... %# N-by-M matrix of data
x = linspace(xmin,xmax,size(Z,2)); %# x-coordinates for columns of Z
y = linspace(ymin,ymax,size(Z,1)); %# y-coordinates for rows of Z
[X,Y] = meshgrid(x,y); %# Create meshes for x and y
C = imread('image1.jpg'); %# Load RGB image
h = surf(X,Y,Z,flipdim(C,1),... %# Plot surface (flips rows of C, if needed)
'FaceColor','texturemap',...
'EdgeColor','none');
axis equal
为了说明上述代码的结果,我将数据初始化为Z =峰;使用内置的样本图像“peppers.png”,并将x和y值设置为跨越1到16.在以下纹理映射表面:
如果您的数据不均匀间隔…
如果您的数据不是有规律的间隔,您可以创建一组规则间隔的X和Y坐标(如上所述使用MESHGRID),然后使用其中一个函数GRIDDATA或TriScatteredInterp来插值来自不规则的Z值的常规网格一组z值.我在my answer to another SO question讨论如何使用这两个功能.这是一个精简版的代码,你发布使用TriScatteredInterp:
x = ... %# Scattered x data
y = ... %# Scattered y data
z = ... %# Scattered z data
xmin = min(x);
xmax = max(x);
ymin = min(y);
ymax = max(y);
F = TriScatteredInterp(x(:),y(:),z(:)); %# Create interpolant
N = 50; %# Number of y values in uniform grid
M = 50; %# Number of x values in uniform grid
xu = linspace(xmin,xmax,M); %# Uniform x-coordinates
yu = linspace(ymin,ymax,N); %# Uniform y-coordinates
[X,Y] = meshgrid(xu,yu); %# Create meshes for xu and yu
Z = F(X,Y); %# Evaluate interpolant (N-by-M matrix)
C = imread('image1.jpg'); %# Load RGB image
h = surf(X,Y,Z,flipdim(C,1),... %# Plot surface
'FaceColor','texturemap',...
'EdgeColor','none');
axis equal
在这种情况下,您必须首先为矩阵Z的大小选择N和M的值.为了说明上述代码的结果,我初始化了x,y和z的数据,如下所示,并使用内置示例图像“peppers.png”:
x = rand(1,100)-0.5; %# 100 random values in the range -0.5 to 0.5
y = rand(1,100)-0.5; %# 100 random values in the range -0.5 to 0.5
z = exp(-(x.^2+y.^2)./0.125); %# Values from a 2-D Gaussian distribution
这导致以下纹理映射表面:
请注意,表面附近有锯齿状边缘.这些地方,TriScatteredInterp的点数太少,不足以适应内插曲面.因此,这些点的Z值为NaN,导致表面点未绘制.