如何在10分钟内画出第一个3D数学曲面:Grafar快速上手完整教程
如何在10分钟内画出第一个3D数学曲面Grafar快速上手完整教程【免费下载链接】grafarReactive multidimensional math data visualization for the web.项目地址: https://gitcode.com/gh_mirrors/gr/grafarGrafar是一个运行在浏览器里的 JavaScript 库专为3D 数学可视化与数据可视化而生。它基于 WebGLThree.js渲染核心卖点是响应式Reactive你定义好变量之间的依赖关系后Grafar 会自动追踪数据变化并实时刷新画面。本教程带你用不到 10 分钟从零画出第一个可以旋转、拖拽的 3D 数学曲面。 为什么选择 Grafar3 个核心理由特性说明响应式数据流修改一个变量所有依赖它的曲线、曲面自动重算刷新无需手动刷新完整的 3D 体验内置 3D 视口鼠标即可旋转、缩放观察曲面高级拓扑推断两个一维区间做map自动得到曲面一个区间得到曲线——不用手写网格对于传统图表库如 d3难以呈现的大量数据点和连续数学对象Grafar 是更合适的选择。 准备工作2 步装好 Grafar1 分钟方式一npm 安装推荐npm install grafar方式二从源码构建git clone https://gitcode.com/gh_mirrors/gr/grafar cd grafar npm install npm run build # 产物在 build/grafar.js构建出的build/grafar.js是一个 UMD 模块可以直接用script标签引入网页。 如果你只想快速上手可以直接参考仓库里开箱即用的示例例如 3D 球面演示 examples/parametric_sphere.html。 第一步用生成器定义自变量2 分钟Grafar 的每个应用都从**生成器Generator**开始。生成器负责往数组里填数字并告诉 Grafar 点与点之间如何连接比如是离散点集还是连续区间。最常用的三个内置生成器grafar.range(a, b, n)在 a 到 b 之间均匀取 n 个点点之间相连模拟连续区间[a, b]grafar.seq(a, b, n)同样取 n 个点但点不相连得到离散点集grafar.set([...])直接包装一个数字数组生成器输出后需要调用.select()声明为自由变量。完整说明见docs/tutorial/2-generators.md。⚡ 第二步用 map() 一键生成 3D 数学曲面3 分钟这是 Grafar 最魔法的地方grafar.map()会自动追踪依赖并根据输入变量的维度推断输出对象的拓扑。一条规则搞定所有形状输入输出形状2 个range变量3D 数学曲面1 个range变量曲线rangeseq组合一组曲线线集下面这段核心代码就定义了一个波浪曲面 z cos(x)·sin(y)const x grafar.range(-1, 1, 100).select(); const y grafar.range(-1, 1, 100).select(); const z grafar.map([x, y], (x, y) Math.cos(x) * Math.sin(y));就这么简单——Grafar 会自动对 100×100 的每个 (x, y) 组合调用你的函数并推断出这是一个曲面。map的源码在src/grafar.ts拓扑推断逻辑位于src/core/topology/目录。️ 第三步pin() 上屏看到你的第一个曲面2 分钟Grafar 用Panel绑定在 DOM 节点上的 WebGL 画布来显示图形const container document.getElementById(render); const pan new grafar.Panel(container); // 创建 3D 面板 grafar.pin([x, y, z], pan); // 把曲面钉上去打开页面你就能看到第一个 3D 数学曲面鼠标拖拽即可旋转视角 还可以在同一面板叠加多个图形、动态着色// 叠加第二个曲面z 1 grafar.pin([x, y, grafar.map(z, z z 1)], pan); // 用 (x, y, z) 三个值作为 RGB 分量动态着色 grafar.pin({ axes: [x, y, z], color: [x, y, z] }, pan);想显示 2D 图只需pan.setAxes([x, y])并传入两个变量即可。Panel的实现见src/rendering/Panel.ts。 进阶玩法参数化曲面与隐式曲面3 分钟参数化曲面(p, q) → (x, y, z)当曲面难以写成 z f(x, y) 时比如球体用两个参数分别映射出 x、y、zconst t grafar.range(0, Math.PI, 30).select(); const p grafar.range(-Math.PI, Math.PI, 50).select(); grafar.pin([ grafar.map([t, p], (t, p) Math.sin(t) * Math.sin(p)), grafar.map([t, p], (t, p) Math.cos(t) * Math.sin(p)), grafar.map([t, p], (t, p) Math.cos(p)) ], pan3d); // 得到一个球面隐式曲面直接求解 f(x, y, z) 0grafar.vsolve内部使用牛顿迭代法直接对隐式方程采样求零点比如 x³ y² z² 2 这种写不出 z 的式子也能画const surf grafar.vsolve( v Math.pow(v[0], 3) Math.pow(v[1], 2) Math.pow(v[2], 2) - 2, 50000, // 采样点数 3 // 求解维度 ).select(); grafar.pin(surf, grafar.panel(document.getElementById(isurf))); 注意vsolve目前生成的是点云最适合绘制光滑、有界、靠近原点的物体。❓ 常见报错排查清单画面是空的→ 检查是否漏了.select()忘记调用则生成器不会参与响应式系统想要曲面却画出了一堆点→ 把range()换成了seq()seq不连接相邻点坐标系不对→ 用pan.setAxes([...])设置轴标签传 2 个标签可切换为 2D 模式粒子大小不合适→ 用grafar.setup({ particleRadius: 0.08 })调整全局渲染参数 继续学习Grafar 文档地图绘图与面板docs/tutorial/1-plotting.md生成器详解docs/tutorial/2-generators.mdmap() 与拓扑推断docs/tutorial/3-mapping.md参数化曲线/曲面docs/tutorial/4-parametric.md隐式曲面vsolvedocs/tutorial/5-implicit.md响应式与动画docs/tutorial/6-animations.md完整 API 参考docs/api.md更多可直接运行的示例examples/目录曲面、方向场、动画、隐式相交等小结Grafar 的完整工作流只有三步——生成器定义自由变量 →map()自动推断拓扑 →pin()上屏渲染。掌握这三步你就能在 10 分钟内画出自己的第一个 3D 数学曲面并继续探索动画、交互输入和数据可视化等更高级的功能。【免费下载链接】grafarReactive multidimensional math data visualization for the web.项目地址: https://gitcode.com/gh_mirrors/gr/grafar创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考