Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/image/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Image 在圆顶上绘制图像_Image_Matlab_Geometry_Matlab Figure_Surface - Fatal编程技术网

Image 在圆顶上绘制图像

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

我正在努力在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: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:以不同的方式构建曲面 这实际上更容易,也更困难。我们将建设