geogebra进阶系列4:映射指令的神奇作用(巧妙提取多边形列表中的顶点)
欢迎您点击文章上方蓝字,关注本公众号
一、简要说明
geogebra相比几何画板一个独特的地方:可以利用指令来和电脑交互,这样相当于人工智能,所以非常先进。
但是有些高手大神喜欢把指令嵌套很多层,虽然非常简洁的完成了一些工作,但是可读性比较差。
笔者建议嵌套指令不要超过三层,其它分步完成,可能更好,可读性更强,因为数学已经很难了,如果在难的数学上再加上难懂的ggb,那引起兴趣或推广的可能性就更低。我们学习ggb的目的之一本来就是辅助理解数学或物理,对吧。当然,能把ggb当成一个独立的学问进行研究也是可以的想法。
二、映射指令的基础知识
映射指令在唐老师的指令汇编中,做了如下一些简单的介绍。(当然能写成这样的指令汇编也非常不容易!)
Zip. 映射 (本案例的源文件在文尾可下载)
Zip( ( <Expression>,<Var1>,<List1>,<Var2>,<List2>,...) ) ;
映射( (< < 表达式 >,< 变量 1>,< 列 表1>,< 变量 2>,< 列表 2>,...) ) 。
生成一个新列表,其元素是:将指定列表中相应位置的元素依次作为变量代入表达式而取得的
结果。新列表的长度是输入的列表中最短的长度。
事实上,映射指令完全可以只使用单一集合作为参数。这使它在需要对一个集合中的元素进行逐个调用的时
候,相比序列指令更为简短便捷从而替代使用。
例如:“映射[a^2,a,数集]”就比“序列[元素[数集,a]^2,a,1,长度[数集]]”简捷得多。
这个案例什么意思呢?
即已有序列 产生的数集:序列(k + 1, k, 0, 10)
如果应用映射指令:映射(a², a, l1)
得到的结果为:
但如果利用序列:序列(元素(l1, a)², a, 1, 长度(l1))
得到的结果为:
两个指令的效果是一样的。
但是映射指令要简短一些!
提示:映射指令类似于其它编程语言中被称为“map”的概念。
又如:映射[n+m, n, {1, 2, 3}, m, {1, 2}],
结果是{2,4};
大家能看明白吗?1+1=2,2+2=4,3就不能参与运算了!
又如:设 P,Q,R,S 是一些点,映射[中点[A,B],A,{P,Q},B,{R,S}]
返回一个取线段 PR和 QS 中点的集合:{PR 的中点坐标,QS 的中点坐标}。
又如:设多项式的集合 list1={x^2,x^3,x^6},映射[次数[a],a,list1],返回集合{2,3,6}。
反思一:映射和函数是高中数学两个非常重要的概念。函数是特殊的映射,特殊在函数是数集到数集的映射。而映射的集合可以是非数集。所以映射的应用非常广泛。
反思二:映射指令的前提是对集合的元素进行提取,再进行表达式的计算,得到一个新的集合。
所以必须要建立原有的集合或列表,才能使用映射指令。
但序列指令或迭代列表指令则可以直接建立一个列表(或称为集合)。
下面列举1个案例。
三、经典案例:利用映射指令提取顶点。
题目:
问题:如何利用geogebra绘制上面的图形?众多高手提出了自己的绘图方式。
都很不错!
现在以大神孙生富老师的做法为例:
第一步,创建整数滑条,范围1-30
第二步,创建多边形列表:l1=序列(多边形((k, k), (-k, k), 4), k, 1, n, 1)
效果如下:
反思1:这个是利用序列+多边形的指令嵌套。多边形的第一个点为(k,k),第二个点为(-k,k),边数为4,k为序列的变量
,得到一系列的多边形集合。
在代数区显示的是这些多边形的数值!
现在问题来了,如何提取这些多边形的顶点,并且添加上标签A_?
如果直接使用顶点的指令是不行的!因为顶点的指令如下:
顶点( <圆锥曲线> )
顶点( <不等式> )
顶点( <多边形> )
顶点( <多边形>, <索引> )
顶点( <线段>, <索引> )
即:顶点的指令不能对列表产生作用!
怎么办呢?这是映射指令派上大用场了!
映射({顶点(p)}, p, l1)
注意:若使用指令:映射(顶点(p), p, l1)
得到的效果如下:
很奇怪的,不能得到多边形全部的顶点。
所以,这里的指令只能是:映射({顶点(p)}, p, l1),即加个花括号,把这些顶点做成一个集合。
但是如果下面直接利用序列+文本的指令给这些点命名,即:
序列(文本("A_" + ("{" + (k) + "}"), l5(k), true, true), k, 1, 长度(l5))
会出现如下的错误:
什么原因呢?因为映射({顶点(p)}, p, l1),得到的点是这样的:
他们是一个一个的多边形的顶点构成的独立的集合!
所以不能直接使用序列+文本的指令进行命名!
怎么办呢?这是需要把它们——合并!
合并的方法有两个,一个是直接使用“合并”的指令,一个是使用“扁平列表”的指令。
所以,第三步:合并(l5),或扁平列表(l5)
两个指令在这里的效果相同。为什么呢?查查指令汇编:
(1)合并[< 集簇>],jion
将多个子集合(集簇)合并为一个较长的集合。例如:合并[{{1,2}}]新建集合{1,2}。新集合包含原有集合中的全部元素,新集合中的元素不会重新排序。
如:合并[{{1,2,3},{3,4},{8,7}}]新建集合{1,2,3,3,4,8,7}。不会重新排序!
(2)Flatten. . 扁平列表
Flatten( ( <List>) ) ;扁平列表( (< < 列表> >) ) 。
将多个列表变为一个。
案例:“扁平列表({2,3,{5,1},{{2,1,{3}}}})”得出“list1={2,3,5,1,2,1,3}”,同样即不排序,也不管有没有重复的数值,即重复的数值也一一列出!
如果要对这些集合的元素排序,则可以使用“升序列表”或“逆序排列”的指令。
这里请查看指令汇编。
综合以上的分析,第三步:l2=扁平列表(映射({顶点(p)}, p, l1))
得到一系列下列的点:
这样,就把多边形列表中的顶点提出啦!
真是神奇啊!
第四步:序列(文本("A_" + ("{" + (k) + "}"), l2(k), true, true), k, 1, 长度(l2))
就可以对这些顶点批量命名啦。
但是直接利用这个序列+文本的指令,得到点的位置不要看。方法之一是利用自由点调整,参考:
geogebra进阶系列:文本进阶的两个实用技巧
但孙生富大神提出了另一个非常神奇的技巧:指令:
序列(文本("A_" + ("{" + (k) + "}"), l2(k) + a (1; 3π / 4) + (b; π / 2 (k - 1 / 2)), true, true), k, 1, 长度(l2))
利用两个滑条a,b来控制标签的位置,a,b的范围都是0-1,
亲测,它们都是0.5的时候,效果最好!
最后看看效果图:
最后文章的源文件可以在QQ群内下载,也可以关注本公众号之后,回复:
映射指令的神奇作用,即可下载!
说明:虽然笔者进行了多次修改,探索,分解,但是原创版权为孙生富老师,仅用于教学,切勿商用。
最近几期经典回顾