返回列表 回复 发帖
1# 柳烟


请柳老师把UF中的代码原样发上来,不要改过的。最好把几个曲线类的都传上来。我想原代码中应该有不同的选项吧!
原代码内含开关项,鄙人将不是帖图的开关项赐除,其余几乎没动过,结果常老师尝试,好似成功了。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
另外一个闭合回路的希氏曲线,我除了赐除开关项,还删除了一些代码,所以与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
非常感谢!
24# xuefeiyang
飞扬老师太客气了。UF中的回路希氏曲线很美,但代码太长了,一看就吓住了,所以已经没有精力用画板搞出UF中的效果。一是不知能否搞出,二是即使搞出,不知猴年马月。倘使有朋友搞出来了,那将掀起一场革命。
23# 柳烟


你是怎么设置面板得到这个图的?这个UF分形不是最早完成的吗?为什么说还要做呢?弄糊涂了:http://www.inrm3d.cn/viewthread. ... ghlight=&page=7
#23楼的图放大一下就知道没什么区别,只是UF的着色问题,那些细线是多余的:

Fractal2.jpg (42.79 KB)

Fractal2.jpg

昨天我打开UF中的回路希曲线,发现与我们原来作的不一样,以为是不是解读代码有问题,刚才我又打开看了,放大一下,结果再也得不到那帖图,与我们以前作的图没啥两样。帖图中的粗细不同的线,好象成了迭代次数不同的希尔伯特曲线的堆集。
20# xuefeiyang
我此帖前面的希尔伯特曲线,迭代次数等于31时,也出现断裂现象。我又在UF中试,发现迭代次数上了31,放大后,比画板还糟糕,只见一个个模糊的正方形小框框。继续放大,结果发现也有断裂现象。
Fractal2.jpg
29# 柳烟


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