返回列表 回复 发帖

用GeoGebra制作的分形的探索

今天捣鼓了一下GeoGebra(以下简称GG),发现与GSP不同的是,GeoGebra没有很方便的“迭代”功能。

迭代的实现主要依赖于递归,在GSP里实数值可以用Iteration或者IterationList来进行递归操作。
语法是:
Iteration[f(x),x0,N]。就是,按照f(x)函数给定的规则,从x0开始,进行N次迭代。

IterationList跟Iteration语法相同,不同的是Iteration返回最后值,而Iteration返回迭代过程的所有中间值,返回结果是一个List,这是GG中的链表数据结构。对链表可以进行取头部元素,取尾部元素等操作。

讲到这里,只是一维数据的情况,而想要制作分形的话,需要对几何对象进行递归的变换操作。

但是GG里没有直接实现这个功能的函数,我把它的函数手册翻来覆去的看,也没想出辄。期间,看到Sequence函数的时候,让我眼睛一亮。

Sequence的语法是Sequence[Expression,i,m,n]。作用是,将i从m递增到n,每递增一次,执行一次Expression表达式。
其中,Expression是一个操作表达式,这个表达式可以跟i有关,也可以无关;可以是自定义的工具函数,或者GG自带的函数。这里不限于一维了,对几何对象,如Point,Vector等的操作都可以使用。让我兴奋了半天,可是翻来倒去,如果想用Sequence进行递归迭代的话,需要操作完一个变量后,把得到的值作为新的自变量进行迭代,这样GG就会跳出一个可恶的circular definition(循环定义)的出错对话框。

没辙了,山穷水尽之处,最后才发现,原来Spreadsheet可以记录中间结果。于是,最后用Spreadsheet搞定。

思路:

1. 构造单步迭代。
这一步是自己手动构造一个单步迭代的结果,然后,用自定义工具进行定义,这样,这就等于把单步迭代就变成了一个命令,可以用指令的方式来调用。

2. 用Spreadsheet构造迭代过程的中间迭代结果。
用Spreadsheet可以方便的进行迭代式的定义,比如A3=A2+A1。跟Excel很类似,定义了一个,其他的只要拉动右下角的标记点就可以自动生成。想进行多少次迭代,就拉多少行。

3. 显示分形结果。
分形结果的显示可以在迭代过程中显示,但是,最好还是最后显示。如果在操作Spreadsheet的过程中显示的话,不便于控制显示的迭代深度。因此,我这里用了一个滑动变量来控制显示。

4. 自己制作的自定义工具:
NewTriangle[A,B,C,a]是单步迭代函数,功能是,给出一个三角形△ABC,按照a进行缩放。
DrawTriangle[A,B,C]是显示函数,功能是,给出三个点,画出三点之间的连线,即三角形△ABC。
这里,我是先在Spreadsheet里生成的点信息,最后才用DrawTriangle画出来。


5. ggb文件的测试方法:
(1) 先用命令:AllPoints = CellRange[A1,C23],将Spreadsheet转换成List,这样方便进行操作。(我没有找到从Spreadsheet里直接取值的函数)
(2) 从1到n依次画出小三角形,命令是:
Sequence[ DrawTriangle[ Element[AllPoints,i],Element[AllPoints,i+N],Element[AllPoints,i+N*2] ],i,1,n]

最后:
感谢北师大的老师们制作的GG使用指南。
希望能够帮助大家制作出精美的分型图片,我只是做了一个很简单的测试。
我最近刚接触GG和GSP,如有错误,请大家多多指正。
[local]1[/local]

另外,可以参考:
[1]  Recursive sequences, http://geogebra.uni.lu/en/wiki/index.php/Recursive_sequences
[2] Fibonacci Sequence,http://geogebra.uni.lu/en/wiki/index.php/Fibonacci_Sequence

1.png (134.12 KB)

1.png

Recursion.ggb (9.06 KB)

1# visionfans

1.gif (184.74 KB)

1.gif

返回列表