问题进一步找着了,我把常老师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楼的代码没问题,我只是将原装代码的作色开关项拿掉,其余没动过。 |