一个简易的ggb(Geogebra作图文件)与gmt(Euclidea关卡文件)转换器
暂时不会Geogebra自带的api,所以另外用的python
关于ggb与gmt文件的结构,请参阅 参考文档
将ggb文件转为gmt文件的python程序
考虑到Euclidea的作图工具有限,请在本目录下的“default.ggb”中,按以下要求进行Geogebra的绘图(当然,使用新建的或者现有的ggb文档也可以,但是同样需要满足这些要求,且可能还要自行导入工具):
- 为使Euclidea游戏与ggb中的绘制区域吻合,请尽量将图形控制在x方向坐标-300到300、y方向坐标-250到250的范围内,如有放大/缩小的必要,请记住各元素相对于初始绘制范围的位置,以免出现游戏中图形超范围或过小的情况
- 当对象的地位相等时,请按照作图的先后顺序构造(如:点C比点B先绘制,那么构造线段应该由C向B),否则会因为标准不一样而出现一些奇怪的现象
基础工具:
- 自由点: 平面内任选
- 对象上的点:在对象上的某处点击(由于ggb存储该对象的特殊性
本人很懒,线上的点目前无法在gmt中复刻出同样的位置,转换时只能随机生成一个位置参数,所以请参见参考文档gmt vsc扩展的提示,在gmt文件中调整) - 直线:选择两点(有时要考虑选择的顺序)
- 射线:选择顶点和另一点,要考虑顺序
- 线段:选择两点(有时要考虑选择的顺序)
- 交点:选择两线、线圆或圆圆 (圆与直线/圆的交点会有参数决定是哪一个,这个参数系统在两方有一定区别,尤其是gmt中有一个类似于引导选择的参数,即若已经有一交点,那这个参数可以避免另一交点与其重合,且无视控制是哪个的参数,而ggb中没有(其实是一律写为2),所以如果程序给出的参数有误,请自行修改,具体方法参见参考文档或gmt vsc扩展)
- 圆:选择圆心与半径
高级工具(特别注意那些在gmt需要进一步转换的,当然,不建议使用这些gmt不支持的功能,否则可能会出一些奇怪的错误):
- 中点/中心:选择两点或一圆;如果选择线段,gmt中处理为线段两端点 (事实上,两点与一圆的构造指令是不同的)
- 垂线:选择一点和一线(选择顺序不重要,ggb内部会调整)
- 平行线:选择一点和一线(选择顺序不重要,ggb内部会调整)
- 中垂线:选择两点;如果选择线段,gmt中处理为线段两端点 (有时要考虑选择的顺序)
- 角平分线:选择三点,其中第二点是角的顶点;选择两条线则处理为作无穷远点的角平分线(或等距平行线),但是请慎用 (第一,三点有时要考虑选择的顺序)
- 圆规:选择两点 (确定的半径),再选择圆心;如果选择线段,gmt中处理为线段两端点;如果选择圆,gmt中则处理为圆心+圆上一点,如果找不到现成的点会重新定义一个 (前两点有时要考虑选择的顺序)
- 三点圆:选择三点;为后续处理方便,gmt中自动生成中心但不显示 (有时要考虑选择的顺逆时针顺序)
- 切线:选择一点和一圆,会同时生成两条线,无论是否隐藏都会转换进gmt;如果选择线和圆,gmt中处理为过圆心垂线+两交点+作切 (选择顺序不重要,ggb内部会调整);如果选择两圆,gmt中处理为作出两位似中心+作切(如果在移动时切线数目或者两圆大小关系有变化,可能会出现一些问题,所以请慎用)
- 极线:选择一点和一圆;如果选择线和圆,gmt中处理为过圆心的垂线 (选择顺序不重要,ggb内部会调整;以及后者构造指令不一样)
自制工具(gmt中能直接使用而ggb不能的,故打包,源代码文件在同目录下的ggb_src文件夹。使用不熟练者,可以多试几次以熟悉):
- 极点:选择一线和一圆(ggb会强制自制工具的选择顺序,下同)
- 无穷远点:选择一直线或射线,会同时生成两个假想的点,对其的操作可以在“代数区”进行
- 定值角:选择顶点和另一点,然后输入角度(请选择逆时针),生成的是射线 (注意先选的是顶点,和其他几个不同)
- 复制角:和角平分线工具一样选择三点,再选择新的一点和一顶点,生成的也是射线
- 平移线段:选择两点 (代表一条线段),再选择一点,生成的为含端点的反向延长的线段,但是在gmt中,端点是用圆规+交点定义的 (前两点有时要考虑选择的顺序)
Euclidea是关卡式的,所以有关卡的设置(即初始条件,所求作,探索模式,移动模式,规则等,具体语法见参考文档)
在ggb中,可以使用list(列表)来确定上述设定的具体对象,该程序则通过识别列表中的内容来转换
- “named”设定会对名称超过1字符的对象重新命名,如果(一般是线和圆)出现这种情况,请在gmt文件中自行调整
- 由于gmt文件的复杂性,“rules”目前无法在ggb中设定,如有需要,请在转换后的gmt文件中自行添加
- 对象名称对照表会在终端输出,可以进行对照(当然也可以直接硬读gmt)
操作方法:
- 列表操作方法
- 使用工具栏中的“列表”工具,右键框选一个矩形,其中的对象将会被放入一个新列表
- 这种方法至少要框选2个对象,并且框选不了直线,列表名也是默认的,需要后期手动调整
- 直接在指令栏中创建新列表(如包含A、B、c的列表l1则输入“l1={A, B, c}”回车)
- 这种方法可以自定义名字,但是不能手选对象,需要记住对象的名称
- 双击代数区中已经创建的列表,进行修改(推荐)
- 可以点击选择代数区或者绘图区的对象,相对更方便
- 可以先随意创建一个列表,然后再按此方法操作
- 使用工具栏中的“列表”工具,右键框选一个矩形,其中的对象将会被放入一个新列表
- 依次创建下列列表,并将相应的对象选入:
- “initial”
- “named”(如果需要则写)
- “movepoints”(如果需要则写)
- “result”(如果有多个就在后面加数字,如“result1”“result2”等)
- “display”(即result冒号后的内容,如果需要则写;如果有多个就在后面加数字,如“display1”“display2”等,但需要对应)
- “explore”
将ggb文件与py文件放于同一目录(目录下只能有一个待转换的ggb文件),运行py程序,便可得到一个gmt文件
如果转换后gmt中出现了错误(可能会在终端提示,或转换成一条注释),请仔细检查ggb的绘制是否完全按照以上要求进行
注:考虑到使用人群的特点,暂时不开发本工具
将gmt文件转换成ggb文件的python程序
有关gmt的语法结构,已经在参考文档中详细说明。如果要编辑gmt文件,可以按其中的规则或以gmt vsc扩展为辅助编写
须知:
gmt文件的游戏设定中的initial、named、movepoints、result、explore部分会转换成可见对象,其余则隐藏