Board logo

标题: UF难题三度征解 [打印本页]

作者: 柳烟    时间: 2013-5-27 14:41     标题: UF难题三度征解

整理精简代码,抽出代码如下:
hilbert-curve {

init:
  float x=0.0
  float y=0.0
  float r=0.0
  float rmin=1e20
  float u=0.0
  float v=0.0
  float msb=0.0
  t=(0,0)
  int iter=0
  int nlast=0
  int n=0
  int fac3=0
  int fac4=0
  int power4=0
  zh=(0,0)
  zh0=(0,0)
;
; set up endpoints for the lines
;
  float h=@fourcorners
  float ooh=1/h
  float ooomh=1/(1-h)
  float hoomh=h/(1-h)
  z0a=@enterexit*h
  z0b=flip(@enterexit*h)
  x=real(@centerll)*h
  y=imag(@centerll)*h
  z1=x+flip(y)
  x=real(@centerul)*h
  y=imag(@centerul)*(1-h)+h
  z2=x+flip(y)
  x=real(@centerur)*(1-h)+h
  y=imag(@centerur)*(1-h)+h
  z3=x+flip(y)
  x=real(@centerlr)*(1-h)+h
  y=imag(@centerlr)*h
  z4=x+flip(y)
  z5=1+flip(@enterexit*h)
loop:
final:
  iter=0
  zh0=#z*0.25+(0.5,0.5)
  zh=zh0
  while(iter<@niter)
    iter=iter+1
    x=real(zh)
    y=imag(zh)
;
; lower left sub-square:  shrink, flip horizontally, rotate by -90 degrees
;
    if((x<h)&&(y<h))
      nlast=3
      u=ooh*y
      v=ooh*x
;
; upper left sub-square:  just shrink
;
    elseif((x<h)&&(y>=h))
      nlast=2
      u=ooh*x
      v=ooomh*y-hoomh
;
; upper right sub-square:  shrink & flip horizontally
;
    elseif((x>=h)&&(y>=h))
      nlast=1
      u=ooomh-ooomh*x
      v=ooomh*y-hoomh
;
; lower right sub-square:  shrink, rotate by 90 degrees
;
    elseif((x>=h)&&(y<h))
      nlast=4
      u=ooh*y
      v=ooomh-ooomh*x
    else
      nlast=-1
      u=x
      v=y
    endif
    zh=u+flip(v)
    msb=(msb+nlast-1)/4
    n=n*4+nlast-1
  endwhile
  if(n<0)
    #solid=true
  else
                ; distance to curve
;
; determine how to start line 0-1
;
    z0=z0a
    iter=0
    fac3=2
    fac4=1
    power4=4
    while(iter<@niter)
      iter=iter+1
      if(iter%2==1)
        if(n%power4==fac3)
          z0=z0b
        endif
      else
        if(n%power4==fac3)
          z0=z0a
        endif
      endif
      power4=4*power4
      fac4=4*fac4
      fac3=fac3+2*fac4
    endwhile
;
; line from enter to lower left sub-square
;
    t=(zh-z0)/(z1-z0)
    x=real(t)
    y=imag(t)
    if(x<0.0)
      r=sqr(x)+sqr(y)
    elseif(x>1.0)
      r=sqr(x-1.0)+sqr(y)
    else
      r=sqr(y)
    endif
    r=sqrt(r)*cabs(z1-z0)
    if(r<rmin)
      rmin=r
    endif
;
; line from lower left to upper left sub-squares
;
    t=(zh-z1)/(z2-z1)
    x=real(t)
    y=imag(t)
    if(x<0.0)
      r=sqr(x)+sqr(y)
    elseif(x>1.0)
      r=sqr(x-1.0)+sqr(y)
    else
      r=sqr(y)
    endif
    r=sqrt(r)*cabs(z2-z1)
    if(r<rmin)
      rmin=r
    endif
;
; line from upper left to upper right sub-squares
;
    t=(zh-z2)/(z3-z2)
    x=real(t)
    y=imag(t)
    if(x<0.0)
      r=sqr(x)+sqr(y)
    elseif(x>1.0)
      r=sqr(x-1.0)+sqr(y)
    else
      r=sqr(y)
    endif
    r=sqrt(r)*cabs(z3-z2)
    if(r<rmin)
      rmin=r
    endif
;
; line from upper right to lower right sub-squares
;
    t=(zh-z3)/(z4-z3)
    x=real(t)
    y=imag(t)
    if(x<0.0)
      r=sqr(x)+sqr(y)
    elseif(x>1.0)
      r=sqr(x-1.0)+sqr(y)
    else
      r=sqr(y)
    endif
    r=sqrt(r)*cabs(z4-z3)
    if(r<rmin)
      rmin=r
    endif
;
; line from lower right sub-square to exit
;
    t=(zh-z4)/(z5-z4)
    x=real(t)
    y=imag(t)
    if(x<0.0)
      r=sqr(x)+sqr(y)
    elseif(x>1.0)
      r=sqr(x-1.0)+sqr(y)
    else
      r=sqr(y)
    endif
    r=sqrt(r)*cabs(z5-z4)
    if(r<rmin)
      rmin=r
    endif
;
      #index=rmin
    endif

default:
  title="Hilbert curve"
  param centerll
    caption="lower left center"
    default=(0.5,0.5)
    hint="Center of the lower left sub-square. Make both coordinates \
    between 0 & 1; use (0.5,0.5) for standard Hilbert curve."
  endparam
  param centerul
    caption="upper left center"
    default=(0.5,0.5)
    hint="Center of the upper left sub-square. Make both coordinates \
    between 0 & 1; use (0.5,0.5) for standard Hilbert curve."
  endparam
  param centerur
    caption="upper right center"
    default=(0.5,0.5)
    hint="Center of the upper right sub-square. Make both coordinates \
    between 0 & 1; use (0.5,0.5) for standard Hilbert curve."
  endparam
  param centerlr
    caption="lower right center"
    default=(0.5,0.5)
    hint="Center of the lower right sub-square. Make both coordinates \
    between 0 & 1; use (0.5,0.5) for standard Hilbert curve."
  endparam
  param enterexit
    caption="enter/exit"
    default=0.5
    min=0.0
    max=1.0
    hint="Where the curve enters and exits the block of 4 sub-squares. \
      Between 0 & 1; use 0.5 for standard Hilbert curve."
  endparam
  param fourcorners
    caption="4 corners"
    default=0.5
    hint="Where the 4 corners meet.  Between 0 & 1; use 0.5 for standard \
      Hilbert curve."
  endparam
  param niter
    caption="iterations"
    default=0
    min=0
  endparam

}
这整理后的代码,我在UF验证没问题。代码很长,大家带出后,将文件帖在这。
效果图:
Fractal2.png

图片附件: Fractal2.png (2013-5-27 14:47, 141.19 KB) / 下载次数 1816
http://inrm3d.cn/attachment.php?aid=20026&k=90bef7e8e9f08d33a8d97744879ef39a&t=1714753729&sid=UzA0k9


作者: 柳烟    时间: 2013-5-28 00:26

按常老师的地毯算法,扫一张谢氏地毯:
未命名.jpg
谢氏地毯.gsp (16.09 KB)

图片附件: 未命名.jpg (2013-5-28 00:30, 66.58 KB) / 下载次数 1528
http://inrm3d.cn/attachment.php?aid=20039&k=9db1192daf943d99636a6c3c61bec3fc&t=1714753729&sid=UzA0k9



附件: 谢氏地毯.gsp (2013-5-28 00:30, 16.09 KB) / 下载次数 2681
http://inrm3d.cn/attachment.php?aid=20040&k=ee84c8776643683c8328e093d29d3f47&t=1714753729&sid=UzA0k9
作者: 柳烟    时间: 2013-5-29 23:09

搞了几天,整出的图与UF差别实在是大。今晚重新整,扫出的怪异图片:
未命名.JPG
大家有整出的,告知,实在感激不尽。

图片附件: 未命名.JPG (2013-5-29 23:09, 35.65 KB) / 下载次数 1553
http://inrm3d.cn/attachment.php?aid=20056&k=43e31356cfb8d3f1c84cbbbc0b23afc3&t=1714753729&sid=UzA0k9


作者: 柳烟    时间: 2013-6-2 10:53

又重新做一遍,扫得如下图,有些接近了,仍未找到原因何在。
未命名.JPG

图片附件: 未命名.JPG (2013-6-2 10:53, 42.29 KB) / 下载次数 1581
http://inrm3d.cn/attachment.php?aid=20106&k=6b7b4d323578fe81184e8868e353b0e7&t=1714753729&sid=UzA0k9


作者: 柳烟    时间: 2013-6-2 16:02

应该说能用画板实现,算式太多,看来我要放弃了。
我把较为接近的歪货希尔拍特粘在此,大家查查问题出在那里?
歪货希尔伯特.gsp (53.77 KB)
数据有点多。

附件: 歪货希尔伯特.gsp (2013-6-2 16:18, 53.77 KB) / 下载次数 2819
http://inrm3d.cn/attachment.php?aid=20108&k=072d4ea6cb170a882c82625ea9916cec&t=1714753729&sid=UzA0k9
作者: 柳烟    时间: 2013-6-3 11:54

我在UF中玩,将程序中的fac4=4*fac4等三句拖出子循环后,发现与我的歪图有点相似,估计是这二句用画板造,迭代时有问题,实不知如何处理。虽说子循环用画板麻烦,以前遇到这种类似子循环,按常规迭代处理也整出与UF完全一样的图。
UF中的这个希尔伯特曲线,实在太迷人并充满了魅力。
作者: 柳烟    时间: 2013-6-5 20:55

已经决定放弃了,有大师整出后,教会我,万分感激。
作者: changxde    时间: 2013-6-6 09:54

看了UF这个程序,琢磨了几天,仍不明算理,用画板试试,竟然成了。
UF_Hilbert-Curve.gsp (33.91 KB)

附件: UF_Hilbert-Curve.gsp (2013-6-6 09:54, 33.91 KB) / 下载次数 3183
http://inrm3d.cn/attachment.php?aid=20132&k=a55ae657f55827f17e7abb05933f347d&t=1714753729&sid=UzA0k9
作者: 柳烟    时间: 2013-6-6 14:33

8# changxde
感谢常老师。我刚才看了你的文件,作的很成功。原来是我处理代码里那两个循环整复杂了,一直在那里转,跳不出思维的定式,转不出来。这个问题得以解决,心情确实高兴。
作者: 柳烟    时间: 2013-6-6 22:04

学习了常老师的文件,重新作了UF中的此分形,干了两三个钟头。扫一幅图片:
未命名.JPG
机理不明,一头雾水。搞分形,手头,网上能收到的信息太少了,好象外国佬创新头脑厉害,分形成了外国人的最高机密。

图片附件: 未命名.JPG (2013-6-6 22:04, 125.79 KB) / 下载次数 1541
http://inrm3d.cn/attachment.php?aid=20144&k=77e1c2b31ff58025ab3840a3257ad2c0&t=1714753729&sid=UzA0k9


作者: 柳烟    时间: 2013-6-9 23:52

精解代码:
aug01-hilbert-spline2 {
init:
  float x=0.0
  float y=0.0
  float r=0.0
  float rmin=1e20
  float u=0.0
  float v=0.0
  int iter=0
  int nlast=0
  int n=0
  int fac3=0
  int fac4=0
  int power4=0
  zh=(0,0)
;
; set up endpoints for the lines
;
  float h=0.5
  float ooh=1/h
  float ooomh=1/(1-h)
  float hoomh=h/(1-h)
  z0a=@enterexit
  z0b=flip(@enterexit)
  z1=@centerll
  z2=@centerul
  z3=@centerur
  z4=@centerlr
  z5=1+flip(@enterexit)
loop:
final:
  iter=0
  zh=#z*0.25+(0.5,0.5)
  while(iter<@niter)
    iter=iter+1
    x=real(zh)
    y=imag(zh)
;
; lower left sub-square:  shrink, flip horizontally, rotate by -90 degrees
;
    if((x<h)&&(y<h))
      nlast=3
      u=ooh*y
      v=ooh*x
;
; upper left sub-square:  just shrink
;
    elseif((x<h)&&(y>=h))
      nlast=2
      u=ooh*x
      v=ooomh*y-hoomh
;
; upper right sub-square:  shrink & flip horizontally
;
    elseif((x>=h)&&(y>=h))
      nlast=1
      u=ooomh-ooomh*x
      v=ooomh*y-hoomh
;
; lower right sub-square:  shrink, rotate by 90 degrees
;
    elseif((x>=h)&&(y<h))
      nlast=4
      u=ooh*y
      v=ooomh-ooomh*x
    else
      nlast=-1
      u=x
      v=y
    endif
    zh=u+flip(v)
    n=n*4+nlast-1
  endwhile
;
; determine how to start line 0-1
;
  z0=z0a

  iter=0
  fac3=2
  fac4=1
  power4=4
  while(iter<@niter)
    iter=iter+1
    if(iter%2==1)
      if(n%power4==fac3)
        z0=z0b

      endif
    else
      if(n%power4==fac3)
        z0=z0a

      endif
    endif
    power4=4*power4
    fac4=4*fac4
    fac3=fac3+2*fac4
  endwhile
;
; spline from enter to lower left sub-square
;
  zz0=z0
  zz2=z1


  zz1=(zz0+zz2)/2

  c=zz0-zh
  b=2*(zz1-zz0)

    root1=-c/b


  x=real(root1)
  y=imag(root1)
  if(x<0.0)
    r=cabs(root1)
  elseif(x>1.0)
    r=cabs(root1-1)
  else
    r=abs(y)
  endif

  if(r<rmin)
    rmin=r
  endif



;
; spline from lower left to upper left sub-square
;
  zz0=z1
  zz2=z2


    zz1=(zz0+zz2)/2

  c=zz0-zh
  b=2*(zz1-zz0)


    root1=-c/b


  x=real(root1)
  y=imag(root1)
  if(x<0.0)
    r=cabs(root1)
  elseif(x>1.0)
    r=cabs(root1-1)
  else
    r=abs(y)
  endif

  if(r<rmin)
    rmin=r
  endif



;
; spline from upper left to upper right sub-square
;
  zz0=z2
  zz2=z3


    zz1=(zz0+zz2)/2

    c=zz0-zh
  b=2*(zz1-zz0)


    root1=-c/b

  x=real(root1)
  y=imag(root1)
  if(x<0.0)
    r=cabs(root1)
  elseif(x>1.0)
    r=cabs(root1-1)
  else
    r=abs(y)
  endif

  if(r<rmin)
    rmin=r
  endif



; spline from upper right to lower right sub-square
;
  zz0=z3
  zz2=z4

    zz1=(zz0+zz2)/2

  c=zz0-zh
  b=2*(zz1-zz0)

    root1=-c/b


  x=real(root1)
  y=imag(root1)
  if(x<0.0)
    r=cabs(root1)
  elseif(x>1.0)
    r=cabs(root1-1)
  else
    r=abs(y)
  endif

  if(r<rmin)
    rmin=r
  endif



; spline from lower right sub-square to exit
;
  zz0=z4
  zz2=z5

    zz1=(zz0+zz2)/2

  c=zz0-zh
  b=2*(zz1-zz0)


    root1=-c/b

  x=real(root1)
  y=imag(root1)
  if(x<0.0)
    r=cabs(root1)
  elseif(x>1.0)
    r=cabs(root1-1)
  else
    r=abs(y)
  endif

  if(r<rmin)
    rmin=r
  endif



;
  #index=rmin
default:
  title="Hilbert spline 2"
  param niter
    caption="iterations"
    default=0
    min=0
  endparam
  param centerll
    caption="lower left center"
    default=(0.25,0.25)
    hint="Center of the lower left sub-square. Make both coordinates \
    between 0 & 1; use (0.25,0.25) for standard Hilbert curve."
  endparam
  param centerul
    caption="upper left center"
    default=(0.25,0.75)
    hint="Center of the upper left sub-square. Make both coordinates \
    between 0 & 1; use (0.25,0.75) for standard Hilbert curve."
  endparam
  param centerur
    caption="upper right center"
    default=(0.75,0.75)
    hint="Center of the upper right sub-square. Make both coordinates \
    between 0 & 1; use (0.75,0.75) for standard Hilbert curve."
  endparam
  param centerlr
    caption="lower right center"
    default=(0.75,0.25)
    hint="Center of the lower right sub-square. Make both coordinates \
    between 0 & 1; use (0.75,0.25) for standard Hilbert curve."
  endparam
  param enterexit
    caption="enter/exit"
    default=0.25
    min=0.0
    max=1.0
    hint="Where the curve enters and exits the block of 4 sub-squares. \
      Between 0 & 1; use 0.25 for standard Hilbert curve."
  endparam


}
作者: 柳烟    时间: 2013-6-9 23:53

未命名.jpg

图片附件: 未命名.jpg (2013-6-13 22:31, 53.28 KB) / 下载次数 1218
http://inrm3d.cn/attachment.php?aid=20181&k=aa2eb6a109ea4e706b98e793552be754&t=1714753729&sid=UzA0k9


作者: 柳烟    时间: 2013-6-10 00:37

未命名.jpg
Hilbert spline 2.gsp (45.55 KB)

图片附件: 未命名.jpg (2013-6-13 22:33, 39.34 KB) / 下载次数 1100
http://inrm3d.cn/attachment.php?aid=20183&k=57d442a2af291dd15fd9b295cc64e23a&t=1714753729&sid=UzA0k9



附件: Hilbert spline 2.gsp (2013-6-10 00:40, 45.55 KB) / 下载次数 2389
http://inrm3d.cn/attachment.php?aid=20184&k=5d284388f3fdec4330dfc1dae4defbce&t=1714753729&sid=UzA0k9
作者: 柳烟    时间: 2013-6-10 00:46

本人调色始终差炎候,UF中的色彩真艳:
Fractal2.JPG

图片附件: Fractal2.JPG (2013-6-13 22:34, 44.38 KB) / 下载次数 1113
http://inrm3d.cn/attachment.php?aid=20185&k=5931f39e227b28461983b5b30e846c71&t=1714753729&sid=UzA0k9


作者: 柳烟    时间: 2013-6-10 08:38

调一幅:
未命名.jpg

图片附件: 未命名.jpg (2013-6-13 22:37, 34.35 KB) / 下载次数 1123
http://inrm3d.cn/attachment.php?aid=20189&k=4cc5f9289ac515a6bcad9688234355b4&t=1714753729&sid=UzA0k9


作者: 柳烟    时间: 2013-6-10 11:23

将原M集的数据粘到#13中,将M集的迭代终点坐标加载到原希氏数据中,只需花几分钟时长。扫得一图:
未命名.jpg

图片附件: 未命名.jpg (2013-6-10 11:23, 109.51 KB) / 下载次数 1106
http://inrm3d.cn/attachment.php?aid=20190&k=6340c7722ed3d8f2de732b893a777e25&t=1714753729&sid=UzA0k9


作者: 柳烟    时间: 2013-6-10 15:07

未命名.jpg

图片附件: 未命名.jpg (2013-6-13 22:39, 49.45 KB) / 下载次数 1109
http://inrm3d.cn/attachment.php?aid=20191&k=7014635b11b0e44ba4e3be608ae33538&t=1714753729&sid=UzA0k9


作者: 柳烟    时间: 2013-6-13 12:49

M集作陷阱的UF代码,精简,整理,编辑,几处代码动的手脚比较大,发现图形没什么两样:
juliatrap(BOTH) {
; By Samuel Monnier, 1999
init:
   count = 0
  float stdz = 0.0
  float logp = 1/log(2)
  float logb = log(log(1e20))
    float dz = 0.0
loop:
  trz = exp(flip(-pi/180*@rot))*(#z-@center)/@size
  x = 1/sqrt(@r)*real(trz)
  y = sqrt(@r)*imag(trz)
    trz = x + flip(y)
  zz = trz
  float i = 0
  iter = @niter


    start = zz
    zz = @seed


  while i < @niter
    i = i + 1
    zz = zz^2 + start
    if |zz| > 1e20
      iter = i
      i = @niter
    endif

  endwhile
  dz = real(iter + logp*logb - logp*log(log(cabs(zz))))
    if dz>stdz
      stdz = dz


    endif


final:
  #index = .1*stdz
default:
  title = "Julia Trap"
  helpfile = "sam-help/juliatrap.htm"
  param seed
    caption = "Seed (for 'custom')"
    default = (0,0)
  endparam
  param center
    caption = "Center"
    default = (1,1)
  endparam
  param rot
    caption = "Rotation"
    default = -30.0
  endparam
  param size
    caption = "Size"
    default = 0.386750
  endparam
  param r
    caption = "Ratio Width/Heigh"
    default = 1.0
  endparam
  param @niter
    caption = "Julia Iterations"
    default = 100
  endparam
  param freq
    caption = "Trap Frequency"
    default = 0.0
  endparam
}
Fractal2.JPG
红色部分是我动过手脚比较大的部分,原代码是:
if first
      stdz = dz
      first = false
    elseif dz > stdz
      stdz = dz
    endif
这段代码如读天书,所以改成红色部分后,效果一样。红色部分是什么意思?

图片附件: Fractal2.JPG (2013-6-13 22:42, 43.58 KB) / 下载次数 1103
http://inrm3d.cn/attachment.php?aid=20203&k=95012b9c86fbcbe7b50eb3f0f56b2acd&t=1714753729&sid=UzA0k9


作者: 柳烟    时间: 2013-6-13 13:03

没考虑红色部分,用画板则得效果如下:
未命名.JPG
等势圈遮住了M集部分,图看起来不舒服。在UF中拿掉这部分代码,则与GSP一致!这段代码是什么意思?如何处理?dz中的iter,其实就是充当陷阱M集的et。

图片附件: 未命名.JPG (2013-6-13 22:46, 21.95 KB) / 下载次数 1090
http://inrm3d.cn/attachment.php?aid=20204&k=744efbd8eeb93b37cbef867158483064&t=1714753729&sid=UzA0k9


作者: xuefeiyang    时间: 2013-12-3 16:31

8# changxde


常老师,把迭代次数设为30,放大看看有没有断头现象。我在电脑上试试,次数不大时显示正常,但当次数超过30时就出现问题。
作者: xuefeiyang    时间: 2013-12-3 16:38

1# 柳烟


请柳老师把UF中的代码原样发上来,不要改过的。最好把几个曲线类的都传上来。我想原代码中应该有不同的选项吧!
作者: 柳烟    时间: 2013-12-3 18:24

原代码内含开关项,鄙人将不是帖图的开关项赐除,其余几乎没动过,结果常老师尝试,好似成功了。UF原装代码如下:
hilbert-curve {
; Kerry Mitchell 15jul2001
;
; Draws a Hilbert curve in the #z plane and colors by the
; orbit's relationship to the curve.  Only uses the last
; iterate.  Allows you to change the locations of the 4
; sub-square centers, and the point where the curve enters
; and exits the block of 4 squares.
;
init:
  float x=0.0
  float y=0.0
  float r=0.0
  float rmin=1e20
  float u=0.0
  float v=0.0
  float msb=0.0
  t=(0,0)
  int iter=0
  int nlast=0
  int n=0
  int fac3=0
  int fac4=0
  int power4=0
  zh=(0,0)
  zh0=(0,0)
;
; set up endpoints for the lines
;
  float h=@fourcorners
  float ooh=1/h
  float ooomh=1/(1-h)
  float hoomh=h/(1-h)
  z0a=@enterexit*h
  z0b=flip(@enterexit*h)
  x=real(@centerll)*h
  y=imag(@centerll)*h
  z1=x+flip(y)
  x=real(@centerul)*h
  y=imag(@centerul)*(1-h)+h
  z2=x+flip(y)
  x=real(@centerur)*(1-h)+h
  y=imag(@centerur)*(1-h)+h
  z3=x+flip(y)
  x=real(@centerlr)*(1-h)+h
  y=imag(@centerlr)*h
  z4=x+flip(y)
  z5=1+flip(@enterexit*h)
loop:
final:
  iter=0
  zh0=#z*0.25+(0.5,0.5)
  zh=zh0
  while(iter<@niter)
    iter=iter+1
    x=real(zh)
    y=imag(zh)
;
; lower left sub-square:  shrink, flip horizontally, rotate by -90 degrees
;
    if((x<h)&&(y<h))
      nlast=3
      u=ooh*y
      v=ooh*x
;
; upper left sub-square:  just shrink
;
    elseif((x<h)&&(y>=h))
      nlast=2
      u=ooh*x
      v=ooomh*y-hoomh
;
; upper right sub-square:  shrink & flip horizontally
;
    elseif((x>=h)&&(y>=h))
      nlast=1
      u=ooomh-ooomh*x
      v=ooomh*y-hoomh
;
; lower right sub-square:  shrink, rotate by 90 degrees
;
    elseif((x>=h)&&(y<h))
      nlast=4
      u=ooh*y
      v=ooomh-ooomh*x
    else
      nlast=-1
      u=x
      v=y
    endif
    zh=u+flip(v)
    msb=(msb+nlast-1)/4
    n=n*4+nlast-1
  endwhile
  if(n<0)
    #solid=true
  else
    if(@colorby==1)          ; least significant bit
      #index=n/(4^@niter)
    elseif(@colorby==2)      ; most significat bit
      #index=msb
    elseif(@colorby==3)      ; distance from initial z
      #index=cabs(zh-zh0)
    elseif(@colorby==4)      ; angle from initial z
      r=atan2(zh-zh0)/#pi
      if(r<0.0)
        r=r+2
      endif
      #index=r/2
    else                     ; distance to curve
;
; determine how to start line 0-1
;
    z0=z0a
    iter=0
    fac3=2
    fac4=1
    power4=4
    while(iter<@niter)
      iter=iter+1
      if(iter%2==1)
        if(n%power4==fac3)
          z0=z0b
        endif
      else
        if(n%power4==fac3)
          z0=z0a
        endif
      endif
      power4=4*power4
      fac4=4*fac4
      fac3=fac3+2*fac4
    endwhile
;
; line from enter to lower left sub-square
;
    t=(zh-z0)/(z1-z0)
    x=real(t)
    y=imag(t)
    if(x<0.0)
      r=sqr(x)+sqr(y)
    elseif(x>1.0)
      r=sqr(x-1.0)+sqr(y)
    else
      r=sqr(y)
    endif
    r=sqrt(r)*cabs(z1-z0)
    if(r<rmin)
      rmin=r
    endif
;
; line from lower left to upper left sub-squares
;
    t=(zh-z1)/(z2-z1)
    x=real(t)
    y=imag(t)
    if(x<0.0)
      r=sqr(x)+sqr(y)
    elseif(x>1.0)
      r=sqr(x-1.0)+sqr(y)
    else
      r=sqr(y)
    endif
    r=sqrt(r)*cabs(z2-z1)
    if(r<rmin)
      rmin=r
    endif
;
; line from upper left to upper right sub-squares
;
    t=(zh-z2)/(z3-z2)
    x=real(t)
    y=imag(t)
    if(x<0.0)
      r=sqr(x)+sqr(y)
    elseif(x>1.0)
      r=sqr(x-1.0)+sqr(y)
    else
      r=sqr(y)
    endif
    r=sqrt(r)*cabs(z3-z2)
    if(r<rmin)
      rmin=r
    endif
;
; line from upper right to lower right sub-squares
;
    t=(zh-z3)/(z4-z3)
    x=real(t)
    y=imag(t)
    if(x<0.0)
      r=sqr(x)+sqr(y)
    elseif(x>1.0)
      r=sqr(x-1.0)+sqr(y)
    else
      r=sqr(y)
    endif
    r=sqrt(r)*cabs(z4-z3)
    if(r<rmin)
      rmin=r
    endif
;
; line from lower right sub-square to exit
;
    t=(zh-z4)/(z5-z4)
    x=real(t)
    y=imag(t)
    if(x<0.0)
      r=sqr(x)+sqr(y)
    elseif(x>1.0)
      r=sqr(x-1.0)+sqr(y)
    else
      r=sqr(y)
    endif
    r=sqrt(r)*cabs(z5-z4)
    if(r<rmin)
      rmin=r
    endif
;
      #index=rmin
    endif
  endif
default:
  title="Hilbert curve"
  param centerll
    caption="lower left center"
    default=(0.5,0.5)
    hint="Center of the lower left sub-square. Make both coordinates \
    between 0 & 1; use (0.5,0.5) for standard Hilbert curve."
  endparam
  param centerul
    caption="upper left center"
    default=(0.5,0.5)
    hint="Center of the upper left sub-square. Make both coordinates \
    between 0 & 1; use (0.5,0.5) for standard Hilbert curve."
  endparam
  param centerur
    caption="upper right center"
    default=(0.5,0.5)
    hint="Center of the upper right sub-square. Make both coordinates \
    between 0 & 1; use (0.5,0.5) for standard Hilbert curve."
  endparam
  param centerlr
    caption="lower right center"
    default=(0.5,0.5)
    hint="Center of the lower right sub-square. Make both coordinates \
    between 0 & 1; use (0.5,0.5) for standard Hilbert curve."
  endparam
  param enterexit
    caption="enter/exit"
    default=0.5
    min=0.0
    max=1.0
    hint="Where the curve enters and exits the block of 4 sub-squares. \
      Between 0 & 1; use 0.5 for standard Hilbert curve."
  endparam
  param fourcorners
    caption="4 corners"
    default=0.5
    hint="Where the 4 corners meet.  Between 0 & 1; use 0.5 for standard \
      Hilbert curve."
  endparam
  param niter
    caption="iterations"
    default=0
    min=0
  endparam
  param colorby
    caption="color by"
    default=0
    enum="distance" "last = lsb" "last = msb" "distance from z" "angle from z"
  endparam
}
Fractal2.png

图片附件: Fractal2.png (2013-12-3 18:24, 15.61 KB) / 下载次数 1050
http://inrm3d.cn/attachment.php?aid=20696&k=5556c7aacfcd3fdfb69f21bda8c895b4&t=1714753729&sid=UzA0k9


作者: 柳烟    时间: 2013-12-3 18:40

另外一个闭合回路的希氏曲线,我除了赐除开关项,还删除了一些代码,所以与UF中的希氏曲线相比,少了一些效果。里面也有几个开关项。现附上原装代码:
HilbertCurve(BOTH) {
; By Samuel Monnier, 2.9.00
init:
  z = 0
  int i = 0
  int ttype = 0
  float d = -1e20
loop:
  
final:
  
  z = #z/2
  z = abs(z) - (.5,.5)
  while i < @niter
    i = i + 1
    if ttype == 0
      if real(z) < 0 && imag(z) < 0
        z = 2*z + (.5,.5)
        z = -conj(z)
      elseif real(z) > 0 && imag(z) < 0
        z = 2*z + (-.5,.5)
        z = 1i*z
      elseif real(z) > 0 && imag(z) > 0
        z = 2*z + (-.5,-.5)
        z = 1i*conj(z)
      elseif real(z) < 0 && imag(z) > 0
        z = 2*z + (.5,-.5)
        ttype = 1
      endif
    else
      if real(z) < 0 && imag(z) < 0
        z = 2*z + (.5,.5)
        z = 1i*z
        ttype = 0
      elseif real(z) > 0 && imag(z) < 0
        z = 2*z + (-.5,.5)
        z = -1i*conj(z)
        ttype = 0
      elseif real(z) > 0 && imag(z) > 0
        z = 2*z + (-.5,-.5)
        ttype = 0
      elseif real(z) < 0 && imag(z) > 0
        z = 2*z + (.5,-.5)
        z = -conj(z)
        ttype = 0
      endif
    endif  
  endwhile
  
  if @style == 0
    z = z + (1,1)
    if ttype == 0
      if abs(real(z))-1 > d
        d = abs(real(z))-1
      endif
     if abs(imag(z))-1 > d
        d = abs(imag(z))-1
      endif
    else
      d = imag(z)-1
    endif
  elseif @style == 1 || @style == 2
    if ttype == 0
      d = cabs(z+(.5,.5))-.5
    else
      if @style == 1
        d = imag(z)
      else
        d = imag(z) - (real(z)^2-.25)^2*3
      endif
    endif
  elseif @style == 3
   
    if ttype == 0
      z = z + (.5,.5)
      d = abs(real(z)) + abs(imag(z)) - .5
    else
      ;d = imag(z)-.5
      d = abs(real(z)) - imag(z) - .5
    endif
  endif
   
  #index = abs(d)^@power
  
default:
  title = "Hilbert Curve"
  helpfile = "sam-help/hilbert.htm"
  
  param style
    caption = "Style"
    default = 0
    enum = "Square" "Round I" "Round II" "Diagonal"
  endparam  
  
  param power
    caption = "Thickness"
    default = .1
  endparam
  
  param niter
    caption = "Number of Iterations"
    default = 4
  endparam
}
附上第一个开关项的图:
Fractal2.png

图片附件: Fractal2.png (2013-12-3 18:40, 47.74 KB) / 下载次数 1057
http://inrm3d.cn/attachment.php?aid=20697&k=5cc74941cc396bd5f2c761c882e6b9bd&t=1714753729&sid=UzA0k9


作者: xuefeiyang    时间: 2013-12-3 20:12

非常感谢!
作者: 柳烟    时间: 2013-12-3 21:53

24# xuefeiyang
飞扬老师太客气了。UF中的回路希氏曲线很美,但代码太长了,一看就吓住了,所以已经没有精力用画板搞出UF中的效果。一是不知能否搞出,二是即使搞出,不知猴年马月。倘使有朋友搞出来了,那将掀起一场革命。
作者: 榕坚    时间: 2013-12-4 09:06

23# 柳烟


你是怎么设置面板得到这个图的?这个UF分形不是最早完成的吗?为什么说还要做呢?弄糊涂了:http://www.inrm3d.cn/viewthread. ... ghlight=&page=7
作者: 榕坚    时间: 2013-12-4 10:56

#23楼的图放大一下就知道没什么区别,只是UF的着色问题,那些细线是多余的:

图片附件: Fractal2.jpg (2013-12-4 10:56, 42.79 KB) / 下载次数 1019
http://inrm3d.cn/attachment.php?aid=20705&k=20bae7ac80da5509cf655d90113fc3bf&t=1714753729&sid=UzA0k9


作者: 柳烟    时间: 2013-12-4 11:03

昨天我打开UF中的回路希曲线,发现与我们原来作的不一样,以为是不是解读代码有问题,刚才我又打开看了,放大一下,结果再也得不到那帖图,与我们以前作的图没啥两样。帖图中的粗细不同的线,好象成了迭代次数不同的希尔伯特曲线的堆集。
作者: 柳烟    时间: 2013-12-4 11:22

20# xuefeiyang
我此帖前面的希尔伯特曲线,迭代次数等于31时,也出现断裂现象。我又在UF中试,发现迭代次数上了31,放大后,比画板还糟糕,只见一个个模糊的正方形小框框。继续放大,结果发现也有断裂现象。
Fractal2.jpg

图片附件: Fractal2.jpg (2013-12-4 11:29, 156.7 KB) / 下载次数 1252
http://inrm3d.cn/attachment.php?aid=20706&k=276a15a7d0fa627f80a50f2e2ef4004c&t=1714753729&sid=UzA0k9


作者: xuefeiyang    时间: 2013-12-4 19:20

29# 柳烟


由此看来,那不是我们解读程序代码的问题,而是程序本身有问题。开路hilbert_curver代码提供了五种着色模式,只用前一段的迭代结果可以有四种着色方式,接下来的一段只是为了补线段,使粗细一致。我今天有事,没有做完。你发的回路那个我原来做过,对程序的解读在我的QQ空间里有详细说明。一共有六种曲线,但着色只有一种方式。我所说的着色主要是指程序提供的#index .
作者: xuefeiyang    时间: 2013-12-4 19:30

elseif @style == 3
   
    if ttype == 0
      z = z + (.5,.5)
      d = abs(real(z)) + abs(imag(z)) - .5
    else
      ;d = imag(z)-.5
      d = abs(real(z)) - imag(z) - .5
    endif
  endif
其中两个“ ;d = imag(z)-.5
      d = abs(real(z)) - imag(z) - .5
”并行,到底是用哪一个呢?这是我最初看此代码时一直不理解的地方,还以为是你误改了,看来还是程序本身就这样。
作者: 榕坚    时间: 2013-12-4 19:38

29# 柳烟


UF中很正常啊(迭代次数500):

图片附件: Fractal3.jpg (2013-12-4 19:38, 55.14 KB) / 下载次数 1175
http://inrm3d.cn/attachment.php?aid=20707&k=184fb4be98ba1c9046dddb1ad52fefc9&t=1714753729&sid=UzA0k9


作者: 柳烟    时间: 2013-12-4 19:55

32# 榕坚
迭代次数500,还是这么大的正方形,怕早就成一饼了。我迭代30,要不断放大才能看到,并出现断裂。
作者: xuefeiyang    时间: 2013-12-4 20:02

我也有同感!
作者: 榕坚    时间: 2013-12-4 20:06

33# 柳烟


迭代次数50,放大到2.5090133E13时的图形:

图片附件: Fractal4.jpg (2013-12-4 20:06, 94.02 KB) / 下载次数 1028
http://inrm3d.cn/attachment.php?aid=20708&k=726021a0ba4a864efdf147709754e991&t=1714753729&sid=UzA0k9


作者: 柳烟    时间: 2013-12-4 20:13

31# xuefeiyang
在UF中,分号后的那个d成恢色,凡是灰色的,程序运行时不用,大概是注释之类,用下面一个d.凡是灰色的,删掉,要本不影响程序运行后的图形。
作者: xuefeiyang    时间: 2013-12-4 20:13

这是常老师作的,迭代30次放大之后也出现断头现象:
未命名.jpg

图片附件: 未命名.jpg (2013-12-4 20:13, 45.79 KB) / 下载次数 1203
http://inrm3d.cn/attachment.php?aid=20709&k=9aa152d1f8f065e74f428ef4c9744ba5&t=1714753729&sid=UzA0k9


作者: 柳烟    时间: 2013-12-4 20:28

35# 榕坚
刚才我看了,这个希氏曲线,在 UF中还没发现断裂现象。#11楼的希尔伯特曲线,在UF中,迭代次数31,有断裂现象。我再去查查我的按#1代码作的GSP看是否出现断裂。文件还不知找得着不,我装机子时,误用ghost将C盘恢复到放复分形文件的F盘,结果导致大量文件泡汤,我再看看其它地方邮箱中放得有没。
幸好找着了,结果迭代30,放大后,出现断裂现象。空了查一查。好久没整分形,生疏得很了。
作者: 榕坚    时间: 2013-12-4 21:09

这些细线不要的时候又出来了,原来一直想要的时候又没有。:

图片附件: Fractal1.jpg (2013-12-4 21:09, 85.32 KB) / 下载次数 1144
http://inrm3d.cn/attachment.php?aid=20712&k=ec46140ddeb8b844381e3a274bd2ee10&t=1714753729&sid=UzA0k9


作者: 柳烟    时间: 2013-12-4 21:15

问题找着了,不是常老师的算法有问题,而是我的精简代码可能过火了。我刚才将 #1楼的代码在UF中运行,结果迭代30,放大后,发现有断头现象。而原代码则放大若干次,则没有问题。而另一种希气昂昂曲线,UF原代码运行也将出现断头,前面有帖图。我再查查是不是误精简了重要代码代码。
Fractal2.jpg

图片附件: Fractal2.jpg (2013-12-4 21:18, 119.09 KB) / 下载次数 1227
http://inrm3d.cn/attachment.php?aid=20713&k=a03e88e471510ee9451ba19f3742a00b&t=1714753729&sid=UzA0k9


作者: 柳烟    时间: 2013-12-4 21:59

1楼代码重新精简,我在UF中验证了下,没有断裂了,发在此,大家看看如何解决断裂问题。
hilbert-curve {
;
init:
  float x=0.0
  float y=0.0
  float r=0.0
  float rmin=1e20
  float u=0.0
  float v=0.0
  float msb=0.0
  t=(0,0)
  int iter=0
  int nlast=0
  int n=0
  int fac3=0
  int fac4=0
  int power4=0
  zh=(0,0)
  zh0=(0,0)

  float h=@fourcorners
  float ooh=1/h
  float ooomh=1/(1-h)
  float hoomh=h/(1-h)
  z0a=@enterexit*h
  z0b=flip(@enterexit*h)
  x=real(@centerll)*h
  y=imag(@centerll)*h
  z1=x+flip(y)
  x=real(@centerul)*h
  y=imag(@centerul)*(1-h)+h
  z2=x+flip(y)
  x=real(@centerur)*(1-h)+h
  y=imag(@centerur)*(1-h)+h
  z3=x+flip(y)
  x=real(@centerlr)*(1-h)+h
  y=imag(@centerlr)*h
  z4=x+flip(y)
  z5=1+flip(@enterexit*h)
loop:
final:
  iter=0
  zh0=#z*0.25+(0.5,0.5)
  zh=zh0
  while(iter<@niter)
    iter=iter+1
    x=real(zh)
    y=imag(zh)

    if((x<h)&&(y<h))
      nlast=3
      u=ooh*y
      v=ooh*x

    elseif((x<h)&&(y>=h))
      nlast=2
      u=ooh*x
      v=ooomh*y-hoomh

    elseif((x>=h)&&(y>=h))
      nlast=1
      u=ooomh-ooomh*x
      v=ooomh*y-hoomh

    elseif((x>=h)&&(y<h))
      nlast=4
      u=ooh*y
      v=ooomh-ooomh*x
    else
      nlast=-1
      u=x
      v=y
    endif
    zh=u+flip(v)
    msb=(msb+nlast-1)/4
    n=n*4+nlast-1
  endwhile
  if(n<0)
    #solid=true
  else

    z0=z0a
    iter=0
    fac3=2
    fac4=1
    power4=4
    while(iter<@niter)
      iter=iter+1
      if(iter%2==1)
        if(n%power4==fac3)
          z0=z0b
        endif
      else
        if(n%power4==fac3)
          z0=z0a
        endif
      endif
      power4=4*power4
      fac4=4*fac4
      fac3=fac3+2*fac4
    endwhile

    t=(zh-z0)/(z1-z0)
    x=real(t)
    y=imag(t)
    if(x<0.0)
      r=sqr(x)+sqr(y)
    elseif(x>1.0)
      r=sqr(x-1.0)+sqr(y)
    else
      r=sqr(y)
    endif
    r=sqrt(r)*cabs(z1-z0)
    if(r<rmin)
      rmin=r
    endif
;
; line from lower left to upper left sub-squares
;
    t=(zh-z1)/(z2-z1)
    x=real(t)
    y=imag(t)
    if(x<0.0)
      r=sqr(x)+sqr(y)
    elseif(x>1.0)
      r=sqr(x-1.0)+sqr(y)
    else
      r=sqr(y)
    endif
    r=sqrt(r)*cabs(z2-z1)
    if(r<rmin)
      rmin=r
    endif
;
; line from upper left to upper right sub-squares
;
    t=(zh-z2)/(z3-z2)
    x=real(t)
    y=imag(t)
    if(x<0.0)
      r=sqr(x)+sqr(y)
    elseif(x>1.0)
      r=sqr(x-1.0)+sqr(y)
    else
      r=sqr(y)
    endif
    r=sqrt(r)*cabs(z3-z2)
    if(r<rmin)
      rmin=r
    endif
;
; line from upper right to lower right sub-squares
;
    t=(zh-z3)/(z4-z3)
    x=real(t)
    y=imag(t)
    if(x<0.0)
      r=sqr(x)+sqr(y)
    elseif(x>1.0)
      r=sqr(x-1.0)+sqr(y)
    else
      r=sqr(y)
    endif
    r=sqrt(r)*cabs(z4-z3)
    if(r<rmin)
      rmin=r
    endif

    t=(zh-z4)/(z5-z4)
    x=real(t)
    y=imag(t)
    if(x<0.0)
      r=sqr(x)+sqr(y)
    elseif(x>1.0)
      r=sqr(x-1.0)+sqr(y)
    else
      r=sqr(y)
    endif
    r=sqrt(r)*cabs(z5-z4)
    if(r<rmin)
      rmin=r
    endif
;
      #index=rmin
    endif

default:
  title="Hilbert curve"
  param centerll
    caption="lower left center"
    default=(0.5,0.5)
    hint="Center of the lower left sub-square. Make both coordinates \
    between 0 & 1; use (0.5,0.5) for standard Hilbert curve."
  endparam
  param centerul
    caption="upper left center"
    default=(0.5,0.5)
    hint="Center of the upper left sub-square. Make both coordinates \
    between 0 & 1; use (0.5,0.5) for standard Hilbert curve."
  endparam
  param centerur
    caption="upper right center"
    default=(0.5,0.5)
    hint="Center of the upper right sub-square. Make both coordinates \
    between 0 & 1; use (0.5,0.5) for standard Hilbert curve."
  endparam
  param centerlr
    caption="lower right center"
    default=(0.5,0.5)
    hint="Center of the lower right sub-square. Make both coordinates \
    between 0 & 1; use (0.5,0.5) for standard Hilbert curve."
  endparam
  param enterexit
    caption="enter/exit"
    default=0.5
    min=0.0
    max=1.0
    hint="Where the curve enters and exits the block of 4 sub-squares. \
      Between 0 & 1; use 0.5 for standard Hilbert curve."
  endparam
  param fourcorners
    caption="4 corners"
    default=0.5
    hint="Where the 4 corners meet.  Between 0 & 1; use 0.5 for standard \
      Hilbert curve."
  endparam
  param niter
    caption="iterations"
    default=0
    min=0
  endparam

}
作者: 榕坚    时间: 2013-12-4 21:59

UF中有断头的是哪一个,我怎么没有发现?
作者: 柳烟    时间: 2013-12-4 22:05

42# 榕坚
你在UF中查找名为Hilbert spline 2的ucl文件,就可查到。
作者: 柳烟    时间: 2013-12-4 22:20

刚才我将41的代码与1楼代码对照了一下,居然完全不谋而合,我又重新在UF中验证了代码,不会出现断裂。说明问题出在GSP文件上,大家攻坚克难,看看能否搞出正宗的GSP文件。
作者: 柳烟    时间: 2013-12-4 22:30

问题进一步找着了,我把常老师GSP文件中的他修改后的代码,拿到UF中验证,结果发现如飞扬老师所说迭代30时,出现断裂现象。他文件中的代码是:
hilbert-curve0 {
; 简化
init:
  float x=0.0
  float y=0.0
  float r=0.0
  float rmin=1e20
  float u=0.0
  float v=0.0
  float msb=0.0
  t=(0,0)
  int iter=0
  int nlast=0
  int n=0
  int fac3=0
  int fac4=0
  int power4=0
  zh=(0,0)
  zh0=(0,0)
;
  float h=.5
  float ooh=2
  float ooomh=2
  float hoomh=1
  z0a=.25
  z0b=.25i
  z1=.25+.25i
  z2=.25+.75i
  z3=.75+.75i
  z4=.75+.25i
  z5=1+.25i
loop:
final:
  iter=0
  zh0=#z+(0.5,0.5)
  zh=zh0
  while(iter<@niter)
    iter=iter+1
    x=real(zh)
    y=imag(zh)
;
    if((x<h)&&(y<h))
      nlast=3
      u=ooh*y
      v=ooh*x
;
    elseif((x<h)&&(y>=h))
      nlast=2
      u=ooh*x
      v=ooomh*y-hoomh
;
    elseif((x>=h)&&(y>=h))
      nlast=1
      u=ooomh-ooomh*x
      v=ooomh*y-hoomh
;
    elseif((x>=h)&&(y<h))
      nlast=4
      u=ooh*y
      v=ooomh-ooomh*x
    ;else
      ;nlast=-1
      ;u=x
     ; v=y
    endif
   
    zh=u+flip(v)
   ; msb=(msb+nlast-1)/4
    n=n*4+nlast-1

  endwhile
(此处缺了两行代码if(n<0)
    #solid=true
  else)

    z0=z0a
    iter=0
    fac3=2
    fac4=1
    power4=4
   
   while(iter<@niter)
      iter=iter+1
      if(iter%2==1)
        if(n%power4==fac3)
          z0=z0b
        endif
      else
        if(n%power4==fac3)
          z0=z0a
        endif
      endif
     
      power4=4*power4
      fac4=4*fac4
      fac3=fac3+2*fac4
    endwhile
;
    t=(zh-z0)/(z1-z0)
    x=real(t)
    y=imag(t)
    if(x<0.0)
      r=sqr(x)+sqr(y)
    elseif(x>1.0)
      r=sqr(x-1.0)+sqr(y)
    else
      r=sqr(y)
    endif
    r=sqrt(r)*cabs(z1-z0)
    if(r<rmin)
      rmin=r
    endif
;
    t=(zh-z1)/(z2-z1)
    x=real(t)
    y=imag(t)
    if(x<0.0)
      r=sqr(x)+sqr(y)
    elseif(x>1.0)
      r=sqr(x-1.0)+sqr(y)
    else
      r=sqr(y)
    endif
    r=sqrt(r)*cabs(z2-z1)
    if(r<rmin)
      rmin=r
    endif
;
    t=(zh-z2)/(z3-z2)
    x=real(t)
    y=imag(t)
    if(x<0.0)
      r=sqr(x)+sqr(y)
    elseif(x>1.0)
      r=sqr(x-1.0)+sqr(y)
    else
      r=sqr(y)
    endif
    r=sqrt(r)*cabs(z3-z2)
    if(r<rmin)
      rmin=r
    endif
;
    t=(zh-z3)/(z4-z3)
    x=real(t)
    y=imag(t)
    if(x<0.0)
      r=sqr(x)+sqr(y)
    elseif(x>1.0)
      r=sqr(x-1.0)+sqr(y)
    else
      r=sqr(y)
    endif
    r=sqrt(r)*cabs(z4-z3)
    if(r<rmin)
      rmin=r
    endif
;
    t=(zh-z4)/(z5-z4)
    x=real(t)
    y=imag(t)
    if(x<0.0)
      r=sqr(x)+sqr(y)
    elseif(x>1.0)
      r=sqr(x-1.0)+sqr(y)
    else
      r=sqr(y)
    endif
    r=sqrt(r)*cabs(z5-z4)
    if(r<rmin)
      rmin=r
    endif
      #index=rmin
endif
default:
  title="Hilbert curve简化"
  param niter
    caption="iterations"
    default=0
    min=0
  endparam
}
对照1楼代码,发现第一红色处,应为zh0=0.25#z+(0.5,0.5),另第二红色处的判断不能少。这两处是导致希氏曲线断裂的重要原因。
而1楼的代码没问题,我只是将原装代码的作色开关项拿掉,其余没动过。
作者: xuefeiyang    时间: 2013-12-4 23:04

39# 榕坚
1.jpg

图片附件: 1.jpg (2013-12-4 23:04, 63.16 KB) / 下载次数 8455
http://inrm3d.cn/attachment.php?aid=20714&k=7d3406419af695ea9608ed003320ab8e&t=1714753729&sid=UzA0k9


作者: 柳烟    时间: 2013-12-4 23:45

45楼常老师文件中的代码,补上红色部分后,拿到UF中去验证,再没有出现断裂。明天看有无时间,如果有,再做做这个开口希尔伯特曲线。太累了。
作者: 柳烟    时间: 2013-12-5 20:26

今天尝试补断头,徒劳无功。常老师文件,觉得没啥问题,不知是不是GSP软件存在bug?
作者: 榕坚    时间: 2013-12-6 10:50

怎么弄出这怪模样来:

图片附件: 捕获.JPG (2013-12-6 10:50, 75.36 KB) / 下载次数 1098
http://inrm3d.cn/attachment.php?aid=20721&k=89252f836d212f6ae3724024d0866d35&t=1714753729&sid=UzA0k9


作者: 柳烟    时间: 2013-12-6 14:50

if(n<0)
    #solid=true
  else
这几行,不要,在UF中放大到28左右,有断头现象,加上后,放大若干,曲线连续。看来,在GSP中,断头是补不上了。
作者: 榕坚    时间: 2013-12-6 20:59

与代码if(n<0)
    #solid=true
  else

没有关系,而是几何画板的精度关系,这种算法中有个参数n的数值当迭代次数增大时数值很大,此时求余数就会有误差从而导致着色错位。
作者: changxde    时间: 2013-12-6 21:06

49# 榕坚
UF程序中color by:distance from z 时就是你那个图片

我试了试,在UF中迭代16次就不正常了。
sshot-3.png

图片附件: sshot-3.png (2013-12-20 20:34, 54.46 KB) / 下载次数 922
http://inrm3d.cn/attachment.php?aid=20792&k=502a55976f9d0f8c9a061bf744859bcd&t=1714753729&sid=UzA0k9


作者: 榕坚    时间: 2013-12-6 21:34

那可能就是出现纯色的情况。
作者: 榕坚    时间: 2013-12-7 07:58

这个也挺有意思:

图片附件: 捕获.JPG (2013-12-7 07:58, 50.86 KB) / 下载次数 909
http://inrm3d.cn/attachment.php?aid=20722&k=637c01c0ad5e32f0654b95e49cbf415a&t=1714753729&sid=UzA0k9



图片附件: 捕获1.JPG (2013-12-7 07:58, 97.27 KB) / 下载次数 881
http://inrm3d.cn/attachment.php?aid=20723&k=0f3154fece914fa5793207795a4496c7&t=1714753729&sid=UzA0k9






欢迎光临 inRm3D: 画板论坛 (http://inrm3d.cn/) Powered by Discuz! 7.0.0