对于小立方体组合的三视图问题,之前介绍过两种搞定小立方体组合的方法——
一是通过输入的方式:
二是通过拖动的方式:
今天,来说说通过点击的方式,也可以完成小立方体组合。
而且,该方式可用于这一类题目的演示——给出一个由若干个小立方体叠成的几何体的俯视图,每个小方格中的数字表示该位置上重叠的小立方体的个数,要求画出其三视图。
来看看效果吧:
源文件获取方式,请见文末
可以看到:点击小格子,即可产生该位置上的小立方体;而且,点击同一个小格子多少次,就在该位置上堆叠多少个小立方体。
另外,当点击小格子生成相应的小立方体组合后,还可以隐藏没有用到的小格子!
----------------二次编辑:新增一个功能----------------
- 如果在中途,不小心点击错了小格子,导致有多余的小立方体,怎么办?
- 为了解决这个问题,可以增多一个功能,达到:只需鼠标轻松点一点,生成或删除小立方体,那都不是事!
修改后的作品效果
----------------二次编辑结束:作品修改请见链接----------------
效果不错吧?有想到怎么做吗?
来看看制作思路:
- 小格子这么有规律——考虑用序列(Sequence)指令,以便一次性生成;
- 并假设得到的是l1。
- 小格子可以一个一个地点击——每个小格子必定是一个独立的对象;
- 于是,可用元素(Element)指令来得到l1中的元素。
- 每点击一次小格子,可产生一个小立方体——每个小格子必定都有单击时脚本;
- 小格子较多,若脚本需要一个一个输入,太费时——考虑用表格区,因为当下拉填充时,还可复制其脚本。
下面开始动手操作!
一次性生成所有小格子
■ 只需一条指令,即:
l1 = 扁平列表(序列(序列(多边形((u, v), (u 1, v), 4), u, 0, 4), v, 0, 4))
思考过程如下:
· 小格子即为正方形,可用多边形(Polygon)指令:
多边形( <点1>, <点2>, <顶点数> )
· 小格子非常有规律,又是二维的,那么,可以用序列嵌套。
· 为了方便后续用元素( <列表>, <元素位置> ),于是,再运用扁平列表(Flatten)。
■ 输完l1后,先激活3D绘图区,再输入:
中心定位((3,2,2))
注:中心定位(CenterView)。
■ 最后,将l1隐藏。因为我们需要的是独立的小格子。
构造独立的小格子
■ 在表格区A1、A2处分别输入1、2,并下拉填充至A25。
■ 在B1处,输入=元素(l1, A1)。
如果此时下拉B1填充,即可产生相应的独立的小格子。不过——我们需要先输入B1的单击时脚本,再下拉填充,以保证得到的所有小格子都有脚本!
问题来了——小格子的单击时脚本应输入什么?
- 下拉填充使得其脚本都一样,而我们还要保证最终可以构造出相应的小立方体。
- 点多少次小格子,就要产生多少个小立方体,不妨引入新对象用来计数。
- 小格子的单击时脚本只需有计数功能——点击小格子,数值就增加1。
- 一共有25个小格子,而每个小格子都应单独计数,则需要25个对象用来计数。
- 而这些对象再用于构造立方体的指令即可。
于是:
■ 构造n1,n2,……,n25用来计数,并且初始值都为-1(这个初始值与后续构造立方体的指令有关):
执行(序列("n" k "=-1",k,1,25))
■ 在B1的单击时脚本输入:
执行({"SetValue(n" Row(%0) ",n" Row(%0) " 1)"})
■ 下拉B1至B25填充。
具体操作如下:
这里稍作说明:
执行(Execute)在批量操作上可省时省力,其基本用法请见:「执行」是什么宝藏指令。
执行( <文本列表> )
对于不熟悉或者较长的执行指令,可先将列表书写完整,再改写为文本。
构造小立方体
有了用来计数的n1,n2,……,n25,以及小格子B1,B2,……,B25。那么,小立方体如何根据这些对象构造出来呢?
先来看这条指令:c1 = 序列(正六面体(平移(B1, 向量((0, 0, v)))), v, 0, n1),应如何理解?
正六面体( <正方形> )
当n1取值为-1,0,1时,c1如下图所示。
注:正六面体(Cube)、平移(Translate)、向量(Vector)。
类似地,相应的c2,c3,……,c25也可以如此构造。
■ 于是,此批量操作可以用执行指令,即:
执行(序列("c" u "=Sequence(Cube(Translate(B" u ",Vector((0,0,v)))),v,0,n" u ")",u,1,25))
■ 并设置所有小立方体的线径、颜色。
令n1,n2等都为0,再设置c1,c2等的属性
显示小立方体数量
每个小格子上需显示此处的小立方体数量。以小格子B1为例,其小立方体数量是n1 1。于是,其文本为:
文本(n1 1,形心(B1) (-0.12, -0.21))
注:文本(Text)、形心(Centroid)。
而其他24个文本也可以类似构造。
■ 于是,所有文本的构造如下:
执行(序列("Text(n" k " 1, Centroid(B" k ") (-0.12, -0.21))",k,1,25))
来看看效果:
■ 可以看到点击小格子时,容易不小心就点到了文本;于是,为了避免这种情况,将所有文本设置为不允许选定。
创建复选框、按钮
■ 创建复选框a,标题为$\Large隐藏无关格子$。
希望不勾选复选框时:所有小格子、文本都可以显示出来;当勾选复选框,而且小格子上的小立方体数量不等于0时,显示这些小格子、文本。
■ 于是,设置所有小格子、文本的显示条件。即:
执行(序列("SetConditionToShowObject(B" k ",!a ||(a &&n" k "!=-1))",k,1,25))
执行(序列("SetConditionToShowObject(text" k ",!a ||(a &&n" k "!=-1))",k,1,25))
■ 创建按钮:
注:设置视图方向(SetViewDirection)。
要点回顾后记
受赵林老师、刘玉平老师的启发,才有了本作品。
一开始,啊K只想到全部用执行指令。至于每个小格子的单击时脚本,本来是希望借助可以给对象添加脚本的指令,就可以再用执行来批量操作。
但是,GeoGebra中,只能进入对象的属性,方可添加脚本。不过,在表格区,当下拉填充时,还可复制其脚本。所以,利用表格区,就可极大地节省输入脚本的时间。
所以,利用表格区、执行指令都可以批量操作。而表格区的下拉填充,还能填充对象的脚本等属性。
如需本作品的源文件,请回复:哪里需要立方体就点哪里。
,