我的贴子《二分树》就是一个分形图,勾股树也是分形(《浅谈迭代列表》),下面再讲讲关于分形的普遍做法。
我们用分形中经常举例的图(如下)为例:
f = 线段((-3, 0), (3, 0))
A = 顶点(f, 1)
B = 顶点(f, 2)
C = A + (B - A) / 3
D = A + 2(B - A) / 3
E = (A + B) / 2 + f sqrt(3) / 6 单位法向量(f)
l1 = {线段(A, C), 线段(C, E), 线段(E, D), 线段(D, B)}
以上代码根据线段f,画出如下图形:
通常做法是把上边代码做成自定义工具,输入项为f,输出项为l1,暂命名为"分形1“。
对于输出为列表的分形,我们可以用如下命令:
l2 = 迭代(合并(映射(分形1(a), a, lst)), lst, {{f}}, 5)
这里需要注意的是,本例不需要中间过程的图,因此使用”迭代“命令,一般情况下需要中间过程图的,如二分树,则改为”迭代列表“,这个代码可以说是通用的,我们的二分树同样是这样处理的,结果图如下:
当然,有时候我们并不太想要用自定义工具,直接改造上边系列命令为一个命令,步骤不多的情况下有时候是可以的,如本例,我们试着不用自定义工具:
我们需要对所有的命令改造成只包含原始输入变量f,然后用另一个变量替换f,再放入迭代命令中,这里对点C、D、E的改造略去,我们直接改造l1:
l3 = {线段(顶点(f, 1), 顶点(f, 1) + (顶点(f, 2) - 顶点(f, 1)) / 3), 线段(顶点(f, 1) + (顶点(f, 2) - 顶点(f, 1)) / 3, (顶点(f, 1) + 顶点(f, 2)) / 2 + f sqrt(3) / 6 单位法向量(f)), 线段((顶点(f, 1) + 顶点(f, 2)) / 2 + f sqrt(3) / 6 单位法向量(f), 顶点(f, 1) + 2(顶点(f, 2) - 顶点(f, 1)) / 3), 线段(顶点(f, 1) + 2(顶点(f, 2) - 顶点(f, 1)) / 3, 顶点(f, 2))}
从这里可以看出,不用自定义工具,把若干命令弄到一起,是很长的命令,且容易出错,并且我们还需要替换掉f,得到如下文本:
{线段(顶点(a, 1), 顶点(a, 1) + (顶点(a, 2) - 顶点(a, 1)) / 3), 线段(顶点(a, 1) + (顶点(a, 2) - 顶点(a, 1)) / 3, (顶点(a, 1) + 顶点(a, 2)) / 2 + a sqrt(3) / 6 单位法向量(a)), 线段((顶点(a, 1) + 顶点(a, 2)) / 2 + a sqrt(3) / 6 单位法向量(a), 顶点(a, 1) + 2(顶点(a, 2) - 顶点(a, 1)) / 3), 线段(顶点(a, 1) + 2(顶点(a, 2) - 顶点(a, 1)) / 3, 顶点(a, 2))}
这时候,我们可以用上边文本替换迭代命令中的"分形1"自定义工具了:
l4 = 迭代(合并(映射({线段(顶点(a, 1), 顶点(a, 1) + (顶点(a, 2) - 顶点(a, 1)) / 3), 线段(顶点(a, 1) + (顶点(a, 2) - 顶点(a, 1)) / 3, (顶点(a, 1) + 顶点(a, 2)) / 2 + a sqrt(3) / 6 单位法向量(a)), 线段((顶点(a, 1) + 顶点(a, 2)) / 2 + a sqrt(3) / 6 单位法向量(a), 顶点(a, 1) + 2(顶点(a, 2) - 顶点(a, 1)) / 3), 线段(顶点(a, 1) + 2(顶点(a, 2) - 顶点(a, 1)) / 3, 顶点(a, 2))}, a, lst)), lst, {{f}}, 5)
因此,在弄分形图时,强烈建议使用自定义工具,它相当于自定义函数,操作简单,可读性也强。
我们用分形中经常举例的图(如下)为例:
f = 线段((-3, 0), (3, 0))
A = 顶点(f, 1)
B = 顶点(f, 2)
C = A + (B - A) / 3
D = A + 2(B - A) / 3
E = (A + B) / 2 + f sqrt(3) / 6 单位法向量(f)
l1 = {线段(A, C), 线段(C, E), 线段(E, D), 线段(D, B)}
以上代码根据线段f,画出如下图形:
通常做法是把上边代码做成自定义工具,输入项为f,输出项为l1,暂命名为"分形1“。
对于输出为列表的分形,我们可以用如下命令:
l2 = 迭代(合并(映射(分形1(a), a, lst)), lst, {{f}}, 5)
这里需要注意的是,本例不需要中间过程的图,因此使用”迭代“命令,一般情况下需要中间过程图的,如二分树,则改为”迭代列表“,这个代码可以说是通用的,我们的二分树同样是这样处理的,结果图如下:
当然,有时候我们并不太想要用自定义工具,直接改造上边系列命令为一个命令,步骤不多的情况下有时候是可以的,如本例,我们试着不用自定义工具:
我们需要对所有的命令改造成只包含原始输入变量f,然后用另一个变量替换f,再放入迭代命令中,这里对点C、D、E的改造略去,我们直接改造l1:
l3 = {线段(顶点(f, 1), 顶点(f, 1) + (顶点(f, 2) - 顶点(f, 1)) / 3), 线段(顶点(f, 1) + (顶点(f, 2) - 顶点(f, 1)) / 3, (顶点(f, 1) + 顶点(f, 2)) / 2 + f sqrt(3) / 6 单位法向量(f)), 线段((顶点(f, 1) + 顶点(f, 2)) / 2 + f sqrt(3) / 6 单位法向量(f), 顶点(f, 1) + 2(顶点(f, 2) - 顶点(f, 1)) / 3), 线段(顶点(f, 1) + 2(顶点(f, 2) - 顶点(f, 1)) / 3, 顶点(f, 2))}
从这里可以看出,不用自定义工具,把若干命令弄到一起,是很长的命令,且容易出错,并且我们还需要替换掉f,得到如下文本:
{线段(顶点(a, 1), 顶点(a, 1) + (顶点(a, 2) - 顶点(a, 1)) / 3), 线段(顶点(a, 1) + (顶点(a, 2) - 顶点(a, 1)) / 3, (顶点(a, 1) + 顶点(a, 2)) / 2 + a sqrt(3) / 6 单位法向量(a)), 线段((顶点(a, 1) + 顶点(a, 2)) / 2 + a sqrt(3) / 6 单位法向量(a), 顶点(a, 1) + 2(顶点(a, 2) - 顶点(a, 1)) / 3), 线段(顶点(a, 1) + 2(顶点(a, 2) - 顶点(a, 1)) / 3, 顶点(a, 2))}
这时候,我们可以用上边文本替换迭代命令中的"分形1"自定义工具了:
l4 = 迭代(合并(映射({线段(顶点(a, 1), 顶点(a, 1) + (顶点(a, 2) - 顶点(a, 1)) / 3), 线段(顶点(a, 1) + (顶点(a, 2) - 顶点(a, 1)) / 3, (顶点(a, 1) + 顶点(a, 2)) / 2 + a sqrt(3) / 6 单位法向量(a)), 线段((顶点(a, 1) + 顶点(a, 2)) / 2 + a sqrt(3) / 6 单位法向量(a), 顶点(a, 1) + 2(顶点(a, 2) - 顶点(a, 1)) / 3), 线段(顶点(a, 1) + 2(顶点(a, 2) - 顶点(a, 1)) / 3, 顶点(a, 2))}, a, lst)), lst, {{f}}, 5)
因此,在弄分形图时,强烈建议使用自定义工具,它相当于自定义函数,操作简单,可读性也强。