Files
dsProject/dsLightRag/static/ggb_draw_3d.html

239 lines
8.3 KiB
HTML
Raw Normal View History

2025-08-14 15:45:08 +08:00
<!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=4Z=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>