Delphi上Mandelbrot集的光滑着色算法

Delphi上Mandelbrot集的光滑着色算法,delphi,colors,smoothing,mandelbrot,Delphi,Colors,Smoothing,Mandelbrot,我在使用smoot着色算法时遇到问题。我只是没有在代码中实现它们。 这是在某些计算像素行之后导致错误的主代码: g:=StrToInt(Edit3.Text); //maximum iteration count for x:=0 to Width do begin for y:=0 to Height do begin zr:=x*(br-ar)/Width+ar; zi:=y*(bi-ai)/Height+ai; n:=1; zr0:=zr;

我在使用smoot着色算法时遇到问题。我只是没有在代码中实现它们。 这是在某些计算像素行之后导致错误的主代码:

g:=StrToInt(Edit3.Text); //maximum iteration count
for x:=0 to Width do
begin
  for y:=0 to Height do
  begin
    zr:=x*(br-ar)/Width+ar;
    zi:=y*(bi-ai)/Height+ai;
    n:=1;
    zr0:=zr;
    zi0:=zi;
    while (n<g) and (zr*zr+zi*zi<4) do                                      
    begin
      zrh:=zr;
      zr:=zr*zr-zi*zi+zr0;
      zi:=zrh*zi+zi*zrh+zi0;
      Inc(n) //iterations
    end;
    n:=Round(n+1-(log2(log2(sqrt(zr*zr+zi*zi))/log2(4)))); //<-- this should smoothen the iterations
    Draw_Pixels(n,g,x,y,Image1.Canvas)
    end
  end;
end;
g:=stroint(Edit3.Text)//最大迭代次数
对于x:=0到宽度do
开始
对于y:=0到高度do
开始
zr:=x*(br-ar)/宽度+ar;
zi:=y*(bi ai)/高度+ai;
n:=1;
zr0:=zr;
zi0:=zi;

而(n如果您以
zr==zi==0
结束,您将尝试采用未定义的
log2(0)
-inf
作为限制)

如果
zr*zr+zi*zi
等于或小于1,内部
log2
将返回0或负值,这将破坏外部
log2
(只要处理reals,就不能使用负数的日志)


(我认为对于略大于1的值,
zr*zr+zi*zi
这不会平滑地缩放。)

它说的是类似于“在Project Project1.exe中,类EInvalidOp的异常与信息“无效浮点操作”一起发生”的内容。您知道
log2(4)
仅为2,对吗?我现在已将变量记录在备忘录中。每次计算后我都会添加它们。错误出现在点(2 | 320)处,其中n从7跳到300,zo变为0。为什么zi突然变为0?你在处理一个分形函数。事情的变化没有太多的可预测性,所以“为什么”它变为0,但实际上没有答案(当考虑到有限精度的算术时)这也不重要,
zr
zi
都可以为零,没有问题,但你不能在平滑函数中放入范数<1的复数。好吧,但我现在如何获得平滑颜色呢?这是一个完全不同的问题。维基百科上的页面有一些算法。这实际上是我的问题,因为我无法获得平滑颜色n实现这些平滑着色算法。。。