我是否需要paper-jsdom-canvas来使用来自nodejs的paper.js中的简化方法?

时间:2019-02-06 12:55:03

标签: node.js paperjs jsdom

我正在尝试使用paper.js的出色的path.simplify方法简化手绘路径,以在用户完成绘制后生成平滑曲线。因为这是用于非HTML输出(电视电视),所以我试图在nodejs中创建微服务以获取点并输出所生成的简化曲线的控制点。

我尝试使用paper-jsdom,该方法有效并且没有抱怨,但始终输出所有点上零坐标的单个线段。我想知道我是否应该使用paper-jsdom-canvas来获取适当的输出。

这是我要构建的节点模块:

const Path = require('paper').Path
const Point = require('paper').Point
const Project = require('paper').Project

// the next line produces side effects without which 
// the code will not run, but I'm not sure this is the way to go.
let p = new Project() 

function simplify (points) {
  let pts = []
  for (let point in points) {
    let pt = new Point(point.x, point.y)
    pts.push(pt)
  }
  let path = new Path({
    segments: pts,
    strokeColor: 'black',
    fullySelected: false
  })
  path.simplify(10)

  let simplePath = []
  for (const segment of path.segments) {
    // only one segment reaches this point
    // with all zeros in all the parameters
    console.log(segment.path)
    simplePath.push(
      {
        handleIn: { x: segment.handleIn.x, y: segment.handleIn.y },
        handleOut: { x: segment.handleOut.x, y: segment.handleOut.y },
        point: { x: segment.point.x, y: segment.point.y }
      })
    console.log(`
    hi   : (${segment.handleIn.x}, ${segment.handleIn.y})
    ho   : (${segment.handleOut.x}, ${segment.handleOut.y})
    point: (${segment.point.x}, ${segment.point.y})`)
  }
  return simplePath
}
module.exports = simplify

1 个答案:

答案 0 :(得分:2)

我认为您的错误在这里:

for (let point in points) {
    let pt = new Point(point.x, point.y);
    pts.push(pt);
}

如果我认为变量points包含对象数组,则应该改用:

for (let point of points) {
    let pt = new Point(point.x, point.y);
    pts.push(pt);
}

请注意,for循环中的关键字of替换了in
您实际上是在遍历键而不是值。