最近看到 写 Rust 函数,免费树莓派 的活动,便了解了一下 SSVM, 对我来说 ssvmup 与 wasm-pack 相比最方便的一点是:
除了在 Rust 和 JavaScript 之间传递字符串值外,ssvmup 工具还支持以下数据类型。
- Rust 调用的参数可以是
i32
,String
,&str
,Vec<u8>
和&[u8]
的任意组合- 返回值可以是
i32
或String
或Vec<u8>
- 对于像结构这样的复杂数据类型,可以使用 JSON 字符串传递数据
对 Vec<u8> 的支持可以不用再 通过 buffer + pointer 的方式共享数据,使用起来非常方便。
万花尺
万花尺原理:
万花尺轨迹性质研究 万花尺轨迹性质研究_万花尺算法_Jcldcdmf的博客-CSDN博客
利用三角函数绘制万花尺图案属于计算较多的场景了,这里实现的 Rust 函数为:绘制万花尺图案并编码为 PNG 格式。
其实这个场景更适合在 web 端完成,绘制好的图案不用编码直接作为 canvas 数据展示,更加高效。
这里为了体验 SSVM ,把 Rust 函数编译为 wasm 后供 nodejs 调用,在服务端生成图片返给 web 端。
最终效果
功能实现
万花尺图案绘制相关的参数有:大圆半径、小圆半径、绘制点到小圆圆心的距离、当前小圆顺大圆转动的角度 alpha、小圆自转的角度 beta 、以及画笔颜色。
此处将小圆运动相关上下文抽象为结构体 Pannel, 为其实现 2 个方法:
- 移动:小圆顺着大圆滚动指定的角度 delta,更新 alpha 和 beta。不断以较小值的 delta 移动小圆,便是对其运动的模拟
- 计算当前画笔位置:随着小圆的运动&#