У меня есть вопрос, аналогичный тому, который был задан здесь " Удаление небольших значений в срезе ". Я хотел бы сделать определенные 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](https://i.stack.imgur.com/LBfYm.png)
Обновление: вот небольшая часть скрипта для создания поверхностей Я не могу загрузить мои фактические данные, потому что они слишком большие, поэтому в этом примере я использую встроенные данные потока из 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;