Удалите значения Specifi c в ломтиках MatLab, сделав их прозрачными - PullRequest
0 голосов
/ 06 апреля 2020

У меня есть вопрос, аналогичный тому, который был задан здесь " Удаление небольших значений в срезе ". Я хотел бы сделать определенные c цвета цилиндрических срезов прозрачными, и я думаю, что я могу использовать alphamap в MatLab.

Вот моя фигура, показывающая цилиндрические срезы. Я знаю индексы каждого из переходов в моей цветовой панели.

  • При -4: nN2 для синего к голубому
  • В -3: nN1 для голубого к белому
  • В 0: n0 для белого
  • В 3: nP1 для белого до желтого
  • В 4: nP1 для желтого до красного

Пока что я создал альфа-карту, подобную этой

Lia = ismember(cmap,[1 1 1],'rows');    % cmap is the color map
alpha_map = double((~Lia)');

Но когда я пытаюсь применить эту альфа-карту к одному срезу, ничего не происходит.

for r=1:length(RoLoc)
   Vsli{q,i,r}.AlphaData = alpha_map;  % Vsli{q,i,r} is individual surface
end

Я также получаю ошибка, когда я пытаюсь изменить FaceAlpha одной поверхности на «interp» или «flat», говоря, что размер матрицы недостаточно велик. Не уверен, к чему это относится.

Если бы вы могли предложить какую-либо помощь, я был бы признателен, а если вам нужна информация, пожалуйста, прокомментируйте и дайте мне знать.

Я использую версию R2018b из MatLab.

Slices

Обновление: вот небольшая часть скрипта для создания поверхностей Я не могу загрузить мои фактические данные, потому что они слишком большие, поэтому в этом примере я использую встроенные данные потока из MatLab.

Ny = 1000;
[X,Y,Z,V] = flow(10);

y = [-0.7344,0.7031];
AoAd = 45;
delta = 1/2*cosd(AoAd);
dt = 0.0258;  % Size of time step
dtheta = 7.5;  % Differential angle size [deg]
theta = 180 + dtheta;
iso = -3;

AR = 5;
RoLoc = 0.5*AR;
% don't bother to draw the rectangular patch in the image

F = figure;
xlabel('x'), ylabel('y'), zlabel('z')
hold on

fh = gcf();
axh = findall(fh, 'Type', 'Axes');

sweep = floor(2.1*Ny*RoLoc);
[Xc,Yc,Zc] = cylinder2(RoLoc*ones(1,Ny),[0,1,0],sweep);      % you can find this here https://www.mathworks.com/matlabcentral/fileexchange/64007-generate-cylinder-with-custom-axis

 H = [1 0 0 0;
   0 1 0 min(y);   % vertical translation
   0 0 1 0;
   0 0 0 1]*...
   [1 0 0 0;
   0 peak2peak(y) 0 0;   % vertical stretching
   0 0 1 0;
   0 0 0 1]*...
   [ones(1,Ny);Yc(:,1)';ones(1,Ny);ones(1,Ny)];

 Yc = repmat(H(2,1:Ny)',1,sweep+1);
 clear H

 % angle for part of the cylinder
 Phi_prime = atand(delta/RoLoc);
 theta_prime = linspace(360,0,sweep+1)';

 T = 6;
 theta_q = theta - T*Phi_prime;
 theta_p = theta + 2*Phi_prime;

 [~,l] = min(abs(theta_prime - theta_p));
 [~,m] = min(abs(theta_prime - theta_q));

 Vsli = slice(axh,X,Y,Z,V,Xc(:,l:m),Yc(:,l:m),Zc(:,l:m),'linear');
 Vsli.EdgeColor = 'none';

 % Setup color axis range
 V_min = sign(min(caxis))*ceil(abs(min(caxis)));               % min value in flow
 V_max = ceil(max(caxis));               % max value in flow

 % this portion changes the colors of the cylinder sections
 n = 1000;

 figure(F)
 colorbar

 fh = gcf();
 axh = findall(fh, 'Type','Axes');
 cbh = findall(fh, 'Type', 'ColorBar');

 M1prime = 1/3*V_min;
 M2prime = 1/2*V_max;

 caxis([M1prime,M2prime])

 % I have adapted the code for making your own interpolated colormap here https://stackoverflow.com/questions/30851050/how-to-create-an-interpolated-colormap-or-color-palette-from-two-colors
 % Set white to be zero with blue as negative and red as positive
 n0 = floor(interp1([M1prime,M2prime],[1,n],0));    % interpolate color index to zero

 nN2 = floor(interp1([M1prime,M2prime],[1,n],iso-1));       % blue to cyan
 nN1 = floor(interp1([M1prime,M2prime],[1,n],iso));       % cyan to white
 nP1 = floor(interp1([M1prime,M2prime],[1,n],-iso));      % white to yellow
 nP2 = floor(interp1([M1prime,M2prime],[1,n],-(iso-1)));      % yellow to red

 cmap = zeros(5,3);
 cmap(1,:) = [0 0 1];   %// color first row - blue
 cmap(2,:) = [0 1 1];    % cyan
 cmap(3,:) = [1 1 1];   %// color 1/2*nth row - white
 cmap(4,:) = [1 1 0];    % yellow
 cmap(5,:) = [1 0 0];   %// color nth row - red

 [xcs,ycs] = meshgrid(1:3,1:n);  %// mesh of indices

 cmapN = interp2(xcs([1,nN2,nN1],:),ycs([1,nN2,nN1],:),[cmap(1:2,:);cmap(2,:)],xcs,ycs);         %// interpolate blue to cyan
 cmapN(nN1+1:end,:) = [];

 cmapZ1 = interp2(xcs([nN1+1,nN1+1+floor((n0-(nN1+1))/2),n0],:),ycs([nN1+1,nN1+1+floor((n0-(nN1+1))/2),n0],:),[cmap(2:3,:);cmap(3,:)],xcs,ycs);      %// interpolate cyan to white    
 cmapZ1(1:nN1,:) = [];   Lz1 = length(cmapZ1);
 cmapZ1(Lz1-(n-n0)+1:Lz1,:) = [];

 cmapZ2 = interp2(xcs([n0+1,n0+1+floor((nP1-(n0+1))/2),nP1],:),ycs([n0+1,n0+1+floor((nP1-(n0+1))/2),nP1],:),[cmap(3,:);cmap(3:4,:)],xcs,ycs);          %// interpolate white to yellow
 cmapZ2(1:n0,:) = [];    Lz2 = length(cmapZ2);
 cmapZ2(Lz2-(n-nP1)+1:Lz2,:) = [];

 cmapP = interp2(xcs([nP1+1,nP2,n],:),ycs([nP1+1,nP2,n],:),[cmap(4,:);cmap(4:5,:)],xcs,ycs);         %// interpolate yellow to red
 cmapP(1:nP1,:) = [];

 cmapNtot = [cmapN;cmapZ1];
 cmapPtot = [cmapZ2;cmapP];

 cmap = [cmapNtot;cmapPtot];
 colormap(cmap) %// set color map

  Lia = ismember(cmap,[1 1 1],'rows');
  alpha_map = double((~Lia)');   

  Vsli.AlphaData = alpha_map;
...