Нужен ли paper-jsdom-canvas для использования метода упрощения в paper.js из nodejs?

Я пытаюсь упростить нарисованный от руки путь, используя отличный метод path.simplify из paper.js для создания плавных кривых после того, как пользователь закончит рисовать. Поскольку это для вывода не HTML (TV Telestration), я пытаюсь создать микросервис в 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


person Alex Fraser    schedule 06.02.2019    source источник


Ответы (1)


Я думаю, что ваша ошибка здесь:

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);
}

Обратите внимание на ключевое слово of, заменяющее in в цикле for.
На самом деле вы перебираете ключи, а не значения.

person sasensi    schedule 08.02.2019
comment
Привет, сасенси! Спасибо за вашу помощь. На самом деле петля, о которой вы упомянули, была частью проблемы. Я внес изменения в forEach, чтобы избежать асинхронного поведения, и ввел эту ошибку. У меня была вторая проблема с сериализацией точек, которые я передавал (это были массивы, а не объекты), но ваш ответ позволил решить остальную часть проблемы. На самом деле циклы работали, но возвращали только индексы, а затем их свойства были все неопределенное. - person Alex Fraser; 08.02.2019