Градиентная заливка функции внутри круглой области Matlab - PullRequest
0 голосов
/ 07 ноября 2018

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

enter image description here Я не уверен, как подойти к этому, так как в симуляции я работаю над направлением изменений градиента (не всегда в направлении х, как показано ниже, но могу свободно находиться под всеми определенными углами), поэтому я ищу решение, которое будет таким же гибким.

Код у меня ниже

    clear t
N=10;
for i=0:N 
    t(i+1) = 0+(2*i*pi) / N;
end
F = exp(-cos(t))./(2.*pi*besseli(1,1));
figure(1)
subplot(1,3,1)
plot(t*180/pi,F,'-ob')
xlim([0 360])
xlabel('angle')
subplot(1,3,2)
hold on
plot(cos([t 2*pi]), sin([t 2*pi]),'-k','linewidth',2);
plot(cos([t 2*pi]), sin([t 2*pi]),'ob');
plot(cos(t).*F,sin(t).*F,'b','linewidth',2);
subplot(1,3,3)    
hold on
plot(cos([t 2*pi]), sin([t 2*pi]),'-k','linewidth',2);
plot(cos([t 2*pi]), sin([t 2*pi]),'ob');

1 Ответ

0 голосов
/ 07 ноября 2018

Чтобы заполнить поверхность, вам нужно использовать команду patch .

t = linspace(0, 2*pi, 100);
x = cos(t);
y = sin(t);
c = x; % colored following x value and current colormap

figure
patch(x,y,c)
hold on
scatter(x,y)
hold off
colorbar

Результирующий график:

Result

Цвета определены в c для каждой точки и интерполируются внутри фигуры, поэтому я уверен, что у вас должна быть всякая свобода цвета, как вы хотите!

Например, повернутая версия:

t = linspace(0, 2*pi, 100);
x = cos(t);
y = sin(t);
c = cos(t+pi/4) 

figure
patch(x,y,c)
colorbar

enter image description here

Чтобы понять, как это происходит, просто подумайте, что у каждой точки есть цвет, и матрица интерполируется внутри. Итак, здесь я просто повернул интенсивность на точку на pi /4.

Чтобы это работало, вам нужно иметь заполненную форму, и вам может потребоваться настроить параметр color (c) так, чтобы он соответствовал вашим потребностям. Например, если направление вашего градиента закодировано в векторе, вы хотите спроецировать всю свою точку на этот вектор, чтобы получить значение вдоль градиента для всех точек.

Например:

% v controls the direction of the gradient
v = [0.1, 1];

t = linspace(0, 2*pi, 100);
F = exp(-cos(t))./(2.*pi*besseli(1,1));

% reconstructing point coordinate all around the surface
% this closes the path so with enough points so that interpolation works correctly
pts = [[t', F']; [t(end:-1:1)', ones(size(t'))*min(F)]];

% projecting all points on the vector to get the color
c = pts * (v');
clf
patch(pts(:,1),pts(:,2),c)
hold on
scatter(t, F)
hold off

enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...