牛顿法吸引分形盆地如何得到颜色梯度

问题描述 投票:0回答:1

我使用MATLAB在复杂平面中通过NxN网格,x是实部,y是虚部。对于此网格上的每个点,我将其用作牛顿方法的起点。根据它收敛到哪个根,它被赋予一个数字。此数字与pcolor一起用于绘制分形。

它很好地绘制,但是,我想根据收敛到根所需的时间来绘制颜色暗度。我在使用pcolor时遇到了麻烦。我能够获得3种颜色的3种颜色但我不太确定如何添加更多颜色以使其更具描述性。

这是我得到情节后的代码 xp - x点数组 yp - y点数组 col - 具有1,2,3的NxN矩阵(对应于哪个根)

% 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种颜色的边界。

如果您想查看此计划的完整代码,请与我们联系。谢谢

matlab matlab-figure fractals
1个回答
0
投票

添加聚合作为颜色所需的迭代次数。在HSV中定义颜色,并使迭代次数映射到HSV的值S.这将为您提供一个漂亮而有意义的颜色渐变而不会真正改变颜色。

伪代码是:

为此,像你一样生成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,但它不那么重要。

使用范围和更好地图的颜色值限制。通常还使用非线性映射,其中函数f应用于迭代值,例如sigmoid。

这是您可以在维基百科中找到的牛顿分形的技术,例如:

enter image description here

© www.soinside.com 2019 - 2024. All rights reserved.