【问题标题】:project a sphere to a plane using matlab使用matlab将球体投影到平面
【发布时间】:2013-03-28 07:52:26
【问题描述】:

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

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

我想将此 3D 球体投影(或求和)到笛卡尔 2D 平面之一(例如 X-Y 平面),以获得将作为该球体投影的 2D 矩阵。在输出上使用imshowimagesc 应该如下所示:

简单的求和显然不起作用,我怎样才能在 Matlab 中完成呢?

【问题讨论】:

    标签: matlab 3d geometry 2d projection


    【解决方案1】:

    我可能完全误解了你的问题,在这种情况下,我很抱歉;但我认为以下三种方法之一实际上可能是您所需要的。请注意,方法 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'
    

    【讨论】:

      【解决方案2】:

      您可以使用 Matlab 在 X-Y 平面上投影:

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

      但我认为你不应该为此使用 Matlab,因为问题是如此简单,你可以分析地做到这一点......

      【讨论】:

      • 我对绘制结果不感兴趣,但有一个 2D 矩阵,它是 3D 球体的投影。如果它这么简单,你为什么不给出答案呢?
      • 但是,作为球体投影的二维矩阵是什么意思?矩阵怎么可能是球体的投影?这没有任何意义......
      • 球体本质上是 3D 对象,投影是 2D 对象。在 Matlab 中,二维对象由矩阵表示。如果我在该矩阵上使用imagesc,我希望得到类似于我附加的图像的东西,其中将沿着“环”累积点(或更高的像素值),而在中间则更少。
      • 好吧,我明白你的意思了,所以你会想要一个球体表示,在球体较厚(3D 中)的地方强度更高,在球体更薄的地方强度更低......我不没有直接的方法来做到这一点......
      【解决方案3】:

      我会查看专为此目的设计的地图投影。

      搜索“map projections matlab”会产生Matlab mapping toolbox 上的文档。但是,如果您想或需要自己推出,USGS 网站上有一个很好的总结,还有一篇 wikipedia 文章。

      【讨论】:

      • 虽然地图工具箱看起来很有用,但它不会输出那个投影的二维矩阵,主要是为了显示。此外,我感兴趣的投影会将球体的所有点求和到 2D 平面中的一个像素中,而在地图工具箱中(例如,查看垂直透视方位角投影),由于缺少一半球体它只显示相关的半个地球。
      • 投影有很多种。有些可能只能显示球体的一半,但其他(如立体或墨卡托投影)将基本上显示所有球体。 (请注意,如果没有至少一个奇异点,就不可能将球体连续映射到平面......)
      猜你喜欢
      • 2011-04-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-10-10
      • 2019-11-10
      • 1970-01-01
      • 2011-12-20
      相关资源
      最近更新 更多