• {{article.mytitle}}
  • GeoGebra必学必用经验

    Author : zbzhen,       Last modification time : Mon Mar 6 09:45:39 2023

    GeoGebra(官网 https://geogebra.org/ , 音译: 几何不难)是一款开源跨平台的非商用免费软件, 一定要注意商用无价, 当心被坑. GeoGebra有三个版本, 分别是版本5, 版本6和网页版, 点我查看三者的区别.

    离线多页模板下载地址 https://kz16.top/ggbppt.7z

    相关链接

    强烈推荐好用的网页版多页模板ggbppt: https://kz16.top/geogebra/ggbppt.html

    • 下载地址 https://kz16.top/ggbppt.7z (体积不到10M, 免费开源无广告, 仅用于学习, 请勿商用, 跨平台, 解压可用, 推荐用 https://7-zip.org/ 解压), 外加的功能可以通过H键隐藏, 激光笔或上下方向键翻页

    • 注: ggbppt是基于GeoGebra的离线网页版开发的多页实用模板, 底层依旧用得是GeoGebra官网提供的网页版, 只是额外增加了几个实用按钮, 并自己设置了一个实用模板. 下了离线包后, 可以无需安装GeoGebra桌面版.

    数学绘图是一种可以复制的艺术
    数学功底决定绘图造诣

    1. 必用操作

    1.1. 导入ggb文件

    • 紧按鼠标左键, 直接把ggb文件拖入到画图的界面中

    1.2. 保存ggb文件

    • 界面右上角字形状的图标--->Download as--->ggb

    • 其实最简单的办法是点击页面 https://kz16.top/geogebra/ggbppt.html 最上方的 导出在线 按钮即可, 保不保存ggb文件无所谓. 当然也可以导出离线 , 这需要下载离线包, 并且要把离线文件放到离线包中.

    1.3. 下载官网ggb课件

    1.4. 导入图片

    • 法1: 紧按鼠标左键, 直接把图片拖入到画图的界面中

    • 法2: 点击最上边滑动条那个图标--->Image--->Choose File

    1.5. 导出透明svg矢量图

    • 在命令行中输入下列代码再回车即可
      ExportImage("filename","image.svg","type","svg")
      下面代码可以得到不透明svg矢量图
      ExportImage("filename","image.svg")

    • 如果想要得到固定区域的svg图有两种办法:

      1. 右键框选所要导出的区域
      2. 先输入代码
        SetPerspective("(G/D)(A/P)"
        拖动边框调整下界面大小, 再输入下面代码回车
        ExportImage("filename","image.svg","type","svg")
    • 推荐用inkscape把svg转化为pdf文件

    1.6. 提取ggb中被插入的图片

    • 只需要把ggb文件用解压软件解压即可, 推荐用免费无广告的 https://7-zip.org/ 解压

    2. 必学技巧

    2.1. 常用小技巧

    • 绘图的过程中, 点了绘图小图标工具后一定要记得按Esc

    • 鼠标右键可设置属性, 或者框选多个对象

    • Shift或者Ctrl可以一次性选择多个对象

    • 尽量用代码画图, 推荐代码用markdown编辑器保存起来, 参考 https://kz16.top/md/

    • 对不熟悉的指令, 可以用必应或者谷歌搜索, 搜索的词条为
      geogebra 指令名, 例如geogebra zip, 一般第一条就会得到指令解释

    2.2. 循环与求和

    更多循环相关信息, 请点这里

    2.2.1. 序列循环zip

    • 推荐用zip, 完全没必要用sequence

      例如得到列表{1,4,9,16,25,36}可以这样写

      zip(k^2,k,1..6)

    2.2.2. 迭代Iteration

    • IterationList
      iterationList(p*10+1, p, {1}, 2)
      结果为 {1, 11, 111}

      斐波那契数列
      iterationList(b+a, a, b, {1, 1}, 5)
      结果为 {1,1,2,3,5,8}

    • Iteration
      iteration(p*10+1, p, {1}, 2)
      结果为{111}

    2.2.3. 序列求和Sum

    • 求和要注意大写, 求列表
      {1,4,9,16,25,36}的和
      Sum(k^2,k,1,6)

    要注意:

    zip括号中的1..6是用两点隔开的
    Sum括号中的1,6是用逗号隔开的

    2.3. 判断

    例如绘制分段函数
    f(x)=if(x<0,-1,x<1,x,1)

    此外可能偶尔用到keepif以及countif

    如果想绘制椭圆的一部分图像, 推荐用参数方程作为判断, 而不是对隐函数做判断, 因为GeoGebra的隐函数功能很弱, 例如绘制椭圆的第一象限:
    curve((2cos(t), sin(t)),t,0,pi/2)

    2.4. 列表

    列表从某种意义上可以被认为是集合或多维向量, 列表中可以有数也可以有其它对象, 例如点, 线, 多边形等, 同数学中的集合一样, 用{}把元素括起来. 常用的指令及相关技巧有:

    • 1..4得到结果{1,2,3,4}

    • 合并join, 展平flatten 可分别看例子
      join({1},{2,{3}})得到{1,2,{3}}
      flatten({{1},{2,{3}}})得到{1,2,3}

    • a(1)element(a, 1)表示列表a的第一个元素, a(-1) 表示列表a的最后一个元素, element(a, -1)会报错

    • take(a,2,4)表示取列表a的第2,3,4号索引, 例如
      take(1..6,2,4)得到2,3,4

    • Union(a,b)表示a,b的并, Intersection(a,b)表示a,b的交

    • 属于符号完全和数学一致

    • 对列表循环, 通常用zip函数, 例如得到列表a={1,3,1,4}的平方, 可以这样
      zip(k^2,k,a) 也可以直接a^2 结果都是{1,9,1,6}

    • 同时对多个列表循环, 例如计算2个列表的和

      a={1,2,3}
      b={4,5,6}
      zip(ak+bk,ak,a,bk,b)
      

      上面最后一步当然也可以直接写成a+b

    其它一些操作, 列表可以当成某个特殊的, 例如

    • {1,2}*3结果为{3,6}

    • {1,2}+{3,4}结果为{4,6}

    • ln({1,e,e^2})结果为{0,1,2}

    • ... 其余的可自己去尝试

    2.5. 向量与点

    向量和点在某种意义下可以认为是同一个类对象, 都可做向量的基本加减和数乘运算, 稍微有点区别的是, 向量会有个箭头, 并且一般默认用小写字母表示向量, 大写字母表示点

    • A=(1,2), 则x(A)=1, y(A)=2

    • A=(1,2), B=(3,0), 则它们的中点为(A+B)/2

    • 用分号隔开则表示极坐标, 例如
      B=(1;pi/3)

    2.6. 复数

    复数的基本表示方法和数学没什么区别, 例如
    Z=1+3i
    它的一个很大的作用是, 把某个对象乘以复数, 等于是做旋转和伸缩变换, 例如, 若A=(1,2), 则i*AA*i结果为-2+i

    这样使得代码变得简洁, 当然可能不利于新手阅读代码

    2.7. 插入特殊的标记对象

    例如插入一个花括号, 把两个自由的点括起来

    • 制作透明花括号的svg矢量图片
      • t=text("\overbrace{\qquad\qquad}",(0,0),true,true)
      • 右键框选花括号图片, 并输入下面代码, 回车
        ExportImage("filename","image.svg","type","svg")
    • 导入上一步的花括号图片image.svg, 默认导入的图片为辅助对象, 第一个图名字为pic1
    • 接下来就是控制图片的大小, 任意绘制2个点A,B, 并且
      C=A+i (B-A)/abs(A-B)*aaa*4,
      然后右键设置图片的三个角点位置别为A,B,C. 这样调整A,B括号会自适应改变
    • 如果要绘制多个花括号, 就复制图片CopyFreeObject(pic1)或者再上传一次图片, 然后重复操作

    如果使用频率高, 可以把上面的步奏做成工具

    2.8. 参数方程

    总得来说分成三类: 圆弧, 折线和一般曲线

    2.8.1. 圆弧的参数方程

    求圆弧ABC, 的参数方程

    A=(0,0)
    B=(1,0)
    C=(0,1)
    Q=center(circle(A,B,C))
    r=abs(Q-A)
    t1=angle(A-Q)
    d=cross(A-C,B-C)
    t3=if(d>0,angle(A,Q,C),angle(C,Q,A))
    c=curve(Q+(r;t1+t3*t*sgn(d)),t,0,1)
    

    这里需要设置角度的范围为0-360, 因此推荐用本文提供的模板, 无需自行设置, 并且做成了工具, 工具名为arct
    https://kz16.top/geogebra/ggbppt.html
    输入的是圆弧上的三个点, 例如arct(A,B,C)

    2.8.2. 折线参数方程

    Lp = {(0,1),(2,1),(1,3)}
    n = length(Lp)-1
    f(x)=Function(join({0,n},x(Lp)))
    h(x)=Function(join({0,n},y(Lp)))
    a = curve(f(t*n),h(t*n),t,0,1)
    

    对于一般线段AB的参数方程可以为
    curve(A(1-t)+B*t,t,0,1)

    在模板 https://kz16.top/geogebra/ggbppt.html
    工具polyt可以得到归一化参数方程, 也就是参数范围为[0,1], 工具polys得到弧长参数. 两个工具的输入参数都是点列, 例如 polyt({(0,1),(2,1),(1,3)})

    折线参数方程数学理论可参考:
    https://kz16.top/geogebra/polyarc.html

    2.8.3. 一般曲线参数方程

    pt = {(0,1),(2,1),(1,3)}
    a = spline(pt)
    

    一般的参数方程, 推荐用样条插值, 多项式拟合可以选择FitPoly, 或者直接自行选择基函数再用fit函数拟合

    2.9. 区域涂色

    本质上是一个确定区域的数学题, 因此主要可以有这么几种方法

    • 不等式法 : 只需知道表示交, 表示并, ¬表示非, 或者分别用符号&&, ||, !

    • 多边形 : 直接绘制多边形即可

    • 参数方程 : 如果曲线首尾没有连接, 默认会用直线连上

    这里主要讲万能的参数方程法处理对于一般的带有曲边和直边的区域涂色

    给定一个区域, 和区域边界上任意的几个点A,B,C,D,E,F,G, 满足
    ABC是曲线段
    CD是线段
    DEF是曲线段
    FGA是线段
    则该区域的涂色可以用如下GeoGebra代码绘制:

    a = spline({A,B,C})
    b = curve(C(1-t)+D*t,t,0,1)
    c = spline({D,E,F})
    d = curve(F(1-t)+G*t,t,0,1)
    f = curve(if(t<1,a(t),t<2,b(t-1),t<3,c(t-2),d(t-3)),t,0,4)
    SetDynamicColor(f,0,0,1,0.3)
    

    上面的方法用到了样条插值, 逼近效果是很不错的, 通常情况下可以处理几乎所有的区域涂色, 对于圆弧段曲线, 可以自行写出相应的参数方程. 相关参数方程的求法可回顾之前介绍的参数方程

    参数方程着色稍微麻烦的地方就是合并参数方程

    例如: 合并2个归一化的参数方程a与b可以表示为

    Curve(if(t<0.5,a(2*t),b(2*t-1)),t,0,1)
    

    2.10. 模糊的png数学图转svg矢量图

    实现这一步需要用到前面的经验和技巧

    • 紧按鼠标左键, 把png图片拖到绘图区

    • 在png图上临摹点, 如果是曲线就多加几个点, 对于折线或线段就绘制折点和端点.

    • 用前面提供的参数方程的办法, 把线条用参数方程写出来

    • 修改样式: 线条的粗细, 样式, 颜色等, 区域涂色, 适当注意下图层等, 隐藏不必要的点或标签. 这一步可以通过鼠标右边点击对象, 设置对象的属性或样式

    • 如果要用LaTex公式标签, 记得选serifLaTex formula
      LaTex相关常用符号, 可参考 https://kz16.top/latex/symbol/

    3. 动态交互

    有了前面的知识, 应该可以绘制绝大部分的静态图

    对于动态交互图,

    用得最多的是滑条Slider 其次是复选框和按钮(其实多数情况下复选框比按钮实用, 甚至可完全按钮). 因此只需知道滑条和复选框的使用方法

    3.1. 滑动条

    创建滑动条

    k=Slider(0,1,0.01)

    没必要手动点, 直接输入代码就好, 这里有3个参数, 前两个是范围, 最后一个是增量, 不必担心记不住Slider这个单词, 输入前面两个单词就会有提示的, 而且多输入几次就记住了. 不推荐中文名字, 因为切换输入法太慢了

    有了滑条可以绘制含参函数, 例如
    f(x) = k*x^2

    也可以做动点, 例如, 用滑条控制点做圆周运动

    k=Slider(0,2pi,0.01)
    A=(1;k)
    

    也可以控制三角形做旋转或平移运动

    k=Slider(0,2pi,0.01)
    t1 = {polygon((0,0),(1,0),(0,1))}
    rotate(t1, k)
    translate(t1, (k,0))
    

    上面的代码, 把polygon((0,0),(1,0),(0,1)){}括起来是为了把它变成列表, 这样就不会出现额外的边对象

    3.1.1. 动态轨迹

    例如绘制下面的动态交互曲线

    a = slider(0,1,0.01)
    b=Curve((sin(2π*t),2t^(2)),t,0,a)
    

    或者用轨迹法(这种方案虽然麻烦, 但是比较具有一般性)

    a = slider(0,1,0.01)
    f=segment((0,0),(0,a))
    A=point(f,1)
    t = y(A)
    H=(sin(2π*t),2t^(2))
    c=locus(H,A)
    

    3.1.2. 滑动条在指定位置自动停留

    在实际做演示过程中, 需要滑条在指定位置停留, 然后点击按钮会启动. 例如滑条在0,1,e,pi,6位置上自动停留

    Lp={0,1,e,pi,6}
    
    n=slider(0,length(Lp)-1,1)
    n=1
    
    b=slider(Lp(n),Lp(n+1),0.01, 10 / abs(Lp(1 + n) - Lp(n)))
    ##  2.4. 上面的参数10可用于设置滑条速度
    <p class="mume-header " id="-24-上面的参数10可用于设置滑条速度"></p>
    
    ##  2.5. b 的 slider-->Repeat 设置为: 
    <p class="mume-header " id="-25-b-的-slider-repeat-设置为-"></p>
    
        Increasing (Once)
    
    a=slider(Lp(1),Lp(-1),0.01)
    ##  2.6. aOn Update 脚本为: 
    <p class="mume-header " id="-26-a-的-on-update-脚本为-"></p>
    
        SetValue(a,b)
    
    t=button("start")
    ###  2.6.1. t的 On Click 脚本为:
    <p class="mume-header " id="-261-t的-on-click-脚本为"></p>
    
    SetValue(n, If(n==length(Lp)-1, 0, n))
    n = n+1
    StartAnimation(b, true)
    StartAnimation(a, true)
    

    嫌弃上面代码麻烦, 不妨直接看成果
    https://www.geogebra.org/classic/xsymtz3s
    缺陷是往返设置略微麻烦

    3.2. 复选框

    如何通过按钮实现停止和启动滑动条? 可用复选框轻松搞定

    • 创建滑条 k=Slider(0,1,0.01)

    • 创建复选框 a=true

    • 右键点a--->Setting--->Scripting--->On Update, 然后把代码StartAnimation(k,a)粘贴到界面On Update下面的框中, 并且叉掉刚打开的Setting(设置)框

    • 点击复选框a左边的矩形按钮, 就可以实现停止和启动滑动条

    3.3. 一次性导入多行的代码

    代码太多, 一行行输入着实麻烦, 一次性导入多行代码其实也很简单

    • 创建复选框 a=true

    • 右键点a--->Setting--->Scripting--->On Update, 然后把多行ggb代码粘贴到On Update下面的框中, 并且叉掉刚打开的Setting(设置)框

    • 点击复选框a左边的矩形按钮, 可直接执行多行ggb代码

    其实第一步也可以创建一个点或按钮, 不一定非要复选框

    3.4. 导出动态图以及PPT展示

    可以选择用gif或mp4录屏软件, 其实它的作用主要用于网络交流

    对于非正式演示, 可以直接拿出ggb展示, 如果是多个ggb文件, 直接用网页版多页模板 https://kz16.top/geogebra/ggbppt.html 即可

    如果是正式场合, 推荐导出多张svg矢量图帧, 实现动态变化, 那么这里涉及两个问题:

    • 一是导出的图需要大小一样, 并且连续两张图的变化要比较平和, 也就是要确保该固定的得固定, 该变化的得变化.

    • 二是导出多个图片帧怎么插入PPT中做成动态效果? 其实在PPT中很容易处理的, 一种小白很容易实现的办法是: 先插入第一张图片, 再复制粘贴多个当前页面, 最后挨个翻页, 右键点图, 把每个页面的图片替换成目标图

    对于上面提到的第一个问题, 用网页版多页模板 https://kz16.top/geogebra/ggbppt.html 就比较简单了, 只需每变动一步, 点击页面最上方的克隆按钮, 然后就可以鼠标左键点边框外的空白处, 按上下方向键翻页, 预览效果, 最后通过指令, ExportImage("filename","image.svg","type","svg")可以逐个页面快速导出svg矢量图

    这种做PPT动态图的方法, 确实有点麻烦, 但是效果是真的好, 为了效果, 正式场合耗费时间也是值得的

    4. 交流分享

    做好了动态ggb图, 希望可以保存在云端, 然后通过链接分享给别人, 或者只是自己私密保存, 这个其实非常简单, 以本文的网页版多页模板为例

    • 官网 https://www.geogebra.org/ 或国内镜像 https://www.ggb123.cn/ 注册账号

    • 在页面 https://kz16.top/geogebra/ggbppt.html 里登陆, 具体步奏是: 右上角字形状的图标--->Sign in

    • 右上角字形状的图标--->Share, 弹出一个窗口, 可以选择 Shared(分享) 或者 Private(私密), 这个可以根据需求选择, 然后点 SAVE(保存), 会弹出一个对话框, 里面有一个链接, 可以复制这个链接, 然后分享给他人

    当然也可以直接在页面 https://kz16.top/geogebra/ggbppt.html 上, 点击导出在线, 会得到一个html文件, 然后可以把这个html文件分享给他人, 对方可以直接用浏览器打开


    主页地址 https://kz16.top/geogebra

    欢迎非商业转载,转载请指明来源,
    本文来源 https://kz16.top/geogebra/ggbpptReadMe.html