一天下午浪费了以下问题:
我在某个空间域中有一个深度值矩阵。我在域中定义了一行,并删除了该行下面的值。
代码使用findnearest
函数来查找最接近某个值的数组元素的索引。
contour
得到的深度矩阵如下:
用-pi/2-a
表示的如下所示:
我希望将深度矩阵旋转一个角度({{1}}?)或对其应用一些变换,这样深度轮廓将变得垂直于与第一行平行的线:
我只是各种旋转矩阵但没有好结果......
答案 0 :(得分:1)
我没有完整的答案,但我确实通过一些调整找到了解决这个问题的方法。
我做了什么:
当你有分界线时,这是重要的值。 对于旋转区域内的点,我发现值沿x方向移动并从原始深度矩阵复制。为了方便起见,我使x数据上的值与y具有相同的距离。
经过这些调整,我得到了这个: 请注意,我也为我所做的做了注释。
但是,在您的代码中,X / Y比率不同。如果我只是将我的部分代码复制到你的代码中,我得到垂直线,因为你的角度是〜0,尽管图像接近45度。 要进行适当的调整,您需要实际按值而不是索引进行此比较,就像我所做的那样。
这里是改编的代码(为了比较,查找%ADDED评论):
clear all
close all
dx = 1; %ADDED
dz = 1;
%angle between line and ground
angle=pi/3; %ADDED
a=atan(angle);
%%%define domain
xi = 0:dx:1000;%ADDED
zi = 0:dz:1000;%ADDED
m=length(zi);
n=length(xi);
%%%ADDED %prealocating
Zs=zeros(m,n);
Zs2=zeros(m,n);
depth2=zeros(m,n);
zz=zeros(1,n);
%create grid
[x,z] = meshgrid(xi,zi);
%z where line starts
zs = 700;
%set line
for i = 1:findnearest(xi,zi(zs)*1/a)
xind(i) = i;
zind(i) = findnearest(zi, fix(-xi(i)*a +zi(zs)));
end
depth = repmat(zi',1,n); %simply the coordinate zi repeated for all xi
%calculate distance from the line
for ii=1:n %for every x
zslope = -a*xi(ii)+zi(zs);%equation of the line
zz(ii)=zslope;
if zslope>=0 %if the line is still in the domain (z>0)
for jj=1:m %for every z
if zi(jj)>=zslope %above the line
Zs(jj,ii) = zi(jj)-zslope; %height above the line
elseif zi(jj)<zslope %below the line (ground)
%
Zs(jj,ii)=NaN;
%ADDED
Zs2(jj,ii)=abs(zi(jj)-zslope);%height above the line
depth2(jj,ii)= depth(jj+round(Zs2(jj,ii)*cos(angle)),ii);
end
end%for on z
elseif zslope<0 %the line is no longer in the domain
for jj=1:m %for every z
Zs(jj,ii) = zi(jj)-zslope; %height above the line
end
end
end%for on x
figure
imagesc(Zs)
colorbar
title('distance from the line')
%ADDED
figure
imagesc(depth2)
colorbar
title('depth2')
%zone above the line
maskINT=zeros(m,n);
inds = find(Zs>=0); %erase values under the line
maskINT(inds)=1;
%ADDED
figure
imagesc(depth2+depth.*maskINT)
colorbar
title('depth summed')
figure
imagesc(depth);colorbar
title('depth')
figure
imagesc(depth.*maskINT);colorbar
title('depth above the line')
figure
contour(depth.*maskINT);colorbar
set(gca,'YDir','Reverse')
title('depth')