关于分形
geogebra吧
全部回复
仅看楼主
level 11
我的贴子《二分树》就是一个分形图,勾股树也是分形(《浅谈迭代列表》),下面再讲讲关于分形的普遍做法。
我们用分形中经常举例的图(如下)为例:
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)
因此,在弄分形图时,强烈建议使用自定义工具,它相当于自定义函数,操作简单,可读性也强。
2021年04月20日 01点04分 1
level 11
用上边的图形作雪花:
我们将迭代初始值换为正六边形的边:
F = (-1, -1)
G = (1, -1)
poly1 = 多边形(F, G, 6)
l9 = {顶点(poly1)}
l5 = 合并({序列(线段(l9(i), l9(i + 1)), i, 1, 5), {线段(l9(6), l9(1))}})
l6 = 迭代(合并(映射(分形1(a), a, lst)), lst, {l5}, 4)
2021年04月20日 04点04分 2
level 11
这里顺便给出勾股树非自定义工具命令:
迭代列表(合并(映射({多边形(顶点(b, 4), 描点(半圆(顶点(b, 4), 顶点(b, 3)), a), 4),多边形(描点(半圆(顶点(b, 4), 顶点(b, 3)), a), 顶点(b, 3), 4)}, b, lst)), lst, {{poly3}}, 4)
其中,poly3为原始正方形,需要用户输入,a值为路径值,决定勾股树形状,也需要用户定义。
如:
a = 0.54
L = (1.42341, 0.14408)
M = (3.80815, 0.16918)
poly3 = 多边形(L, M, 4)
l7 = 迭代列表(合并(映射({多边形(顶点(b, 4), 描点(半圆(顶点(b, 4), 顶点(b, 3)), a), 4), 多边形(描点(半圆(顶点(b, 4), 顶点(b, 3)), a), 顶点(b, 3), 4)}, b, lst)), lst, {{poly3}}, 4)
2021年04月21日 01点04分 3
level 11
图形镂空:
P = (-3, 0)
Q = (3, 0)
poly4 = 多边形(P, Q, 3)
l10 = 迭代(合并(映射({多边形(顶点(b1, 1), 中点(顶点(b1, 1), 顶点(b1, 2)), 3), 多边形(中点(顶点(b1, 1), 顶点(b1, 2)), 顶点(b1, 2), 3), 多边形(中点(顶点(b1, 3), 顶点(b1, 1)), 中点(顶点(b1, 2), 顶点(b1, 3)), 3)}, b1, lst)), lst, {{poly4}}, 5)
2021年04月21日 06点04分 5
level 11
谢氏地毯:
A = (-4, -4)
B = (4, -4)
poly1 = 多边形(A, B, 4)
E = 形心(poly1)
t1 = 位似(poly1, 1 / 3, E)
l1 = 序列(描点(poly1, k), k, 0, 7 / 8, 1 / 8)
l2 = 迭代列表(扁平列表(映射(位似(p, 1 / 3, q), q, l1)), p, {{t1}}, 3)
2021年04月25日 00点04分 6
level 11
楼上的列表分形与上边几种略有不同,我们一般使用如下命令:
l2 = 迭代(合并(映射(分形1(a), a, lst)), lst, {{f}}, 5)
而楼上使用了:
l2 = 迭代列表(扁平列表(映射(位似(p, 1 / 3, q), q, l1)), p, {{t1}}, 3)
这里扁平列表和合并是等效的,区别不在这里,而是映射时多了一个映射中心这个变量,这在位置变化分形中特别有用,如修改一下楼上分形:
l1 = 序列(描点(poly1, k), k, 1 / 8, 7 / 8, 2 / 8)
l2 = 迭代列表(合并(映射(位似(p, 1 / 3, q), q, l1)), p, {{t1}}, 3)
2021年04月25日 01点04分 7
level 11
5楼图形镂空改为谢氏三角:
A = (-4, -4)
B = (4, -4)
poly1 = 多边形(A, B, 3)
E = 形心(poly1)
t1 = 对称(位似(poly1, 1 / 2, E), E)
l1 = 序列(描点(poly1, k), k, 0, 5 / 6, 1 / 6)
l2 = 迭代列表(合并(映射(位似(p, 1 / 2, q), q, l1)), p, {{t1}}, 4)
2021年04月28日 03点04分 9
level 1
666[真棒]
2021年05月06日 08点05分 10
level 6
哇塞,这教程太好啦!谢谢!!!
2023年06月10日 09点06分 11
1