返回列表 回复 发帖
14# 榕坚
是我错了,我查了我扫描的文件,正是你说的(@Period == 2)中,扫出的M集。
来一个稍微复杂点的带开关项的M集.在akl.ufm中。
MoebiusMandel {
init:
  z = @start
(柳烟注:既是M集,Z的初值定在何处呢?代码后面或面板上有,你结合面板,就知starting ponte(Re)与starting ponte(Im)即为z的定位的横纵标。)  
float xLim = abs(real(@limit))
  float yLim = abs(imag(@limit))
(在面板上能找到,接下来的二行,即是。这用来后面条件语句(IF后面的句子)中,当条件成立时,改变迭代算法而用。)
float reZ = 0
  float imZ = 0
(这两句好象是叫电脑腾出两个位子,存贮两变量reZ与imZ,对用画板制作复分形,可不考虑,事实上,这两句在画板中没啥作用。)
loop:
  z = z^@power + #pixel
(@power的值面板上有,后面也告诉了,这大家对前面几个程序应该有所熟悉,在代码后面何方,不难找到。#pixel就是C的值,将来的M集对其着色扫图的那个点。)  
reZ = real(z)
  imZ = imag(z)

  reZNew = reZ
  imZNew = imZ

  if (reZ < -xLim)
    reZNew = reZNew + 2*xLim
if (@mode == 1)
(这里的@mode是何意思?找代码后面,有
param mode
    caption = "Moebius Mode"
    enum    = "Normal" "Double" "Inverse"
    default = 0
再看面板上,找到Normal后,你点下拉菜单,可看到"Double" "Inverse",你就会恍然大悟,原来这是一个开关项。当你只某一个开关项的分形时,其余开关项有关的语句,你就别去考虑了。换句话说,一个开关项,造一个分形。理论上,所有的开关项,程序很容易实现的,画板能作出,但太繁顼,我试过,当开关项太多,一是造起来杀伤脑细胞,另由于计算过于复杂,太过秀气的几何画板吃不消,有可能扫不动。所以我喜欢一个分形一个分形去造。注意,@mode == 1成立时,对应第二个开关项"Double",当mode == 2成立时,对应第三个开关项"Inverse",当不考虑这二个开关项,也就是说mode == 1,2,将其后面的语句删去,则得第一个开关项的分形Normal)
      imZNew = imZNew - yLim
    elseif (@mode == 2)
      imZNew = -imZNew
    endif
  elseif (reZ > xLim)
    reZNew = reZNew - 2*xLim
    if (@mode == 1)
      imZNew = imZNew + yLim
    elseif (@mode == 2)
      imZNew = -imZNew
    endif
  endif

  if (imZ < -yLim)
    imZNew = imZNew + 2*yLim
    if (@mode == 1)
      reZNew = reZNew - xLim
    elseif (@mode == 2)
      reZNew = -reZNew
    endif
  elseif (imZ > yLim)
    imZNew = imZNew - 2*yLim
    if (@mode == 1)
      reZNew = reZNew + xLim
    elseif (@mode == 2)
      reZNew = reZNew
    endif
  endif

  z = reZNew + 1i*imZNew

bailout:
  |z| < @bailout
default:
  title = "Moebius' Mandel"
  center = (-0.5, 0)
  maxiter = 100
  method = multipass
  periodicity = 0

  param start
    caption = "Starting point"
    default = (0,0)
hint = "Perturbation. Use (0,0) for the standard Mandelbrot set."
(这告诉你z的定位的横纵坐标,与面板上的一致,这定位点,你可改换其它的定位坐标试试,说不定会看到比面板上还美的分形。)  
endparam

  param limit
    caption = "Moebius limits"
default = (2,2)
(这横纵坐标,前面已解说,主要用来作条件判断所用的。)  
endparam

  param mode
    caption = "Moebius Mode"
    enum    = "Normal" "Double" "Inverse"
    default = 0
  endparam

  param power
    caption = "Power"
    default = (2,0)
    hint = "This defines the power of the Mandelbrot set. Use (2,0) \
            for the standard Mandelbrot set."
(这是前面loop:
  z = z^@power + #pixel中,z的指数。)

  endparam

  param bailout
    caption = "Bailout value"
    default = 4.0(这是阈值)   
hint = "Defines how soon an orbit bails out, i.e. doesn't belong \
            to the inner set anymore."
  endparam

switch:
  type = "MoebiusJulia"
  seed = #pixel
  power = power
  bailout = bailout
  limit = limit
  mode = mode

}
解释了这通,就可以造作第一个开关项的分形了。为造好这个分形,我已作好了几个画板用于逻辑判断的算式的工具,发在此(下楼文件中),大家直接运用,提高造分形的效率。
"Normal" 的复分形。
http://u.115.com/file/f6b3bf5ff4#
扫一图。
未命名(3).jpg
MoebiusMandel(Normal).gsp (32.76 KB)
将就上楼的文件,将x[strt]设为0.000001,y[strt]=0,并将作色法改为平滑作色法,或者你自编一个含et的RGB作色,则逃逸区域得到填补,与UF中的图一致了。如图:
未命名(4).jpg
后两个开关项,我作来与UF差别太大,还没找到原因。这问题暂时打住,研究一段时间再说,若板友有知道如何作,可告知,非常感激。UF中,还有许多问题没解决。
Newton {
;
; Standard Newton fractal.
;
(这是常规N集,代码简单,通过看这种代码,便于熟悉UF的代码格式及意义,对解读复杂代码,并用画板造复杂分形打下基础。万丈高楼平地起。如果果复函数为f(z),则牛迭的迭代式为z-f(z)/f’(z)如果f(z)=z^3,导函数f’(x)=3z^2,则牛迭的迭代式为:z-(z^3-1)/3z^2,其余仿此)init:
  z = pixel
loop:
  zold = z
  z = ((p1 - 1) * z^p1 + @r) / (p1 * z ^ (p1 - 1))
(p1的值后面有告诉,为可变参数,(3,0),@r的值后面有告诉。)
bailout:
  |z - zold| >= 0.00001
(注意,这步与M集的p值不一样,这里的p=0.5*(1-sgn(0.5+sgn(|z - zold|-0.00001))),此式右边的0.00001即为阈值,也就是面板上的bailout)
default:
  title = "Newton"
  helpfile = "Uf3.chm"
  helptopic = "Html\formulas\standard\newton.html"
  maxiter = 100
  param p1
    caption = "Exponent"
    default = (3,0)
    hint = "Specifies the exponent of the equation that is solved by \
            Newton's method. Use real numbers (set the imaginary component \
            to zero) to obtain classic Newton fractals."
  endparam
  param r
    caption = "Root"
default = (1,0)
(这是@r值。)   
hint = "Specifies the root of the equation that is solved. Use larger \
            numbers for slower convergence."
  endparam
}
N_sin_M {
; newton's method applied to f(z) = sin(z) - c
; Q(z) = z - f(z)/f'(z) = z - ((sin(z)-c)/cos(z))

global:
   
init:
  z = 0
  complex delta_z = 0
  complex c = #pixel
  bool continue = true
  
loop:
  delta_z = ( sin(z) - c ) / cos(z)
  
  if |delta_z| < @delta
    continue = false
    if @zmode=="step"
        z = delta_z
    endif ; zmode
  else
    z = z - delta_z
  endif ; < @delta
  
bailout:
; -- this isn't the bailout but the continuing condition
;    false = bail; true = continue
  continue
  
default:
  title = "Newton-M, sin(z)-c" ; [v1.0]
  magn = 0.25
  periodicity = 0
  
  heading
    caption = "Bailout"
  endheading
  float param delta
    caption="Bailout delta"
    hint="Square of max step. Use small values."
    default=1e-8
    min=0
  endparam
  param zmode
    caption = "final z"
    enum = "z" "step"
    default = 1
  endparam
  
switch:
  type = "N_sin_J"
  cv = #pixel
  delta = delta
  zmode = zmode
  
}
大家自已仿照前面的解读UF程序,自已解读。我看了面板,面板上的开关项有两个,一个是z,一个是step我点了这两个开关项看了看,发现完全一样,至少我没看出区别,所以就按牛M集造。而上楼的则是牛J集,牛J集是对z着色,而牛M集则是对c着色。造的过程大体一样。 if |delta_z| < @delta
    continue = false
    if @zmode=="step"
        z = delta_z
    endif ; zmode
  else
这段代码我没考虑,直接计算出 z = z - delta_z然后进行迭代。
N_sin_M(UF)的视频:
http://u.115.com/file/f63b39515f#
N_sin_M.gsp (22.97 KB)
扫一图:
未命名(5).jpg
返回列表