Image 在圆顶上绘制图像
我正在努力在Matlab中绘制圆顶表面的圆形图像。这是我的。这是png图像: 这是圆顶: 现在,我需要在圆顶上投射这个图像。我已经编写了一个代码来将图像放置在曲面上:Image 在圆顶上绘制图像,image,matlab,geometry,matlab-figure,surface,Image,Matlab,Geometry,Matlab Figure,Surface,我正在努力在Matlab中绘制圆顶表面的圆形图像。这是我的。这是png图像: 这是圆顶: 现在,我需要在圆顶上投射这个图像。我已经编写了一个代码来将图像放置在曲面上: r = 10; r2 = 9; cdata = imread('circle_image.png'); props.EdgeColor = 'none'; figure(); n = 50; [X,Y,Z] = sphere(n) ; X1 = X * r; Y1 = Y * r; Z1 = Z * r; for i = 1
r = 10;
r2 = 9;
cdata = imread('circle_image.png');
props.EdgeColor = 'none';
figure();
n = 50;
[X,Y,Z] = sphere(n) ;
X1 = X * r;
Y1 = Y * r;
Z1 = Z * r;
for i = 1:n+1
for j = 1:n+1
if Z1(i,j) < r2
X1(i,j) = NaN;
Y1(i,j) = NaN;
Z1(i,j) = NaN;
end
end
end
my_dome = surf(X1,Y1,Z1,props) ;
alpha = 1;
set(kopula, 'FaceColor', 'texturemap', 'CData', cdata, 'FaceAlpha', alpha, 'EdgeColor', 'none');
axis equal
r=10;
r2=9;
cdata=imread('circle\u image.png');
props.EdgeColor='none';
图();
n=50;
[X,Y,Z]=球面(n);
X1=X*r;
Y1=Y*r;
Z1=Z*r;
对于i=1:n+1
对于j=1:n+1
如果Z1(i,j)
我得到的结果如下:
看起来图像的中心位置不对,甚至轴也不对。如何修复此问题?是的,图像居中位置错误 纹理贴图应用于整个曲面,而不仅仅是“活动”点(您没有使用的点)。基本上,您得到的是将图像扩散到整个球体上,然后当您裁剪球体顶部以获得圆顶时,图像也会被裁剪:
您需要做的是,实际上删除所有转换为
NaN
的点,因此它们根本不是曲面的一部分,并且纹理贴图仅应用于顶部圆顶曲面
因此,用以下代码替换嵌套for循环:
idx_Raws2crop = Z1(:,1) < r2 ;
X1(idx_Raws2crop,:) = [] ;
Y1(idx_Raws2crop,:) = [] ;
Z1(idx_Raws2crop,:) = [] ;
为了使圆圈
以正确的方向书写(否则会出现倒置)
编辑: 根据您的评论,要以您喜欢的方式在圆顶上渲染图片,我可以看到两个选项: 备选方案1:在现有基础上再接再厉 这将包括:
- 在正方形网格上扩展
域(这样当纹理映射到曲面上时,图片不会失真)[X,Y]
- 扩展图片本身(添加一些透明边距),这样边距将覆盖我们介绍的域扩展,图片的实际可见部分将很好地位于圆顶的中心
X1
、Y1
和Z1
:
% Create a square grid large enough to cover the dome and a bit more:
[X2,Y2] = meshgrid(linspace(-5,5,100),linspace(-5,5,100)) ;
% reinterpolate Z1 over this new grid
Z2 = griddata(X1,Y1,Z1,X2,Y2) ;
现在您的曲面如下所示:
正如我警告过你的那样,图像现在已正确应用,但圆顶的边缘看起来相当难看。为了便于使用圆顶的基本值替换NaN
,这将在圆顶域和平面域之间进行更好的转换:
现在将产生:
如您所见,下一个问题是(与第一个问题一样),图像被拉伸到整个曲面上。所以部分文字现在在平面上。为了简单地缓解这种情况,您可以修改图片(在每一侧添加一点透明边距),直到图像的可见部分与圆顶大小匹配
选项2:以不同的方式构建曲面 这实际上更容易,也更困难。首先,我们将用方形表面建造一个圆顶(无需修剪和
NaN
ing)
此代码不需要以前代码的任何部分,它是自包含的:
r = 10 ;
% Build a square grid
[X2,Y2] = meshgrid(linspace(-5,5,100),linspace(-5,5,100)) ;
% build Z2 according to the sphere equation.
Z2 = sqrt( r^2 - X2.^2 - Y2.^2) ;
figure();
my_dome = surf(X2,Y2,Z2,'EdgeColor', 'none', 'FaceColor', 'texturemap', 'CData', cdata, 'FaceAlpha', 1) ;
axis equal
这将生成一个居中的纹理贴图:
注意:纹理贴图效果很好,因为实际曲面仍然是正方形,只是稍微弯曲以符合球体。纹理贴图不会显示图片透明的曲面部分,因此它是不可见的,但是如果您在没有纹理贴图的情况下查看曲面,您将了解背景中发生了什么:
hs=surf(X2,Y2,Z2) ; shading interp ; axis equal
是的,图像居中位置不对 纹理贴图应用于整个曲面,而不仅仅是“活动”点(您没有使用的点)。基本上,您得到的是将图像扩散到整个球体上,然后当您裁剪球体顶部以获得圆顶时,图像也会被裁剪:
您需要做的是,实际上删除所有转换为
NaN
的点,因此它们根本不是曲面的一部分,并且纹理贴图仅应用于顶部圆顶曲面
因此,用以下代码替换嵌套for循环:
idx_Raws2crop = Z1(:,1) < r2 ;
X1(idx_Raws2crop,:) = [] ;
Y1(idx_Raws2crop,:) = [] ;
Z1(idx_Raws2crop,:) = [] ;
为了使圆圈
以正确的方向书写(否则会出现倒置)
编辑: 根据您的评论,要以您喜欢的方式在圆顶上渲染图片,我可以看到两个选项: 备选方案1:在现有基础上再接再厉 这将包括:
- 在正方形网格上扩展
域(这样当纹理映射到曲面上时,图片不会失真)[X,Y]
- 扩展图片本身(添加一些透明边距),这样边距将覆盖我们介绍的域扩展,图片的实际可见部分将很好地位于圆顶的中心
X1
、Y1
和Z1
:
% Create a square grid large enough to cover the dome and a bit more:
[X2,Y2] = meshgrid(linspace(-5,5,100),linspace(-5,5,100)) ;
% reinterpolate Z1 over this new grid
Z2 = griddata(X1,Y1,Z1,X2,Y2) ;
现在您的曲面如下所示:
正如我警告过你的那样,图像现在已正确应用,但圆顶的边缘看起来相当难看。为了便于使用圆顶的基本值替换NaN
,这将在圆顶域和平面域之间进行更好的转换:
现在将产生:
如您所见,下一个问题是(与第一个问题一样),图像被拉伸到整个曲面上。所以部分文字现在在平面上。为了简单地缓解这种情况,您可以修改图片(在每一侧添加一点透明边距),直到图像的可见部分与圆顶大小匹配
选项2:以不同的方式构建曲面 这实际上更容易,也更困难。我们将建设