matlab 球体区域着色基于方位角和高程输入,而不是索引

ergxz8rk  于 2022-11-24  发布在  Matlab
关注(0)|答案(1)|浏览(185)

我正在尝试创建一个球形直方图,但我的数据点是纬度和经度值,因此我需要能够根据球体的位置给给定的单元格区域着色,而不是随机地遍历索引。我在这里得到了一个类似的答案,解决了我的某些方位角和海拔被跳过的问题:Coloring sections of sphere, some regions end up with unassigned colors,然而,这对于一个方位角部分具有空白长条,并且排序也不像预期的那样排序。

下面是前面的解决方案代码供参考:

n = 20;
[x,y,z] = sphere(n);

r = 1;
surf(r.*x,r.*y,r.*z,'FaceColor', 'white', 'FaceAlpha',0); %// Base sphere
hold on;

for countAz = 1:1:n
    for countE = 1:1:n
        % Linear index for a 2x2 patch of the matrices
        idx = countAz + [0,1,n+(1:2)] + (countE-1)*n; 
        % Pull out the coordinates, reshape for surf
        x2 = x(idx); x2 = reshape(x2,2,2);
        y2 = y(idx); y2 = reshape(y2,2,2);
        z2 = z(idx); z2 = reshape(z2,2,2);
                        
        random_color = rand(1,3);
        surf(r*x2,r*y2,r*z2,'FaceColor',random_color, 'FaceAlpha',1);
    end
end

使用链接支柱中的解决方案代码并保持countAz不变,仅更改高程,结果如下:

反之亦然,保持CountE不变,仅允许方位角改变:

看起来只允许方位角改变而保持仰角不变反而具有相反的效果,并且通过对给定方位角指数的每个仰角水平着色,并且当保持方位角不变时,即使理论上方位角不应该改变,也存在螺旋效应。
是否有一种方法可以更系统地遍历仰角和方位角范围,而不会导致单元格留空?我想的是,能够循环遍历由两个方位角值限定的每个单元格的一个仰角范围,然后继续向下遍历下一个仰角级别。但是当前的索引系统似乎没有遵循预期的顺序,导致螺旋上升或者在高度应该恒定时改变高度,使得难以将输入的纬度和经度值分配给每个内部for循环的相应方位角和仰角值。

rqcrx0a6

rqcrx0a61#

这是因为你的另一个帖子的答案有线性指数idx错误。(**编辑:**不再是了,它已经被修复)
我可以尝试修复这个问题,但由于您自己似乎不了解它们的作用(这是可以理解的),我认为这是一个更详细但更清晰的代码是有益的情况。我希望通过这段代码,您了解这些索引试图做什么:

n = 20;
[x,y,z] = sphere(n);

r = 1;
surf(r.*x,r.*y,r.*z,'FaceColor', 'white', 'FaceAlpha',0); %// Base sphere
hold on;

for countAz = 1:1:n
    for countE = 1:1:n
        % Get a 2x2 patch of points. Each row of the points is an elevation. Points are the intersection of the black grid.
        x2=[x(countE,countAz),x(countE,countAz+1),x(countE+1,countAz),x(countE+1,countAz+1)];
        y2=[y(countE,countAz),y(countE,countAz+1),y(countE+1,countAz),y(countE+1,countAz+1)];
        z2=[z(countE,countAz),z(countE,countAz+1),z(countE+1,countAz),z(countE+1,countAz+1)];
        x2 = reshape(x2,2,2);
        y2 = reshape(y2,2,2);
        z2 = reshape(z2,2,2);
                        
        random_color = rand(1,3);
        surf(r*x2,r*y2,r*z2,'FaceColor',random_color, 'FaceAlpha',1);
    end
end

相关问题