ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

如何画一条隐式曲线、一面隐式曲面:Grafar vsolve 牛顿法求解实战指南

如何画一条隐式曲线、一面隐式曲面:Grafar vsolve 牛顿法求解实战指南 如何画一条隐式曲线、一面隐式曲面Grafar vsolve 牛顿法求解实战指南【免费下载链接】grafarReactive multidimensional math data visualization for the web.项目地址: https://gitcode.com/gh_mirrors/gr/grafarGrafar是一个基于 WebGL 的 JavaScript 响应式数学可视化库其中的vsolve方法内置牛顿法Newtons method让你用一行代码就能绘制任意隐式曲线和隐式曲面——无需手动采样、无需网格剖分只需写出方程 f(x, y, z) 0。什么是隐式图形多数绘图库习惯用参数方程描述形状给 t算出 (x(t), y(t))。但很多漂亮的形状天然以隐式方程存在比如球面x² y² z² 2超椭圆squirclex⁴ y⁴ 3它们的共同点是用方程定义零点集合zero set而不是用参数遍历。这正是 Grafar 的vsolve擅长处理的问题给定一个函数 f自动求出满足 f 0 的点集。核心实现位于两个文件中src/math/newton.ts—— 牛顿法迭代器src/generators.ts中的vsolve函数约第 120 行vsolve 的完整用法三参数一行出图vsolve的签名很简单三个核心参数grafar.vsolve( v Math.pow(v[0], 4) Math.pow(v[1], 4) - 3, // 1. 隐式函数 f 5000, // 2. 要生成的点数 2 // 3. 维度2曲线3曲面 )参数含义说明f隐式函数接收一个坐标数组v返回 f(v) 的值求解目标为 f(v) 0size点数生成多少个点曲面建议 3~5 万点曲线 5 千点足够dof自由度/维度2 维画平面曲线3 维画空间曲面⚠️ 注意f接收的是单个数组参数v[0]、v[1]…这与 Grafar 中map()的多参数风格不同。官方教程 docs/tutorial/5-implicit.md 中给出了这两个经典用例完整可运行的 HTML 示例见 examples/implicit_3d.html。实战一绘制隐式曲线二维画一条四阶超椭圆曲线只需将点集select()后交给面板const curve grafar.vsolve( v Math.pow(v[0], 4) Math.pow(v[1], 4) - 3, 5000, 2 ).select(); grafar.pin(curve, grafar.panel(document.getElementById(icurve)).setAxes([x, y]));.setAxes([x, y])会把面板固定为二维视图适合绘制平面曲线。实战二绘制隐式曲面三维把维度改为 3方程换成x³ y² z² 2就得到一个有趣的非对称水滴形曲面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)));曲面渲染为点云配合 libs/OrbitControls.js 提供的轨道控制可以用鼠标自由旋转、缩放观察。揭秘vsolve 内部如何用牛顿法求解vsolve并不暴力枚举网格而是采用随机探测 牛顿迭代策略整体分两步见src/generators.ts第 134~200 行第一步探测与估计estimator随机撒 100 个点范围约 [-10, 10]对每个点执行牛顿迭代。成功收敛到 f ≈ 0 的点用于统计均值mean和散布spread——相当于先侦察零点大概在哪里、分布多广。第二步批量生成constructor在统计出的分布范围内用随机化src/math/randomize.ts生成全部 size 个初始点再逐点跑牛顿迭代把每个点吸附到零点上。牛顿迭代本体在 src/math/newton.ts 中逻辑非常精炼计算当前值val f(pt)和梯度gradf用-val / |∇f|²做后验误差估计得到移动步长沿梯度方向移动pt posterr * nabla若偏移量小于容差tol默认 0.001配置于 src/config.ts判定收敛并返回超过最大迭代次数默认 30 次仍未收敛则返回 0梯度计算本身也很轻量src/math/grad.ts 用前向差分近似偏导原地修改坐标数组以避免额外内存分配对 5 万个点的批量求解性能很友好。 小贴士vsolve还支持{ neq: true }选项acceptNeg此时 f(pt) ≤ 0 即视为收敛——用于求解不等式、绘制区域填充。最佳实践与常见坑对象要平滑、有界、靠近原点vsolve的点探测围绕零点展开零点飘在很远处的方程如 f x - 1000可能探测失败点数别吝啬曲面至少 2~3 万点才够密但也不必上百万渲染和求解都会变慢输出是点云目前vsolve生成的是粒子点云没有面片/边追求实体感的场景请调小particleRadius并增加点数响应式友好vsolve生成的是标准 Generator接入 Grafar 的响应式数据流后改变方程参数即可动画化隐式曲面可参考 examples/implicit_animation.html 与 examples/animated_levelset.html小结用 Grafar 画隐式图形只需三步写出 f 0 → 调用vsolve→ pin 到 panel。牛顿法的收敛细节、梯度差分、容差配置全部由库内部自动处理你可以把精力集中在想画什么方程上而不是怎么采样。想继续深入推荐阅读完整教程docs/tutorial/从绘图基础到动画与交互API 参考docs/api.md更多隐式示例examples/implicit_intersection.html、examples/implicit_animation.html【免费下载链接】grafarReactive multidimensional math data visualization for the web.项目地址: https://gitcode.com/gh_mirrors/gr/grafar创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表