239 lines
8.3 KiB
HTML
239 lines
8.3 KiB
HTML
|
<!DOCTYPE html>
|
|||
|
<html>
|
|||
|
<head>
|
|||
|
<title>GeoGebra 3D 计算器</title>
|
|||
|
<meta charset="utf-8">
|
|||
|
<script src="js/deployggb.js"></script>
|
|||
|
<style>
|
|||
|
/* 原样式全部沿用,添加新的按钮样式 */
|
|||
|
.app-container{display:flex;gap:10px;padding:10px}
|
|||
|
#controlPanel{display:flex;flex-direction:column;gap:10px;min-width:620px}
|
|||
|
.control-btn{padding:8px 12px;background:#4CAF50;color:white;border:none;border-radius:4px;cursor:pointer;font-size:14px}
|
|||
|
.control-btn:hover{background:#45a049}
|
|||
|
/* 新增:案例按钮容器 */
|
|||
|
.example-btns{display:flex;gap:10px;margin-bottom:10px;flex-wrap:wrap}
|
|||
|
/* 新增:矩形旋转按钮样式 - 蓝色 */
|
|||
|
.btn-rect{background:#2196F3}
|
|||
|
.btn-rect:hover{background:#0b7dda}
|
|||
|
/* 新增:三角形旋转按钮样式 - 橙色 */
|
|||
|
.btn-tri{background:#FF9800}
|
|||
|
.btn-tri:hover{background:#e68a00}
|
|||
|
/* 新增:梯形旋转按钮样式 - 紫色 */
|
|||
|
.btn-trapezoid{background:#9C27B0}
|
|||
|
.btn-trapezoid:hover{background:#7B1FA2}
|
|||
|
/* 新增:棱柱展开图按钮样式 - 深绿色 */
|
|||
|
.btn-prism{background:#388E3C}
|
|||
|
.btn-prism:hover{background:#2E7D32}
|
|||
|
/* 新增:棱锥展开图按钮样式 - 红色 */
|
|||
|
.btn-pyramid{background:#F44336}
|
|||
|
.btn-pyramid:hover{background:#D32F2F}
|
|||
|
.command-input{width:100%;min-height:150px;margin:10px 0;padding:8px;border:1px solid #ccc;border-radius:4px;font-family:monospace;font-size:14px;white-space:pre-wrap;word-wrap:break-word;line-height:1.5;box-sizing:border-box}
|
|||
|
</style>
|
|||
|
</head>
|
|||
|
<body>
|
|||
|
<h1>几何题图形交互功能演示(3D 版)</h1>
|
|||
|
|
|||
|
<div class="app-container">
|
|||
|
<div id="ggbApplet"></div>
|
|||
|
<div id="controlPanel">
|
|||
|
<textarea id="commandInput" class="command-input" placeholder="请输入Geogebra 3D指令运行。"
|
|||
|
></textarea>
|
|||
|
<!-- 调整:将案例按钮移到最上方并放在同一行 -->
|
|||
|
<div class="example-btns">
|
|||
|
<button id="rotateRectangle" class="control-btn btn-rect">矩形旋转一周</button>
|
|||
|
<button id="rotateRightTriangle" class="control-btn btn-tri">直角三角形旋转一周</button>
|
|||
|
<button id="rotateTiXing" class="control-btn btn-trapezoid">梯形旋转一周</button>
|
|||
|
<button id="prismNet" class="control-btn btn-prism">棱柱展开图</button>
|
|||
|
<button id="pyramidNet" class="control-btn btn-pyramid">棱锥展开图</button>
|
|||
|
</div>
|
|||
|
<button id="aiJieXi" class="control-btn">AI 解析指令</button>
|
|||
|
<button id="executeCommands" class="control-btn">执行指令</button>
|
|||
|
<button id="clearCanvas" class="control-btn">清空画布</button>
|
|||
|
</div>
|
|||
|
</div>
|
|||
|
|
|||
|
<script>
|
|||
|
/* ========== 1. 初始化 3D 计算器 ========== */
|
|||
|
const params = {
|
|||
|
appName: "3d", // 关键:指定 3D
|
|||
|
// 核心:强制加载中文本地化
|
|||
|
language: "zh_CN", // ← 关键
|
|||
|
locale: "zh_CN", // 确保区域设置为中文
|
|||
|
country: "CN", // 新增:指定国家代码
|
|||
|
useBrowserLocale: false, // 新增:不使用浏览器区域设置
|
|||
|
useBrowserForJS: true, // 允许中文输入法正常触发
|
|||
|
width: 1024,
|
|||
|
height: 600,
|
|||
|
showToolBar: true,
|
|||
|
showAlgebraInput: true,
|
|||
|
showMenuBar: true,
|
|||
|
appletOnLoad(api) {
|
|||
|
console.log("GeoGebra 3D applet loaded");
|
|||
|
window.ggbApi = api;
|
|||
|
}
|
|||
|
};
|
|||
|
|
|||
|
const ggbApplet = new GGBApplet(params, true);
|
|||
|
window.addEventListener("load", () => ggbApplet.inject("ggbApplet"));
|
|||
|
</script>
|
|||
|
|
|||
|
<script>
|
|||
|
/* ========== 2. 其余交互逻辑完全沿用 ========== */
|
|||
|
/* 函数 stripGGBComments、按钮事件绑定等均无需改动 */
|
|||
|
document.getElementById("clearCanvas").addEventListener("click", function () {
|
|||
|
if (confirm("确定要刷新页面吗?这将重置所有操作。")) {
|
|||
|
// 重新加载当前页面,相当于按F5
|
|||
|
location.reload();
|
|||
|
}
|
|||
|
});
|
|||
|
|
|||
|
document.getElementById("aiJieXi").addEventListener("click", function () {
|
|||
|
document.getElementById("commandInput").value =
|
|||
|
`# 3D 示例:四面体
|
|||
|
A=(0,0,0)
|
|||
|
B=(4,0,0)
|
|||
|
C=(2,3,0)
|
|||
|
D=(2,1,4)
|
|||
|
Segment(A,B)
|
|||
|
Segment(B,C)
|
|||
|
Segment(C,A)
|
|||
|
Segment(A,D)
|
|||
|
Segment(B,D)
|
|||
|
Segment(C,D)`;
|
|||
|
});
|
|||
|
|
|||
|
document.getElementById("executeCommands").addEventListener("click", execLines);
|
|||
|
|
|||
|
document.getElementById("rotateRectangle").addEventListener("click", function () {
|
|||
|
document.getElementById("commandInput").value =
|
|||
|
`# 构造三维坐标的矩形
|
|||
|
q1 = Polygon((0, 0, 0), (1, 0, 0), (1, 0, 3), (0, 0, 3))
|
|||
|
|
|||
|
|
|||
|
# 创建滑动条:
|
|||
|
α = Slider(0°, 360°)
|
|||
|
|
|||
|
|
|||
|
# 至于将矩形旋转一周,可当做是逐渐产生一系列绕着z轴的矩形
|
|||
|
l1 = Sequence(Rotate(q1, k, zAxis), k, 0°, α, 0.5°)
|
|||
|
|
|||
|
|
|||
|
#拉动滑动条α,即有将矩形旋转一周,生成圆柱的效果。`;
|
|||
|
});
|
|||
|
|
|||
|
document.getElementById("rotateRightTriangle").addEventListener("click", function () {
|
|||
|
document.getElementById("commandInput").value =
|
|||
|
`# 创建直角三角形顶点(直角在原点B)
|
|||
|
B = (0, 0, 0) # 直角顶点(原点)
|
|||
|
A = (4, 0, 0) # X轴上的顶点(AB为直角边)
|
|||
|
C = (0, 0, 7) # Z轴上的顶点(BC为直角边)
|
|||
|
|
|||
|
|
|||
|
# 构建直角三角形(确保直角在B点)
|
|||
|
tri = Polygon(A, B, C)
|
|||
|
|
|||
|
|
|||
|
# 创建旋转控制滑动条 (0-360度)
|
|||
|
θ = Slider(0°, 360°)
|
|||
|
|
|||
|
|
|||
|
# 创建绕Z轴旋转序列(步长0.6°)
|
|||
|
rotatedTris = Sequence(Rotate(tri, k, zAxis), k, 0°, θ, 0.6°)`;
|
|||
|
});
|
|||
|
|
|||
|
document.getElementById("rotateTiXing").addEventListener("click", function () {
|
|||
|
document.getElementById("commandInput").value =
|
|||
|
`# 定义直角梯形顶点(在XZ平面,Y=0)
|
|||
|
A = (0, 0, 0) # 原点(直角顶点)
|
|||
|
B = (6, 0, 0) # X轴上的点(下底长度=6)
|
|||
|
C = (4, 0, 4) # 斜边顶点(X=4,Z=4)
|
|||
|
D = (0, 0, 4) # Z轴上的点(上底长度=4,高度=4)
|
|||
|
|
|||
|
# 创建直角梯形(顶点顺序:A→B→C→D)
|
|||
|
trapezoid = Polygon(A, B, C, D)
|
|||
|
|
|||
|
# 创建旋转控制滑动条 (0-360度)
|
|||
|
θ = Slider(0°, 360°)
|
|||
|
|
|||
|
# 创建绕Z轴旋转序列(步长0.6°)
|
|||
|
rotatedTrapezoids = Sequence(Rotate(trapezoid, k, zAxis), k, 0°, θ, 0.6°)
|
|||
|
`;
|
|||
|
});
|
|||
|
|
|||
|
// 新增:棱柱展开图按钮事件
|
|||
|
document.getElementById("prismNet").addEventListener("click", function () {
|
|||
|
document.getElementById("commandInput").value =
|
|||
|
`# 棱柱展开图演示
|
|||
|
# 创建边数滑动条(3-8边)
|
|||
|
n = Slider(3, 8, 1)
|
|||
|
|
|||
|
# 创建高度滑动条
|
|||
|
h = Slider(3, 8)
|
|||
|
|
|||
|
# 创建展开控制滑动条
|
|||
|
k = Slider(0, 1)
|
|||
|
|
|||
|
# 构造棱柱(基于正多边形)
|
|||
|
a = Prism(Polygon((-1, 0, 0), (1, 0, 0), n), h)
|
|||
|
|
|||
|
# 生成展开图
|
|||
|
Net(a, k)
|
|||
|
`;
|
|||
|
});
|
|||
|
|
|||
|
// 新增:棱锥展开图按钮事件
|
|||
|
document.getElementById("pyramidNet").addEventListener("click", function () {
|
|||
|
document.getElementById("commandInput").value =
|
|||
|
`# 棱锥展开图演示
|
|||
|
# 创建边数滑动条(3-8边)
|
|||
|
n = Slider(3, 8, 1)
|
|||
|
|
|||
|
# 创建高度滑动条
|
|||
|
h = Slider(3, 8)
|
|||
|
|
|||
|
# 创建展开控制滑动条
|
|||
|
k = Slider(0, 1)
|
|||
|
|
|||
|
# 构造棱锥(基于正多边形)
|
|||
|
a = Pyramid(Polygon((-1, 0, 0), (1, 0, 0), n), h)
|
|||
|
|
|||
|
# 生成展开图
|
|||
|
Net(a, k)
|
|||
|
|
|||
|
# 提示:调整k滑动条查看不同展开状态`;
|
|||
|
});
|
|||
|
|
|||
|
function stripGGBComments(raw) {
|
|||
|
return raw.split('\n')
|
|||
|
.map(l => l.replace(/#.*$/, '').trim())
|
|||
|
.filter(l => l.length > 0)
|
|||
|
.join('\n');
|
|||
|
}
|
|||
|
|
|||
|
function execLines() {
|
|||
|
if (!window.ggbApi) { alert("GeoGebra 未加载完成"); return; }
|
|||
|
const lines = document.getElementById("commandInput").value
|
|||
|
.split('\n')
|
|||
|
.map(l => stripGGBComments(l))
|
|||
|
.filter(l => l);
|
|||
|
if (!lines.length) { alert("请输入至少一条指令"); return; }
|
|||
|
|
|||
|
let ok = 0, err = 0, fails = [];
|
|||
|
lines.forEach((cmd, idx) => {
|
|||
|
try {
|
|||
|
// 尝试直接执行中文指令
|
|||
|
window.ggbApi.evalCommand(cmd);
|
|||
|
ok++;
|
|||
|
} catch (e) {
|
|||
|
// 如果失败,尝试记录详细错误信息
|
|||
|
console.error(`执行指令失败: ${cmd}`, e);
|
|||
|
err++;
|
|||
|
fails.push(`${idx + 1}: ${cmd} (${e.message})`);
|
|||
|
}
|
|||
|
});
|
|||
|
|
|||
|
if (err) alert(`成功 ${ok} 条,失败 ${err} 条\n${fails.join('\n')}`);
|
|||
|
}
|
|||
|
</script>
|
|||
|
</body>
|
|||
|
</html>
|