MC做分形时,程序模块化的初探
mathcad吧
全部回复
仅看楼主
level 13
LNSZDZG 楼主
在画板论坛里学习了xklppp老师的《几何画板下的编程思考:javascript》,感触颇深,不敢独享,(没征求xklppp老师的意见)先发在这里。
UF代码:
Julia && Mandelbrot {
;这是根据xklppp老师的程序写的一个综合程序
; javascript 程序可以参考如下网页
; http://www.inrm3d.cn/viewthread.php?tid=4831&extra=page%3D1
init:
; 程序初始化
complex z = #pixel
complex c = @seed
; 分形类型选择
if @type==1
z = @start
c = #pixel
endif
;变换模块1 "c" "1/c" "c-1/c" "c+1/c" "c^2" "1/c^2" "c-1/c^2" "c+1/c^2" "√c" "1/√c" "c-1/√c" "c+1/√c"
if @tran==1
c = 1/c
elseif @tran==2
c = c-1/c
elseif @tran==3
c = c+1/c
elseif @tran==4
c = c*c
elseif @tran==5
c = 1/c^2
elseif @tran==6
c = c-1/c^2
elseif @tran==7
c = c+1/c^2
elseif @tran==8
c = sqrt(c)
elseif @tran==9
c = 1/sqrt(c)
elseif @tran==10
c =c-1/sqrt(c)
elseif @tran==11
c = c+1/sqrt(c)
elseif @tran==12
c = log(c^3)/3
endif
;变换模块2
if @tran2==1
z = 1/z
elseif @tran2==2
z = z-1/z
elseif @tran2==3
z = z+1/z
elseif @tran2==4
z = z*z
elseif @tran2==5
z = 1/z^2
elseif @tran2==6
z = z-1/z^2
elseif @tran2==7
z = z+1/z^2
elseif @tran2==8
z = sqrt(z)
elseif @tran2==9
z = 1/sqrt(z)
elseif @tran2==10
z =z-1/sqrt(z)
elseif @tran2==11
z = z+1/sqrt(z)
endif
;变换模块3
c = @fn5(@fn4(@fn3(@fn1(c))))
;变换模块4
z = @fn8(@fn7(@fn6(@fn2(z))))
;循环模块
loop:
z = z^2 +c
z = @fn9(z)
;变量说明模块
bailout:
|z| < @bailout
default:
title = "Julia && Mandelbrot"
maxiter = 200
periodicity = 0
center = (0.0,0.0)
magn = 1
param seed
caption = "seed"
default = (-0.93,0.305)
endparam
param type
caption="Set type"
default=1
enum="Julia" "Mandelbrot"
endparam
param tran
caption="trans of c"
default=0
enum="c" "1/c" "c-1/c" "c+1/c" "c^2" "1/c^2" "c-1/c^2" "c+1/c^2" "√c" "1/√c" "c-1/√c" "c+1/√c" "log(c^3)/3"
endparam
param tran2
caption="trans of z"
default=0
enum="z" "1/z" "z-1/z" "z+1/z" "z^2" "1/z^2" "z-1/z^2" "z+1/z^2" "√z" "1/√z" "z-1/√z" "z+1/√z"
endparam
func fn1
caption="function1 of c"
default= ident()
endfunc
func fn3
caption="function2 of c"
default= ident()
endfunc
func fn4
caption="function3 of c"
default= ident()
endfunc
func fn5
caption="function4 of c"
default= ident()
endfunc
func fn2
caption="function1 of z"
default= ident()
endfunc
func fn6
caption="function2 of z"
default= ident()
endfunc
func fn7
caption="function3 of z"
default= ident()
endfunc
func fn8
caption="function4 of z"
default= ident()
endfunc
func fn9
caption="function of z"
default= ident()
endfunc
param start
caption = "start"
default = (0,0.00)
endparam
param bailout
caption = "Bailout"
default = 10E5
endparam
}
MC工作表过会分享。
2014年11月06日 08点11分 1
level 13
LNSZDZG 楼主
2014年11月06日 08点11分 2
level 12
不错!我觉得这才算是把MC用起来了。[大拇指]
把一个大程序拆开成一个个小程序模块,然后就可以多次重复利用了,如此同时也提供了能够做出更复杂程序的可能性。我前几天写的https://tieba.baidu.com/p/3374289319,也说到了这个意思。
2014年11月06日 09点11分 3
而且,我感觉模块化之后,似乎快了一点
2014年11月06日 12点11分
回复 LNSZDZG :嗯,模块化不仅仅是快一点儿,因为当你在一个工作表里重复利用了某一个函数化了的“模块”时,MC在内存中已经记载了那个函数的数据流特征,再次利用的时候就不用再次逐行的解析了,而是直接把数据流的特征套用到不同的变量上即可,去掉了重复解析表达式的环节,所以会快很多。
2014年11月06日 13点11分
回复 朱老剑客 :对啊,尤其是做分形时,一个函数(模块)一般需要调用几十万次(分辨率是600*600或800*800时),就更明显了。
2014年11月07日 02点11分
level 12
还有,我看你的trans1到trans4,这四个函数的定义完全一样,有分开定义的必要吗?
2014年11月06日 09点11分 4
哈,用一个完全可以。
2014年11月06日 12点11分
level 15
LNSZDZG老师:
谢谢您的分享。把MC程序下载下来浏览了一下,很有价值。内中有很多思想值得学习。
有两点建议,请不要见怪。
1.程序没有发全,没有C31,程序不能运行。您的“参考:”是红字,缺少“D:\360安全浏览器下载\分形\shujiuC.xmcd”
2.没有必要用这么多if 语句,应该充分利用MC的矩阵优势。
妥否?仅供参考。请原谅。
2014年11月06日 10点11分 6
哈哈。1、C31分享了;2、用if和return好像比矩阵运算快一点,所以就用了。
2014年11月06日 12点11分
level 12
月城,我理解LNS的那个C31就是空着的,而且C31在一定范围内的赋值,得到的图形结果是一样的,终归C31是个seed,不过如果C31超出某个范围,就只画出空白的图了。
2014年11月06日 10点11分 7
根据LNSZDZG老师的编程习惯,C31是Julia集里面的一个复数表达式。
2014年11月06日 10点11分
回复 月城公寓寓公 :噢,好吧,我猜错了。
2014年11月06日 10点11分
level 13
LNSZDZG 楼主
[无效] http://pan.baidu.com/s/1mg9jpws
这是我搜集的复分形中Julia集的C,现分享
2014年11月06日 12点11分 8
level 15
[无效] http://pan.baidu.com/s/1gdJ2RaN
遵嘱把您的shujiuC.xmcd文件整理了一下,生成的矩阵按复数的实部升序排列。至于共轭复数就没有必要加进去了。使用时,临时把矩阵JC的虚部的正负号反号就行了,不然矩阵要大一倍。您可以试一试,一对共轭复数的分形的对称情况。我做过,其对称效果是怎样的,已经忘了。估计应该是以X轴对称吧。
我在改写的侯思松老师的程序中就已经用矩阵排序Julia集的数据了,不过只有20行左右的数据。可能您没有注意到。
2014年11月07日 07点11分 12
level 15
MC有共轭复数的运算符(见MC帮助):
按键:["]
_
X
返回 x 的共轭:Re(x) − i·Im(x),其中 i 是虚数单位。
2014年11月07日 08点11分 14
level 15
[无效] http://pan.baidu.com/s/1dD6FMLF
rar 内含两个xmcd文件,全部是ORGIN:=0
matrix.xmcd 生成排序后的矩阵Cn ,为统一起见,复数的虚部全部取正值。除非是增删复数数据,平时不需要运行此文件。
缩略图.xmcd 根据上面的matrix.xmcd中的Cn 矩阵生成全部复数的Julia集的缩略图。用鼠标点选此缩略图集合中的任一缩略图,将自动给出被选图在Cn矩阵中的序号和对应的复数值。
2014年11月09日 15点11分 15
上面的地址,刚发出来就失效了。
2014年11月09日 23点11分
level 15
2014年11月09日 23点11分 19
一个有意思的视错觉现象:图中第一行的图形感觉要“扁”一些,越往后的行,感觉要“方”一些。其实它们的长和宽全是一样的。
2014年11月10日 00点11分
回复 月城公寓寓公 :都是4:3
2014年11月10日 00点11分
这个缩略图够高端的了!MC的能力又被挖掘出了一些[呵呵]
2014年11月10日 03点11分
level 13
LNSZDZG 楼主
这个图都可以作为Julia集的“图谱”了!
2014年11月10日 06点11分 20
level 15
[无效] http://pan.baidu.com/s/1gdpGJ8f
我把我搜集的数据加进去,去掉重复的数据后,一共有118个数据:
2014年11月10日 16点11分 21
1