2017-09-08 4 views
2

Je suis en train de tracer une carte de phase et d'utiliser une carte de couleurs circulaire comme hsv. Le problème que j'ai est aux interfaces angle pi/-pi, l'interpolation (commande d'ombrage interp dans MATLAB) me donne 0, ce qui conduit à des lignes étranges dans le résultat (voir ci-dessous, la figure ci-dessous est la fonction tangente arctan). Y a-t-il un moyen de me débarrasser de ces artefacts? J'aime la douceur de l'ombrage interpolé par opposition à l'ombrage plat, mais l'ombrage plat évite ces artefacts.Ombrage interpolant dans la palette de couleurs circulaire

enter image description here

Voici le code qui génère l'image ci-dessus:

[x_grid,y_grid] = meshgrid(-31:32,-31:32); 
phase = atan2(y_grid,x_grid); 
surf(x_grid,y_grid,phase); 
view(0,90); 
shading interp 
colorbar 
axis([-31 32 -31 32]) 
colormap hsv 
+0

C'est ce que vous voulez, non? https://stackoverflow.com/questions/2708476/rotation-interpolation –

+0

@AnderBiguri Comment pourrais-je implémenter cela pour colorer l'image ci-dessus? –

+1

Il serait utile si vous postez le code que vous utilisez pour générer cette image. – jodag

Répondre

1

Le problème est que l'utilisation d'un ensemble de N par N de points de grille va toujours avoir une discontinuité à la interface pi/-pi qu'il tentera d'interpoler. Vous pouvez à la place créer une bande de coordonnées 2-par-N qui entoure l'origine et qui est déconnectée à l'interface pi/-pi. Ce qui suit illustre comment la discontinuité recherche les 2 approches:

% N-by-N grid: 
[x_grid, y_grid] = meshgrid(-31:32, -31:32); 
phase = atan2(y_grid, x_grid); 
subplot(1, 2, 1); 
surf(x_grid, y_grid, phase); 
title('N-by-N grid'); 

% 2-by-N strip: 
X = [-31.*ones(1, 33) -30:31 32.*ones(1, 64) 31:-1:-30 -31.*ones(1, 32); ... 
    zeros(1, 253)]; 
Y = [0:32 32.*ones(1, 62) 32:-1:-31 -31.*ones(1, 62) -31:0; ... 
    zeros(1, 253)]; 
phase = atan2(Y([1 1], :), X([1 1], :)); 
phase(:, end) = -pi; 
subplot(1, 2, 2); 
surf(X, Y, phase); 
title('2-by-N strip'); 

enter image description here

Et voici comment la vue 2-D finale regarderait (avec une palette de couleurs haute résolution):

X = [-31.*ones(1, 33) -30:31 32.*ones(1, 64) 31:-1:-30 -31.*ones(1, 32); ... 
    zeros(1, 253)]; 
Y = [0:32 32.*ones(1, 62) 32:-1:-31 -31.*ones(1, 62) -31:0; ... 
    zeros(1, 253)]; 
phase = atan2(Y([1 1], :), X([1 1], :)); 
phase(:, end) = -pi; 
surf(X, Y, phase); 
view(0, 90); 
shading interp; 
colorbar; 
axis([-31 32 -31 32]); 
colormap(hsv(256)); 

enter image description here