将笔画数据转换为 SCG Ink 格式

ant*_*ice 3 javascript parsing mathematical-expressions inkml

我想将Seshat(一种手写数学表达式解析器)用于我正在处理的项目,但我在理解如何为程序提供正确的输入、InkML 或 SCG Ink 文件时遇到了一些麻烦。

我已经仔细查看了此处存在的在线示例,我看到他们从应用了此 JS 库的 HTML Canvas 字段中获取了一个 Javascript 笔划信息数组,但我不知道该数组之后会发生什么被发布到他们的服务器。

我已经阅读了SCG Ink 规范,我认为将数组解析为格式可能相对容易,但我希望有一些明显的我遗漏的东西会使这变得微不足道。任何帮助将不胜感激。

ant*_*ice 5

我给 Seshat 作者发了电子邮件,他建议我将输入转换为 SCG Ink,如果您使用http://cat.prhlt.upv.es/mer/ 上使用的 JavaScript 库,结果会很容易。具体来说,除了常规的旧 jQuery 之外,您还需要jquery.sketchable.memento.min.jsjquery.sketchable.min.jsjsketch.min.js。这是我所做的,以防其他人对 Seshat 感兴趣。

请注意,在同一页面中,main.js他们使用以下代码块将 Sketchable 库应用于 HTML 画布区域:

var $canvas = $('#drawing-canvas').sketchable({
  graphics: {
    strokeStyle: "red",
    firstPointSize: 2
  }
});
Run Code Online (Sandbox Code Playgroud)

现在我们可以看看它们的submitStrokes()功能,看看如何从 Sketchable 中提取笔划并转换为 SCG Ink。该行var strokes = $canvas.sketchable('strokes');获取笔画,然后该行strokes = transform(strokes);应用快速转换以仅提取他们需要的数据。下面是transform()函数供参考:

function transform(strokes) {
  for (var i = 0; i < strokes.length; ++i)
    for (var j = 0, stroke = strokes[i]; j < stroke.length; ++j)
        strokes[i][j] = [ strokes[i][j][0], strokes[i][j][1] ];
  return strokes;
};
Run Code Online (Sandbox Code Playgroud)

返回的值transform()是笔画和点的三维数组。(第一个维度的每个元素是一个笔划,第二个维度的每个元素是一个点,第三个维度是 x-,y-坐标。)在那个站点上,他们继续将该数组 POST 到必须处理的服务器最终转换为 SCG Ink。我写了一个 JavaScript 函数来处理它:

function strokesToScg(strokes) {
  var scg = 'SCG_INK\n' + strokes.length + '\n'
  strokes.forEach(function (stroke) {
    scg += stroke.length + '\n'
    stroke.forEach(function (p) {
      scg += p[0] + ' ' + p[1] + '\n'
    })
  })

  return scg
}
Run Code Online (Sandbox Code Playgroud)

就是这样。返回的值strokesToScg()是一个字符串,以 SCG Ink 格式描述一系列笔画。