Как получить цветовой градиент для фрактала бассейна притяжения Ньютона - PullRequest
0 голосов
/ 12 марта 2019

Я использую MATLAB для прохождения сетки NxN в комплексной плоскости, x - это действительный компонент, а y - мнимый компонент. Для каждой точки на этой сетке я использую ее как отправную точку для метода Ньютона. В зависимости от того, к какому корню он сходится, ему присваивается номер. Это число используется с pcolor для построения фрактала.

Это хорошо, но я хочу также нарисовать цветную темноту в зависимости от того, сколько времени нужно, чтобы сходиться к корню. У меня проблемы с pcolor. Мне удалось получить 3 цвета для 3 корней, но я не совсем уверен, как добавить больше цветов, чтобы они были более наглядными.

Вот код для получения графика после того, как у меня есть
xp - массив x точек
yp - массив точек y
col - матрица NxN, имеющая 1, 2, 3 (соответствует корню)

% thresholds for color
caxis([1 3]); 

% sets colors Red, Green, Blue
mycolors = [1 0 0; 0 1 0; 0 0 1];
colormap(mycolors);

% real component on x and imaginary component on y
h=pcolor(xp, yp, col');
set(h, 'LineStyle', 'none' );

Итак, как мне получить градиент в pcolor, кажется, что pcolor просто как бы вычисляет все цвета сам. И caxis позволяет только границы для 2 цветов.

Дайте мне знать, если вы хотите увидеть полный код этой программы. Спасибо

1 Ответ

0 голосов
/ 12 марта 2019

Добавьте количество итераций, необходимое для достижения конвергенции, в качестве цвета.Определите цвета в HSV и установите число итераций в соответствии со значением S HSV.Это даст вам хороший и значимый градиент цвета без реального изменения цвета.

Псевдокод:

Для этого сгенерируйте 3 цвета mycolors, как и вы.Измените их цветовое пространство на mycolorshsv=rgb2hsv(mycolors);

. Теперь вы хотите создать группу (по вашему выбору) цветов для каждого цвета.

mycolorshsv=repelem(mycolorshsv,N,1);

Теперь давайте сгенерируем N градиентов на цвет.

mycolorshsv(    1:  N,2)=linspace(0,1,N);
mycolorshsv(  N+1:2*N,2)=linspace(0,1,N);
mycolorshsv(2*N+1:3*N,2)=linspace(0,1,N);

Вы хотите, чтобы, например, самая длинная итерация, которую вы получили maxiter, была самой яркой.Нам нужно преобразовать вашу матрицу col из [1,2,3] в наш текущий диапазон.Для этого просто

col=(col-1)*N+1; % make 1=>1, 2=>N, 3=>2*N;
col=col+iteration_matrix; %max(iteration_matrix) must be maxiter. You may want to normalize so min(iteration_matrix) is 0

Теперь просто установите colormap(mycolors);, и я бы использовал imagesc вместо pcolor, но это менее важно.

Играть с диапазоном,и пределы значений colro для более хороших карт.Часто также используются нелинейные карты, где функция f применяется к значениям итерации, таким как сигмоида.

Это техника, используемая для фракталов Ньютона, которую вы можете найти в Википедии, например:

enter image description here

...