返回列表 回复 发帖
24# xuefeiyang
飞扬老师太客气了。UF中的回路希氏曲线很美,但代码太长了,一看就吓住了,所以已经没有精力用画板搞出UF中的效果。一是不知能否搞出,二是即使搞出,不知猴年马月。倘使有朋友搞出来了,那将掀起一场革命。
昨天我打开UF中的回路希曲线,发现与我们原来作的不一样,以为是不是解读代码有问题,刚才我又打开看了,放大一下,结果再也得不到那帖图,与我们以前作的图没啥两样。帖图中的粗细不同的线,好象成了迭代次数不同的希尔伯特曲线的堆集。
20# xuefeiyang
我此帖前面的希尔伯特曲线,迭代次数等于31时,也出现断裂现象。我又在UF中试,发现迭代次数上了31,放大后,比画板还糟糕,只见一个个模糊的正方形小框框。继续放大,结果发现也有断裂现象。
Fractal2.jpg
32# 榕坚
迭代次数500,还是这么大的正方形,怕早就成一饼了。我迭代30,要不断放大才能看到,并出现断裂。
31# xuefeiyang
在UF中,分号后的那个d成恢色,凡是灰色的,程序运行时不用,大概是注释之类,用下面一个d.凡是灰色的,删掉,要本不影响程序运行后的图形。
35# 榕坚
刚才我看了,这个希氏曲线,在 UF中还没发现断裂现象。#11楼的希尔伯特曲线,在UF中,迭代次数31,有断裂现象。我再去查查我的按#1代码作的GSP看是否出现断裂。文件还不知找得着不,我装机子时,误用ghost将C盘恢复到放复分形文件的F盘,结果导致大量文件泡汤,我再看看其它地方邮箱中放得有没。
幸好找着了,结果迭代30,放大后,出现断裂现象。空了查一查。好久没整分形,生疏得很了。
问题找着了,不是常老师的算法有问题,而是我的精简代码可能过火了。我刚才将 #1楼的代码在UF中运行,结果迭代30,放大后,发现有断头现象。而原代码则放大若干次,则没有问题。而另一种希气昂昂曲线,UF原代码运行也将出现断头,前面有帖图。我再查查是不是误精简了重要代码代码。
Fractal2.jpg
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

}
42# 榕坚
你在UF中查找名为Hilbert spline 2的ucl文件,就可查到。
刚才我将41的代码与1楼代码对照了一下,居然完全不谋而合,我又重新在UF中验证了代码,不会出现断裂。说明问题出在GSP文件上,大家攻坚克难,看看能否搞出正宗的GSP文件。
返回列表