Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/matlab/15.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
使用matlab将球体投影到平面_Matlab_3d_Geometry_2d_Projection - Fatal编程技术网

使用matlab将球体投影到平面

使用matlab将球体投影到平面,matlab,3d,geometry,2d,projection,Matlab,3d,Geometry,2d,Projection,这可能是非常基本的matlab,所以请原谅我。 我使用命令sphere创建一个三维球体,并使用surf生成x,y,z矩阵。例如: [x,y,z]=sphere(64); 我想将这个3D球体投影(或求和)到一个笛卡尔2D平面(例如X-Y平面),以获得一个2D矩阵,该矩阵将是该球体的投影。在输出上使用imshow或imagesc应该如下所示: 简单的求和显然不起作用,我如何在Matlab中实现这一点 您可以使用以下方法在Matlab中的X-Y平面上投影: [x,y,z] = sphere(64)

这可能是非常基本的matlab,所以请原谅我。 我使用命令
sphere
创建一个三维球体,并使用surf生成
x,y,z
矩阵。例如:

[x,y,z]=sphere(64);
我想将这个3D球体投影(或求和)到一个笛卡尔2D平面(例如X-Y平面),以获得一个2D矩阵,该矩阵将是该球体的投影。在输出上使用
imshow
imagesc
应该如下所示:


简单的求和显然不起作用,我如何在Matlab中实现这一点

您可以使用以下方法在Matlab中的X-Y平面上投影:

[x,y,z] = sphere(64);
surf(x,y,zeros(size(z)));

但是我认为你不应该使用Matlab来解决这个问题,因为问题很简单,你可以用解析的方法来解决…

我会看看地图投影,它就是为此而设计的


搜索“map projections matlab”可获得有关地图的文档。然而,如果你想或需要自己写,网站上有一篇很好的摘要和一篇文章。

我可能完全误解了你的问题,在这种情况下,我道歉;但我认为以下三种方法中的一种实际上可能是你所需要的。请注意,方法3给出的图像与您提供的示例非常相似。。。但我是通过一个非常不同的路线到达那里的(根本不使用
sphere
命令,而是通过直接计算“内部体素”和“外部体素”与中心的距离)。我将第二张图像与第三张图像进行了对比,因为这样看起来更好——用零填充球体使其看起来几乎像一个黑色的圆盘

%% method 1: find the coordinates, and histogram them
[x y z]=sphere(200);
xv = linspace(-1,1,40);
[xh xc]=histc(x(:), xv);
[yh yc]=histc(y(:), xv);

% sum the occurrences of coordinates using sparse:
sm = sparse(xc, yc, ones(size(xc)));
sf = full(sm);

figure; 
subplot(1,3,1);
imagesc(sf); axis image; axis off
caxis([0 sf(19,19)]) % add some clipping
title 'projection of point density'

%% method 2: fill a sphere and add its volume elements:
xv = linspace(-1,1,100);
[xx yy zz]=meshgrid(xv,xv,xv);
rr = sqrt(xx.^2 + yy.^2 + zz.^2);
vol = zeros(numel(xv)*[1 1 1]);
vol(rr<1)=1;
proj = sum(vol,3);
subplot(1,3,2)
imagesc(proj); axis image; axis off; colormap gray
title 'projection of volume'

%% method 3: visualize just a thin shell:
vol2 = ones(numel(xv)*[1 1 1]);
vol2(rr<1) = 0;
vol2(rr<0.95)=1;
projShell = sum(vol2,3);
subplot(1,3,3);
imagesc(projShell); axis image; axis off; colormap gray
title 'projection of a shell'

%%方法1:找到坐标并对其进行直方图分析
[x y z]=球体(200);
xv=linspace(-1,1,40);
[xh xc]=histc(x(:),xv);
[yh yc]=历史(y(:),xv);
%使用“稀疏”对坐标的出现次数求和:
sm=稀疏(xc,yc,个数(大小(xc));
sf=满(sm);
图形
子批次(1,3,1);
图像SC(sf);轴图像;轴心分离
caxis([0 sf(19,19)])%添加一些剪辑
标题“点密度投影”
%%方法2:填充球体并添加其体积元素:
xv=linspace(-1,1100);
[xx-yy-zz]=meshgrid(xv,xv,xv);
rr=sqrt(xx.^2+yy.^2+zz.^2);
vol=零(numel(xv)*[1]);

卷(rrI对绘制结果不感兴趣,但我希望有一个2D矩阵,它是3D球体的投影。如果它这么简单,你为什么不给出一个答案?但2D矩阵是球体的投影,这是什么意思?矩阵怎么可能是球体的投影?这毫无意义……球体本质上是3D物体。)ct,投影是2D对象。在Matlab中,2D对象由矩阵表示。如果我在该矩阵上使用
imagesc
,我希望得到像我附加的图像一样的东西,在该图像中,沿着“环”会积累点(或更高的像素值)在中间,我明白你的意思,所以你需要一个球体表示,在那里你有更大的强度,球体更厚(3D)。在球体较薄的地方,强度较低…我看不到直接的方法…地图工具箱似乎非常有用,同样,它不会输出该投影的2D矩阵,主要用于显示。此外,我感兴趣的投影会将球体的所有点相加,这些点在2D平面上落为一个像素,而reas在地图工具箱中(例如,查看垂直透视方位投影),球体的一半缺失,因为它仅显示相关的半个球体。有许多不同类型的投影。一些可能只能显示球体的一半,但其他(如赤平投影或墨卡托投影)将基本上显示所有球体。(请注意,如果没有至少一个奇点,则不可能将球体连续映射到平面…)