题目文件格式
应用通过 JSON 文件导入题目。请按下面的结构编写题目文件,再从练习页面右上角导入。
{
"title": "题目标题",
"prompt": "题目描述",
"grid": { "width": 10, "height": 8 },
"points": [
{ "id": "A", "x": 2, "y": 2 },
{ "id": "B", "x": 8, "y": 2 }
],
"segments": [{ "a": "A", "b": "B" }],
"arcs": [
{ "center": "A", "radius": 3, "startAngle": 0, "endAngle": 180 }
],
"relations": [
{ "expression": "equal(length(['A', 'B']), length(['B', 'C']))", "label": "AB = BC" }
],
"hint": "提示内容",
"answer": "答案或证明过程"
}
字段
grid.width、grid.height:网格宽高,分别限制为 2–24 和 2–18。points:已知点,坐标从左上角(0, 0)开始,x 向右、y 向下;点名在整道题中唯一。segments:题目给出的线段,端点引用points中的id。arcs:圆弧。圆心可以写点名,也可以写{ "x": 5, "y": 4 };角度以向右为 0°,按数学定义逆时针增加;clockwise: true可改为顺时针,fullCircle: true可画整圆。relations:判定条件数组。每项需要expression,可选label用作页面显示的条件名称;页面只展示 label。relations[].expression:支持数字、字符串、布尔值、数组、括号、!、四则运算、比较、&&、||,以及length、angle、toLength、toAngle、parallel、perpendicular、equal、hasSegment、pointOnLine、pointSide。toLength(x)和toAngle(x):把数值转换为可参与判定比较的长度量和角度量。长度以网格边长为 1,角度单位为度,例如length(['A', 'B']) == toLength(3)、angle(['A', 'B', 'C']) == toAngle(90)。- 角度相等的默认容差为
0.035°:==、===和equal(a, b)都允许这个范围内的差值。例如 89.98° 与 90° 判为相等,89.96° 与 90° 判为不相等。可用equal(angle(['A', 'B', 'C']), toAngle(90), 0.1)将本条比较的容差设为0.1°;比较还会计入浮点运算的误差保护。angle(['A', 'B', 'C'])表示以 B 为顶点的 0–180° 夹角,两条边必须已经存在于题面或用户作图中。缩放画布不会改变判定结果。 hint、answer:可选文本,分别通过题目卡片中的按钮显示。
作图说明
连线时第一次点击起点,移动鼠标会自动吸附到最近交点,第二次点击固定线段。切换到“延长线段”后,连续点击两个点确定射线方向,移动鼠标后第三次点击提交。按住 Ctrl 并拖动画布可以平移,缩放滑块与加减按钮共同控制缩放。
“标记答案点”模式要求先输入点名,再点击任意题面点或几何交点。这个标记可以在判定表达式中引用,并支持撤销/重做。