返回列表 回复 发帖
一。原理篇
为了让板友能够更好的理解我的想法,我就从最基本的数学概念说起,本来这是多余的。
1.分段函数有简单函数的概念
  分段函数大家都比较熟悉。
例子:当x>1 时,f(x)=x^2;当x<2时,f(x)=x-1 .这种函数就是分段函数。
  简单函数是实变函数里面广泛使用的一类函数,它是类似于分段函数的一种函数。
例子:设E是一个区域,E1,E2,E3是对区域E的一个划分,这个划分满足条件:E1,E2,E3两两不交,且其并集等于E。定义函数f(x)(这里的自变量x,可以数轴上的点,也可以是平面上的坐标,乃至高维空间中的点的坐标),规定如下:当x∈E1时,f(x)=a1,当x∈E2时,f(x)=a2,当x∈E3时,
f(x)=a3.(a1,a2,a3为常量),这样定义的f(x)就是简单函数,所以简单函数更像我们平时见到的阶梯函数。
2.微分的概念
  设w=f(z)是一复变函数,定义Δz=z-z0叫自变量的增量,类似的定义Δw=f(z)-f(z0)叫函数的增量,函数的增量也可以写成Δw=f(z+Δz)-f(z)。我们把比值Δw/Δz叫做差商。
当Δz→0时,Δw/Δz→α,把这个极限值叫做函数w在点z0处的导数,记成f'(z0).
同时我们要把Δw,Δz在叫做函数的微分,和自变量的微分,习惯记成dw,dz。
3.解析函数的概念
设w=f(z0),如果函数w在z0出有导数,就数函数在z0出可导,如果是实函数,在某点处可导和在某点附近可导是一样的,但是复变函数不是这样的的,一个复变函数在点z0出可导,但是在z0的附近的小小的圆邻域内不一定可导(这只要有复变函数的柯西条件Chauchy就很容易举出反例来,本处勉)。
所以复变函数给出了:在z0附近可导的函数叫解析函数。如果f(z)=z^m+c就是解析函数。复变函数主要就是研究解析函数的性质。
4.微分中值定理
微分中值定理是Taylor展开式的特例。复的函数和实的函数都是一样的结够。其实复变函数研究的展开式主要是罗朗展示,它是正幂级数和负幂级数合在一起的一个种级数,复变函数的极点,留数的计算就要靠罗朗展示,这几句话说远了,还是回到正题来。
微分中值定理:设w=f(z)在点z0出解析(即在z0为中心的圆邻域D上处处可导),则
f(z)-f(z0)=f'(u)(z-z0),其中u是位于z和z0连线上的一个复数。u也常常写成u=z0+t*Δz
(0≤t≤1),或写成u=t*z0+(1-t)*z.
微分中值定理的应用:每一个解析函数w=f(z)都可以在以z0为中心的圆邻域D内展开:f(z)=f(z0)+f'(z0)Δz+o(|Δz|).
记号o(|Δz|)表示比|Δz|高阶的无穷小量,就是当Δz→0时,o(|Δz|)→0.这说明档|Δz|很小时,
可以有f(z)≈f(z0)+f'(z0)Δz。
把微分离散化就是差分,这里从约,因为我发现直接用中值定理就可以导出我想要的结论来。
5。Julia集合中的势的概念
   首先,谈复函数的等势线(ct线~contour line)的概念:如果w=f(z)为一复函数,
令|w|=r,这时点z的轨迹就叫函数w的ct线。其实复变函数的ct线,就是它对应的实函数|f(z)|的ct
线,此时的值r叫做势(势值potential),显然在同一条等式线上势是相等的,这叫等势值(euipotential这点几何法叫做et)。
   其次,谈谈Julia集合的中的等式线的概念:
  设f(z)=z^2+c,c=c1+c2*i,迭代:z0=f^0(z0)(这是为了方便做的一个记号规定),
  z1=f(z0),z2=f(z1)=f(f(z0))=f^2(z0),z3=f(f(z2))=f^3(z0),...,z[n+1]=f^n(z0)
   通过迭代得到一个复序列{zn}.
   显然递推关系是:z[n+1]=f(z[n])=f^(n+1)(z0)
   当点zn位于半径为2的园内时,我们认为初始点z0∈J集合。如果经n次迭代后点zn跑到了半径为2
  外,我们就认为初始点z0∉J集合。我们要做的就是对zn没有跑出半径为2的圆时,对它所对应的初始点z0着色。
  概念:zn=f^n(z0)它是以z0为自变量的一个函数,称实函数|f^n(z0)|的ct线就Julia集合的等势线。相应的势值显然就是zn的模,即|zn|=sqrt(xn^2+yn^2).
  如果绘制J集合就会发现J集合的等式线会划分出许多类似于圆环的图形,在每一个类似圆环的形状内,势|zn|保持不变,但初始点从一个类圆环跨到下一个类圆环上时,势|zn|跳跃成另一个值。
假设绘制J集合时类圆环就3个(其实远远不只这么几个,这里是假设),不妨设这三个类圆环为E1,
E2,E3.则势|zn|就够成了一个如下的简单函数:
当z0∈E1时,|zn|=r1,当z0∈E2时,|zn|=r2,当z0∈E3时,|zn|=r3.
真实的情况是这个简单函数原比这个假如复杂的多,阶数也要多的多。总之势构成了一个函数:
|zn|=φ(z)它不是我们理解的阶梯函数,它是一个数学上是简单函数(数学专用概念)。正是势是一个简单函数,所以直接用势着色,J集合就会出现一个个类似圆环是色块,我们叫它们为等势圈,因为在每一个圈内势不变。那么有什么办法作出等势线呢?
特别注意:数列zn叫函数列,它带有参数z。
6.势差的概念
概念定义:设复函数w=f(z)的等式线为ct1,ct2,它们对应的势分别为r1,r2,称|r1-r2|为势差。
(potential derference).
把这个概念应用到J集合的迭代上:关于J集合的势差的计算有多个角度计算,比如计算前后两项的势差,|z[n]- z[n+1]|就是比较常见的一种(其实是势差的近似算法,下类似)。不过这里要介绍的是另外一种计算J集合势差的办法:首先取两个点z,z‘ 作为迭代的初始点,z出发迭代n次的终点为zn,z‘出发迭代m次的终点为zm’
终点的势差为|zn-zm'|,特别注意这个势差是函数列,或明显的写成:|zn-zm'|=φ(n,m,z,z'),它有4个变量。通常可以取n=m,即两个初始点的迭代次数相同。
那么这个势差函数有什么性质呢?
以下我们假定n=m,并且z和z'充分接近,即认为|z-z'|接近于0.由于f^n(z)为一解析函数,当然是连续函数,又由于我们是在一个闭合的圆盘内讨论,圆盘是一个有界的闭集和,关于闭集上的连续函数有着样一个重要的定理:闭集上的连续和一致连续等价.
什么是一致连续:就是说z和z'是两个动点,当z和z'充分接近时,对应的函数值也充分接近。
连续的概念要弱一点:连续的定义要求z和z‘中必须有一个是固定的点。一致连续是函数的整体性质,连续是局部性质。
正是由于f^n(z)是一致连续的,所以f^n(z)-f^(n)(z')也是一致连续的,从而势差|f^n(z)-f^(n)(z')|
也是一致连续的。一致连续很重要,它保证了|z-z'|→0时,  |fn(z)-f^(n)(z')|→0.
所以当z和z‘ 充分接近时,点zn和zn’  必然位于同一个J集合的等势环内。这时的势差基本就是0.
当z或者z‘有一个点位于两个相邻的等势环的交界线上时,势差就会变成非0的值,由此可以看到,
势差具有跳跃性,只有在相邻的等势圈的交界上它才非0.势差函数构成了一个类似于简单函数的函数。
由势差的性质决定了用势差上色会高亮(high light相邻的等势圈的交界处。而且上色后对交界进行足部放大一定是色彩不完全一样。尽管我没有去放大过。但是理论告诉是这样的。
7.Julia集合中一种势差的估计
计算势差站的角度不同,可以计算出各种各样的势差。这里用计算的是上楼提到的势差:
记Δzn=zn’-zn,并假定z和z‘充分接近。
Δz[n+1]=φ(n,z,z‘)=z[n+1]'-z[n+1]=f(zn‘)-f(zn).
因为f(z)是解析的,所以微分中值定理成立,即有
Δz[n+1]=φ(n,z,z‘)=f'(u)(zn’-zn)=f'(u)Δzn(u是zn和zn’连线上的一点)
所以势差函数为:|Δz[n+1]|=|f'(u)|*|zn’-zn|=|f'(u)|*|Δzn|,
u的处理有三种方式:
方式1:u=zn‘+αΔzn(0≤α≤1)
方式2:u≈zn。
为了应用的方便,我选用了方式2.这样就得到了势差函数的估计式::|Δz[n+1]|≈|f'(zn)|*|Δzn|,
这个估计式适合的不仅仅是Julia集合。对一切解析函数都是对的。
但是对于J集合,由于f(z)=z^b+c,故其导数f’(z)=b*z^(b-1),从而势差的估计式为:
|Δz[n+1]|≈b*|zn^(b-1)|*|Δzn|,通常的J集合合中的b=2.
下一步就是要在画板中通过双点迭代实现势差(potential deference~PD)着色。

二。实战篇

8.画板中的双点迭代
双点迭代就是从2个初始点开始迭代,但是这两个初始点不能同时迭代,否则画板不堪负重。
我们应该采用分次迭代,迭代完成后采用取代的办法,这样就可以把那些不需要的点抛掉,尽可能的
让不需要的迭代的点不去参加迭代。我前面做了个显示各种J集合的工具,我体会到当迭代的点的总数
到达万级时,速度就很吃力了。所以双点迭代的关键是让不需要迭代的点不要迭代。做法如下:
设f(z)=z^2+c,c=c1+c2*i,迭代的初始点为z ,z‘,
A---以z=x+yi为初始点迭代:
第一步:在坐标平面内描点A(x,y)
第二步,从z开始迭代,迭代次数为n:z,z1,z2,,...,zn.
记迭代终点zn的为An(xn,yn)。
其中对应规则为 x→x^2-y^2+c1,y→2xy+c2
B---以z’=x'+y'*i为初始点迭代,迭代次数为m:
第一步:在坐标平面内描点A'(x',y')
第二步,从z'开始迭代,:z',z1',z2',,...,zm'.
其中对应规则为:x‘→x’^2-y‘^2+c1,y’→2x‘y’+c2。
记迭代终点为An‘(xn’,yn‘)。
这是两次独立的迭代,所以不会有不该迭代的点参加迭代。
接下来就是要进行取代,
我们要求z和z’充分接近,故引入一个参数h=h1+h2*i,|h|为无穷小量。
令z‘=z+h,则x’=x+h1,y‘=y+h2.、
所以,我们在第二次跌代完成后,把x’,y‘按上面的式子取代就可以了。m也可以用n取代。
但是我觉得留下m参数观察n,m取不同的的着色效果是不错的选择。如n-m≠0时会得到另类的J集合图象。
h参数控制了J集合的相邻的两个等势圈的交界线的粗细。如h=0.1,0.01,0.001.0.0001会得到精度
不同的图形。
最后是用势差上色。
记变量dr=|Δz[n+1]|=|z[n+1]'-z[n+1]|≈2|zn|*|Δzn|,其中
2|zn|=2sqrt(xn^2+yn^2);
|Δzn|=sqrt((x'n-xn)^2+(yn'-yn)^2).
记R=r*|sin(π*dr/T)|,G=g*|sin(π*dr/T)|,B=b*|sin(π*dr/T)|.
r:g:b控制色相(就是红的,还是粉色的意思)。
用R,G,B对点A上色,得点A",构建x对点A"的轨迹,选中轨迹按下ctrl+T,就会追踪这个轨迹。
最后运动参数Y,就会扫描出J集合的等势线CT(contour line)。
说明:ct线的粗细由两个因素控制 ,这从理论部分不难看出
1.h参数。2。初象z和z’的接近度,它们的接近度等价于zn和zn‘的接近度(一致连续的原因)
,这又归结到迭代次数n和m的接近度。
3.n-m≠0时,|zn-zm|会出现明显的差距,J集合的图形很另类。或者说将得到一张粗放形的等势线逼近J集合的图。
高亮只是单点迭代,算法与这里类似,ct线要用双点迭代。ct线要求内存比较高。迭代次数不必取的过高,因为,迭代到一定的次数点就稳定了,在迭代下去没多大的意义,只会耗内存。迭代到一定的次数稳定后,就zn的点的轨道可以看到极限圈,差不多就算稳定了。这时减慢扫描速度,提高扫描线数是可取的方法。
简单的总结:J集合进行双点迭代时,势与势差的关系为Δz[n+1]/Δz[n]≈f"(zn)=2|zn|,
势差(PD)是一个非常有用的量,利用同一个点列的前后项的PD差,可以创建月球表面的那种J集合图,利用同一个点列的PD之比可以创建另一种风格的J集合图。作J集合离不开距离,对距离的变形使用是上色的关键。势差~近似,就是这篇文章的关键词。
------这个方法叫势差法(potential deference--PD method)是比较合理的-------------完END.
  补充说明:今天早上起来,感觉理论上还得补充一点点才完备:
||zn|-|z'n||这才是势差,为什么把|zn-zn‘|当势差呢?因为:
||zn|-|z'n||≤|zn-zn‘|→0(|z-z’|→0).
这说明|zn-zn‘|是准确的势差||zn|-|z'n||的很好的近似。






这个文件完整的包括了代数法的基本构架。双点迭代用7b-fractal tool包中的工具Julia set'重复使用两次就可以构建这种迭代。

PD法(势差法)范例.gsp (13.37 KB)

把双点迭代改成单点迭代,放大局部后。。。
关于Δz[n+1]/Δz[n]的一个命题证明:
设f(z)=z^α+c,,z,z'为任意两复数,对z迭代:z,z1=f(z),z2=f(z1)=f^2(z),...,
zn=f(z[n-1])=f^n(z),对z‘作类似的迭代,规定Δz[n]= Δzn’-Δzn,
则Δz[n+1]/Δz[n]=(f(zn')-f(zn))/(zn'-zn)=f'(zn+t*Δzn)(0≤t≤1),
设f‘(z)的不动点为u,即α*z^(α-1)=z的根为u,如果点列{zn}收敛,则n→∞时,
f'(zn+t*Δzn)→f'(u).从而有:
n→∞时,Δz[n+1]/Δz[n]→f’(u)。
特别的:||zn‘|-|zn||为势差,而:||zn‘|-|zn||≤|zn’-zn|→0(|z-z‘|→0),
所以|Δzn|=|zn’-zn|可以作为势差(PD)的估计。
另f=z^2+c时,f’的不动点u=0,此时Δz[n+1]/Δz[n]=z[n+1]/z[n]→f’(u)=0(n→∞)。
从而|Δz[n+1]/Δz[n]|→0(n→∞),这说明当迭代次数充分大后,Δz[n+1]/Δz[n]比是压缩的。
因此可以直接用这个比值上色。
Δz[n+1]/Δz[n]这个比值也可以这么写:
Δz[n+1]/Δz[n]={z[n+1]'-z[n+1]}/{z[n]'-z[n]}
={f(z[n]')-f(z[n])}/{f(z[n-1]')-f(z[n-1])}
有的学者把这个叫距离之比DR. 这里的数列不是普通的数列,它们是函数列。
其实根本就是势差分析,做势差分析是可以用Taylor展示,展到前三项,这样接近度更好
,还可以用三角级数(做为F级数的替代品)展开势差

我使用的调色版~~类中类的架构

一。调色板构建
1.r,g,b的混合比确定色相,如r:g:b=1:0:0=红色,r:g:b=1:1:0=绿色等等。
2.再引入一个参数F,这rF,gF,bF的比值还是等于r:g:b,当引入F后,就可以改变同种颜色的明度。
比如r:g:h=1:1:0=绿,由于F的引入,就可以改变绿色的明度。随着F的值的变化,颜色始终在绿色系列里面变化。
这个F=|φ(zn)|。
3.如果令rF1,gF2,bF3去对应R,G,B,由于这是F1,F2,F3是三个不同的参数,此时r:g:b就确定不了色相了。此时难有规律可言,靠运气上色了。
4.确定参数F的取法,是值得关心的问题。
F常常可以取dist=sqrt(xn^2+yn^2),sin(dist),arctan(yn/xn),|zn|*|Δzn|(这个量叫PD),
arctan(yn-y[n+1])/(xn-x[n+1]),由于颜色面板的色宽设置成了【0,1】,所以上面那些值通常都要去绝对值。如果作图的人保密,看的人是难以猜出别人是怎么上色的。
5.令Δz[n]=z[n+1]-z[n]与势差相关,z[n]有势相关,它们的模和幅角都可以做为上色的参数,这就是上面的两个正切的来源。
  在同一个色相里面变化颜色,颜色的调子是比较统一的,但是有缺点就是显得比较单一,这并不是坏事。
6。对F的构建还可以这样
  上面的上色方式,可以统一的用公式表示为X=t*F(Zn)。X对应标准色带一个位置,还可以像这样构建F:F+α(Zn)就是给F加上一个小小的修正值。
  R=r*(F(Zn)+α(Zn))
   G=g*(F(Zn)+α(Zn))
    B=b*(F(Zn)+α(Zn))
参数α(Zn)∈[0,1],α只要有点点细微的变化就可以实现跨越色相,实现一种眼花缭乱的颜色变化。跨越色相要有个度,色相多了就是乱。α可以取成周期函数,这样跨越色相就是周期性的过程了。从而达到了控制色相总量的目的,色相少了单调,多了就是乱,周期函数刚好可以解决这个度的问题。这就是为什么要用对平移因子通常使用周期函数的原因所在。构建F还可以引入trunc函数,把色的明度分成几大类,就象这样:设dist=sqrt(x^2+y2),如果把色的明度设置成10个等级,就可以这样算trucn{[dist/10-trucn(dist/10)]*10}(这个算式与画板你设置的精度有关,要做相应的修改)。下面的彩图就是这么做出来的,实验上色的明度等级不能太多,多了效果也显示不出来。另外,上色还得要注意值域是否超过主值区间,因为进入常色区间后色彩就没变化了。不注意这点就会发现实验结果和这里所说有的内容不吻合。
二。调色板的构建有很多,但是万变不离其中,要么在同一个色相里面变化颜色,要么就是从一个色相跨越到另一个色相。构建调色板,必须坚持原则:拒绝运气色!原因很简单,如果你构建的调色板是靠的运气色上色,这样的调色板你根本就没法控制它,最终导致调色困难重重,或根本就无法调试色彩。
三。关于HSV的调色板
   色彩学有公式实现:rgb颜色与hsv颜色参数的转换,这就是说只要构建了RGB的调色板,这个调色板同样可以用来完成HSV的上色。既然RGB和HSV的参数色彩学上有公式联系他们,这就是说这两种上色可以认为并无本质的差别,只是RGB更电脑化一点,HSV更接近于生活一点。
四。我就是这样使用调色板的,我不知道别人是怎么使用调色板的。
五。我特别希望玩分形的人多说点自己的看法,错了不要紧,反正都是玩,错了改过来就行了。我就是这么想的,如果我发现我今天写错了,改天我就会订正。科学的东西就是这样在不断的订正错误中前进。没有错误和失败,永远都不会有创造。分形从认真专研到现在半过多月了,我感到分形的关键是算法。
到目前为此:代数法的逃逸时间esct还只是用来挖环,我还没发现esct的特别的用法。也许时候未到。
六。简单的小结
  说了这么多,我的调色板可以用一个公式总结成:X=a*(F+b),其中因子a*F控制同一个色相内的变化,平移因子a*b控制跨越色相的变化,b的控制是比较难的。我理解我的上色方法是r,g,b之比确定类(色相),而F确定同类中的各种颜色(同类中的各种颜色可以用trunc函数划分等级生成跳跃上色)。一句话:类中类的架构。
我只给出了我的方法,没有给出具体的算式,因为分形这个场景会给人无限的想象和发挥的空间,用创建调色板的原则去创建自己的调色板,那才好玩,分形才会显得个性张扬,多姿多彩。
  
  

注:上面的彩图是单参数上色。

震荡域控制演示




付:着色公式的构架为a*F,这种思路来自于逃逸算法的逃逸域。震荡控制技术是通过控制扫描点的轨迹来控制色彩的。中间的布尔运算是关键:boolean=sgn(sgn(a)+1),其次三角函数的周期不能太大,太大了震荡不起来。
可以把震荡嵌入到其它分形中,也可以把控制震荡的技术抽取出来单独控制其它分形。



震荡域1.gsp (7.48 KB)

震荡域2.gsp (7.67 KB)

震荡域3.gsp (7.67 KB)

震荡域4.gsp (8.67 KB)

借用控制震荡域的方法,选择性显示J集合的图形.gsp (36.58 KB)

震荡域叠加模拟3D~~域叠加法引入光照因子





上图未加入震荡因子,光照是比较均匀的。

上图在三个域内各加了一个震荡因子,和上一图比照光照就比较明显集中。
这么看来利用震荡域,模拟光照,可以创建立体图形。只是应该把震荡中心放在域外,如果把震荡中心放大域中,就会出现震荡洞。上面的最后两图,设置了3个域。域的中心是第一幅图的那三个位于极限圈的亮绿色的点。在下面的文件里面可以看到。
1.具体做法是:先分别进行单参数上色对R,G,B分别上色,调式好后删除
2.叠加它们 即有,DR=R+G+B,接着进行三参数R,G,B上色,稍调试就得上面的图。
重新令R=r*DR,G=g*DR,B=b*DR,我的调色板,我都写在上楼的,按上楼的调色板做就可以出来。
3.调试好后分别对单参数R,G,B加入震荡因子,这样就可以创建有光照的3D图形。
4.如果不进行域叠加,直接用R,G,B上色,颜色的种类到是多,得到的是另一种有立体感的图。
5.中间用到了逻辑变量。黑色是逻辑变量控制的结果,我还是没有找到逃逸时间esct的用武之地。时候也许还未到。震荡中心总是可以取到域外的,而且震荡中心的位置可以认为的定,它就是光源的中心。
每个域的半径用点来控制,以便调试半径的大小。域的中心选在极限圈上效果最好,因为J集合要显示的是收敛点的图,如果中心不再极限圈上,就会出现嘿嘿的一遍。震荡的用处还马虎,可以用。
另外还可以进一步设置光照半径。

三域叠加.gsp (14.9 KB)

返回列表