Интерполяция затенения в круговой карте цветов

Я строю фазовую карту и использую круговую цветовую карту, например, hsv. Проблема, с которой я сталкиваюсь, связана с интерфейсами угла pi/-pi, интерполяция (команда shading interp в MATLAB) дает мне 0, что приводит к странным линиям в результирующем рисунке (см. Ниже, на рисунке ниже показана функция 4 касательных арктанов).). Есть ли способ, которым я могу избавиться от этих артефактов? Мне нравится гладкость интерполированного затенения в отличие от плоского затенения, но плоское затенение позволяет избежать этих артефактов.

Вот код, который генерирует изображение выше:

[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

1 ответ

Решение

Проблема заключается в том, что использование набора точек сетки N-на-N всегда будет иметь разрыв в интерфейсе pi/-pi, который он будет пытаться интерполировать. Вместо этого вы можете создать полосу координат 2 на N, которая обернута вокруг начала координат и отключена в интерфейсе pi/-pi. Ниже показано, как разрыв выглядит для двух подходов:

% 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');

А вот как будет выглядеть окончательный 2-D вид (с цветовой картой более высокого разрешения):

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));

Другие вопросы по тегам