返回列表 回复 发帖
25# 榕坚
刚从外地归来,问好榕兄,新春快乐。下载文件,学习研究。
25# 榕坚
榕坚兄的原文件中,计算的每一步几乎都按UF程序进行,且算式清晰明了,大家结合UF程序并对照原文件中的每一步,很容易作出。故而视频文件不再制作,大家尝试自已完成。
bobm000.ufm中。
Bob28 {
; Bob Margolis
init:      
  z=c=fn1(1/(pixel*pixel))
fn1代表不同的复函数,你从UF面板上的函数开关处,选取不同的函数,就得到不同的复分形。在其它的UF程序中, 除fn1外,还有fn2、fn3,均是面板上的函数开关。从面板上看,有近二十多个函数
loop:
  z=z*z+c
bailout:  
  |z| <= 4
按精典M集造,迭代得出et、em后,着色前,将z、与点c定位在: fn1(1/(pixel*pixel))即可。
}
整了11个带函数开关的分形。上楼文件的制作视频如下:
http://u.115.com/file/f6d05c7226#
Bob28.gsp (37.36 KB)
Cayley-mand {
; Ron Barnett, February 1999
; based upon the formula z = z^3 - az - c + 1
; convergence methods added 10/2/2004
init:
  complex fz = 0
  complex fzp = 0
  complex fzp2 = 0  
  #z = 0
(这是z的定位初值,注意,着色前,不能直接将z合并到原点,另造(0,0)的点,
再将z合并到该点)
  complex oldz = 0
  complex a = #pixel
(这句意思是将#pixel的值赋给a,让a参与后面的复函数式的运算。但在画板中,
往往是让a先参与运算,迭代后,再将其合并到#pixel最后对#pixel着色。但在此例中,
不涉及a的迭代问题,合并不合并无关系,所以就将a当成#pixel即可。)
  float iterate = 0
loop:
  iterate = iterate + 1
  oldz = #z
  fz = #z^3 - a*z - a + 1
  fzp = 3*#z^2 - a
  fzp2 = 6*#z
  if @converge == 0                          ; Newton
    #z = #z - fz/fzp
  elseif @converge == 1                      ; Householder
    #z = #z - fz/fzp*(1 + fz*fzp2/(2*fzp^2))   
  elseif @converge == 2                      ; Halley
    #z = #z - 2*fz*fzp/(2*fzp^2 - fz*fzp2)  
  elseif @converge == 3                      ; Schroder
    #z = #z - fz*fzp/(fzp^2 - fz*fzp2)  
  elseif @converge == 4                      ; Ho custom
    #z = #z - fz/fzp*(1 + fz*fzp2/(@custom*fzp^2))      
  elseif @converge == 5                      ; Ha custom
    #z = #z - 2*fz*fzp/(@custom*fzp^2 - fz*fzp2)  
  elseif @converge == 6                      ; H_S custom
    #z = #z - @custom*fz*fzp/(@custom*fzp^2 - fz*fzp2)      
  elseif @converge == 7                      ; Mixed1
    if  iterate % 2 == 0
(查UF中的帮助,知道:a % b = a - trunc(a/b) * b)
      #z = #z - fz/fzp*(1 + fz*fzp2/(2*fzp^2))  
    else
      #z = #z - fz/fzp
    endif  
  elseif @converge == 8                      ; Mixed2
    if  iterate % 2 == 0
      #z = #z - 2*fz*fzp/(2*fzp^2 - fz*fzp2)  
    else
      #z = #z - fz/fzp
    endif
  elseif @converge == 9                      ; Mixed3
    if  iterate % 2 == 0
      #z = #z - fz*fzp/(fzp^2 - fz*fzp2)  
    else
      #z = #z - fz/fzp
    endif
  elseif @converge == 10                      ; Mixed4
    if  iterate % 2 == 0
      #z = #z - @custom*fz*fzp/(@custom*fzp^2 - fz*fzp2)  
    else
      #z = #z - fz/fzp
(Newton、Householder、Halley、Schroder、Ho custom……这些都是复分开关,在每个开关里,
都可找到相应的复分形迭代式。可仿照前面的做法弄在一个文件中,但是怕秀气的几何画板吃不消,
扫不动。所以先弄少许的几个,然后改变计算式,再弄出其余的几个,再将就原文件进行修改,
弄出其余的几个,将负载减少。各别开关项里有@custom,你在UF面板上调出相应的开关项时,
立刻在该开关项的下面,就会出现H_S constant,里面的值就是@custom.这是可变参数。)
    endif
  endif
bailout:
  |#z - oldz| >= @bailout
default:
  title = "Cayley Mandel"
  maxiter = 1000
  center = (0.3593516980975, 0)
  magn = 360
  method = multipass
  periodicity = 0
  heading
    caption = "Cayley Mandelbrot"
  endheading
$ifdef VER40
  heading
    text = "This is a 'convergent' fractal that uses multiple convergence \
            methods and has Mandelbrot-like regions for several convergence methods."
  endheading
$else
  heading
    caption = "This is a 'convergent' fractal"
  endheading
  heading
    caption = "that uses multiple convergence"
  endheading
  heading
    caption = "methods and has Mandelbrot-like regions"
  endheading
  heading
    caption = "for several convergence methods."
  endheading
$endif
  param version
    caption = "Formula Version"
    default = 1.0
    hint = "You should never see this parameter; it's used internally to track \
        which version of the formula was used to create your image, so that \
        if a bug is found which breaks backwards-compatibility, the formula \
        can adapt transparently."
    visible = false
  endparam
  param bailout
    caption = "Bailout value"
    default = 0.000001
  endparam
  heading
    caption = "Convergence Methods"
  endheading  
  param converge
    caption = "Convergence Method"
    default = 0
    enum = "Newton" "Householder" "Halley" "Schroder" "Ho Custom" \
           "Ha Custom" "H_S Custom" "Mixed1" "Mixed2" "Mixed3" "Mixed4"
  endparam  
  float param custom
    caption = "H_S Constant"
    default = 1.5
(custom即为UF面板上的H_S Constant",为1.5,也可为其它的值,为可变参数)
    visible = @converge==4 || @converge==5  || @converge==6 || @converge==10
  endparam  
switch:
  type = "Cayley-jul"
  bailout = @bailout
  converge = @converge
  p1 = #pixel
  custom = @custom
}
以0:Newton
4、Hocustom
7、Mixed1为例
于是程序可精简为这几段:
loop:
  iterate = iterate + 1
  oldz = #z
  fz = #z^3 - a*z - a + 1
  fzp = 3*#z^2 - a
  fzp2 = 6*#z
  if @converge == 0                          ; Newton
    #z = #z - fz/fzp
   
elseif @converge == 4                      ; Ho custom
    #z = #z - fz/fzp*(1 + fz*fzp2/(@custom*fzp^2))      
   
  elseif @converge == 7                      ; Mixed1
    if  iterate % 2 == 0
      #z = #z - fz/fzp*(1 + fz*fzp2/(2*fzp^2))  
    else
      #z = #z - fz/fzp
Cayley-mand(更新).gsp (39.53 KB)
庆幸才弄了三个开关项的分形,慢如蜗牛。如果全部弄完,真的扫死机子了。其余的几个分形,你只要将计算式新增添加进已有的式子,即可得新的分形,没必要重新迭代并着色,省事多了。
这是上楼的视频。
原来发的视频文件有点小小问题,现已更新。
http://u.115.com/file/f61729ea0d#
其余的几个开关项,作为练习,自已仿此完成。
扫图:
未命名.jpg
未命名(1).jpg
未命名.jpg
未命名.jpg
范例位于reb.ufm系列中:
OldPhoenix {
; Ron Barnett, 1990
; Old formula from Stevens Turbo Pascal book
; Modified and tweaked March 2000
init:
  #z = flip(#pixel)
这是z的初值,画板采取的是先迭代,后定位亦即合并方法。最后将z定位于何处?flip函数是将点#pixel的实部与虚部相交换,即横坐坐标交换后的点。如果不交换行不行呢,行,则与原图比校,只是旋转了一个角度,旋转了多少,你可按中学里的点变换算处即知。最后是对#pixel点进行着色。)  
complex x1 = 0
complex y = 0
(这是x1与y点的初值,均为原点。)
loop:
  x1 = #z*#z + real(@p1) + imag(@p1)*y
  y = #z
  #z = x1
(这段代码意思是,将初值的象算出,即为x1 = #z*#z + real(@p1) + imag(@p1)*y
,然后将其赋值给z的象点 #z = x1,而将Z的原象赋给y(注意这里的x1就相当于画板里的z',而y的象点,在迭代过程中,相当于上一个z值。)我是这样理解的,不知对不对,大家可发表意见。)

bailout:
  (@test == 0 && |#z| <= @bailout) ||                                         \
  (@test == 1 && sqr(real(#z)) <= @bailout) ||                                \
  (@test == 2 && sqr(imag(#z)) <= @bailout) ||                                \
  (@test == 3 && (sqr(real(#z)) <= @bailout && sqr(imag(#z)) < @bailout)) ||  \
  (@test == 4 && (sqr(real(#z)) <= @bailout || sqr(imag(#z)) < @bailout)) ||  \
  (@test == 5 && (sqr(abs(real(#z)) + abs(imag(#z))) <= @bailout)) ||         \
  (@test == 6 && (sqr(real(#z) + imag(#z)) <= @bailout))
这里的开关项,面板上可看出,是test ,主要功能是改变画板里的逃逸参数p的算法。我以test==0,与test==1为例,其余你可举一而反三。
default:
  title = "OldPhoenix"
  center = (0.0, 0.0)
  maxiter = 256
  periodicity = 0
  param version
    caption = "Formula Version"
    default = 1.0
    hint = "You should never see this parameter; it's used internally to track \
        which version of the formula was used to create your image, so that \
        if a bug is found which breaks backwards-compatibility, the formula \
        can adapt transparently."
    visible = false
  endparam
  param test
    caption = "Bailout Test"
    default = 0
    enum = "mod" "real" "imag" "or" "and" "manh" "manr"
(这里的"mod" "real" "imag" "or" "and" "manh" "manr"即为代表前面的不同的test ,面板上可发现。)  
endparam
  param bailout
    caption = "Bailout value"
    default = 100.0
(阈值为100,这大家对前面的讲解熟了后,一看便知。)   
min = 1
  endparam
  param p1
    caption = "Parameter 1"
    default = (0.56667, -0.5)
(P1的值,面板上也有。)  
endparam
switch:
  type = "OldMandelPhoenix"
  bailout = @bailout
   
}
上面对代码粗略讲了讲,初学者可能一头雾水,不过,你接着看下楼即将发表的视频后,可加深对代码的了解。我去制作视频去了,干了这么久,制作视频很是一件麻烦的事。另外,在科学的大道上,没有平坦的大道可走,只有不畏劳苦沿着陡峭山路登攀的人,才能达到希望的顶点——-马克思。顺便写上这句名言,与各位板友共勉。
返回列表