Hotdry.
application-security

浏览器龟图引擎:Turtletoy 的轻量级 Canvas 解释器

纯 JS 实现的浏览器龟图平台,支持实时预览、代码高尔夫竞赛与生成艺术分享,详解 API 参数、交互变量与 plotter 导出优化。

Turtletoy 是一个优秀的浏览器端龟图引擎,完全基于纯 JavaScript 和 HTML Canvas 实现 Logo 风格的龟图编程。它摒弃了复杂依赖,通过极简 API 让开发者在浏览器中即时创建生成艺术,支持代码高尔夫竞赛、实时动画预览和社区分享。这种轻量级设计不仅降低了门槛,还确保了输出兼容物理绘图仪(plotter),是 Web 生成艺术领域的典范。

核心机制是 “全局代码 + walk 循环”。全局代码执行一次,用于初始化龟对象、设置画笔和位置。例如,创建一个龟并定位:

const turtle = new Turtle();
turtle.penup();  // 抬笔,避免初始线条
turtle.goto(-50, -20);  // 绝对定位到 (-50, -20)
turtle.pendown();  // 落笔开始绘图

随后定义 walk 函数,它接收迭代计数 i(从 0 开始递增),每次调用执行一步动作,直至返回 false 停止。Canvas 每约 100 次调用(~16ms)更新一次,实现流畅动画效果。例如,五角星绘制:

function walk(i) {
    turtle.forward(100);  // 前进 100 像素
    turtle.right(144);    // 右转 144 度
    return i < 4;         // i<4 时继续
}

这种分离设计确保响应性:复杂计算分步进行,避免阻塞 UI。证据来自官方语法文档,强调 walk 用于渐进渲染,适合浏览器环境。

关键 API 聚焦移动、转向和状态查询,支持克隆多龟协同绘图:

  • 移动forward(distance)/fd() 前进,backward(distance)/bk() 后退,goto(x,y)/setpos() 绝对位移(落笔绘线),jump(x,y)/jmp() 瞬移(无线)。
  • 转向right(angle)/rt()left(angle)/lt(),默认度数,可用 degrees(360)radians() 切换。setheading(angle)/seth() 绝对朝向,home() 归零。
  • 高级circle(radius, extent, steps) 画弧 / 圆,clone() 复制龟。
  • 画笔pendown()/pd()/down()penup()/pu()/up()
  • 查询pos() 返回 [x,y],heading()/h() 朝向,isdown() 笔状态。

单位全像素,坐标系原点居中,方形 Canvas。角度默认 360 度全圆。实际落地时,参数需考虑 Canvas 尺寸(默认~400x400),前进距离宜 10-200 像素,避免溢出。

为工程化,Turtletoy 引入 “可调变量”(adjustable variables),通过特殊注释定义 UI 控件。声明如:

const grid = 11; // min=5, max=50, step=1 网格尺寸
const mode = 2;  // min=0, max=2, step=1, (渐变, 涡流, 流场) 绘图模式
const path = `M57,61C-72,51 -23,-84 36,-67`; // type=path, 点击重绘路径

数值变量生成滑块,下拉需选项数匹配步长间隔;字符串用 type=string;路径添加绘图按钮。描述文本悬停提示,提升交互。全局设置 Canvas.setpenopacity(opacity)(-1~1,负值反转黑白),仅一次调用,确保一致性。

性能参数清单:

  • 迭代上限:walk 中 i<1000,避免无限循环卡死浏览器。
  • 步长优化:steps 在 circle 中自动计算,复杂图案设 32-128。
  • 动画帧率:~60fps,~16ms/100 步,适合现代浏览器(Chrome/Edge/Firefox/Safari)。
  • 内存监控:克隆龟 <10 个,SVG 导出前优化路径(UI 选项:拆分段、plotter 最小笔移 O (N^2))。
  • 回滚策略:复杂 walk 加 if (i > 5000) return false; 防崩溃。

生成艺术应用中,Turtletoy excels 于 code golf:最小代码产复杂图案,如 L-system 分形、Truchet 瓷砖(社区标签)。实时预览 + 分享链接,便于竞赛评测。导出 SVG(带裁剪 / 作物标记 / 作者 info),尺寸 mm 单位,优化后笔迹连续最小化抬笔。

示例:参数化分形树,调整分支角 / 长度:

Canvas.setpenopacity(1);
const angle = 30; // min=20, max=60, step=5 分支角
const len = 120;  // min=80, max=200, step=10 初始长

const turtle = new Turtle();
function branch(l, a) {
    if (l < 5) return false;
    turtle.forward(l);
    const t1 = turtle.clone();
    const t2 = turtle.clone();
    turtle.left(a);
    branch(l * 0.7, a);
    turtle.back(l * 0.7);
    turtle.right(a * 2);
    branch(l * 0.7, a);
    turtle.back(l * 0.7);
    turtle.left(a);
    turtle.back(l);
    return true;
}
function walk(i) {
    if (i === 0) {
        turtle.left(90);
        branch(len, angle);
    }
    return false;
}

调整 angle/len 实时变幻,导出 SVG 直送 plotter。风险:浏览器兼容旧版 Canvas 2D,重载计算(如 raytracer 标签)用 Worker 模拟,但平台无内置。

监控要点:社区浏览 newest/loved,标签 fractal (27)/lsystem (18),点赞反馈流行度。分享策略:标题 / 描述 / 可见性设置,许可 CC-BY-NC-SA 4.0。

Turtletoy 证明:限制激发创意,轻量 Canvas 解释器完美平衡教育、艺术与工程。

资料来源

查看归档