Как отформатировать массив координат в другую опорную точку

#javascript #arrays #pdf #pdfkit #dxf

#javascript #массивы #PDF #pdfkit #dxf

Вопрос:

Я огляделся и не смог найти никакой информации по этой теме … вероятно, потому, что я не могу точно воспроизвести свою проблему в поисковой системе.

Я пытаюсь взять необработанные линейные данные из формата dxf, отсортировать их по квадратам, найти центр каждого квадрата, пронумеровать центр и распечатать результат в формате pdf.

У меня есть структура данных, подобная следующей:

 [
[{x: 50, y:50}, {x:52, y:52}],
[{x: 52, y:52}, {x:54, y:54}],
[{x: 54, y:54}, {x:56, y:56}]...
]
 

Эти координаты получены в результате синтаксического анализа dxf с использованием dxf-parser, который возвращает массив объектов, описывающих путь линии. Четыре из них объединяются, чтобы создать квадрат, который я сегментирую, используя

   function chunkArrayInGroups(arr, size) {
    let result = [];
    let pos = 0;
    while (pos < arr.length) {
      result.push(arr.slice(pos, pos   size));
      pos  = size;
    }
    return resu<
  }
 

((Размер = 4))

По большей части это работает так, как задумано, за исключением того, что эти координаты были созданы с началом координат в центре экрана. Библиотека pdf, которую я использую для создания окончательного документа, не использует ту же систему координат. Я считаю, что он начинает начало координат в левом верхнем углу страницы. Это привело к тому, что все мои отрицательные значения ((Все, что слева от центра модели)) отрезали страницу.

Чтобы исправить это, я перебираю массив и собираю ‘0 — все значения x и y’ в новый массив, который я нахожу максимальным, чтобы дать мне мое смещение. Я добавляю это смещение к своим значениям x, прежде чем подключать их к моему pdf Creator для рисования линий.

Я не уверен, что является причиной этого, но результат — «стиль Да Винчи», как мне нравится его называть, он повернут на 180 градусов и записан в обратном направлении. Я думал, что добавление некоторого значения в каждую ячейку устранит негативную проблему … и это произошло, но данные по-прежнему относятся к центральному источнику. Есть ли способ переопределить эти данные для работы с этой библиотекой, или есть какая-то другая библиотека, где я могу отобразить эти данные, а также добавить текст в определенных местах, как того требует мой случай. Я хотел бы продолжать использовать эту библиотеку, поскольку я использую ее для других частей моей программы, но я открыт для новых и более эффективных идей.

Я ценю ваше время и опыт!

Как это должно выглядеть

Исходное изображение

Результат «Da Vinci’fied»

Текущий вывод

Копия кода:

 
const PDFDocument = require('pdfkit');
const doc = new PDFDocument({ autoFirstPage: true })
const DxfParser = require('dxf-parser')

let fileText = fs.readFileSync('fulltest.dxf', { encoding: 'utf-8' })
let data = []
let data2 = []
let data3 = []
let shiftx = []
let shifty = []
let factor = 5
var parser = new DxfParser();
let i = 0
doc.pipe(fs.createWriteStream('test.pdf'));
try {
  var dxf = parser.parseSync(fileText);
  let array = dxf.entities
  array.forEach(line => {
    if (line.layer === "Modules") {
      data.push(line.vertices)
    }
    if (line.layer === "Buildings") {
      data2.push(line.vertices)
    }
    if (line.layer === "Setbacks") {
      data3.push(line.vertices)
    }
    let segment = line.vertices
    segment.forEach(point => {
      shiftx.push(0 - point.x)
      shifty.push(0 - point.y)
    })

  })
  
  let shift = biggestNumberInArray(shiftx)

  console.log(shift)
  data = chunkArrayInGroups(data, 4)
  data.forEach(module => {
    let midx = []
    let midy = []
    module.forEach(line => {
      let oldx = (line[1].x   shift) * factor
      let oldy = (line[1].y   shift) * factor
      let newx = (line[0].x   shift) * factor
      let newy = (line[0].y   shift) * factor
      doc
        .moveTo(oldx, oldy)
        .lineTo(newx, newy)
        .stroke()
      midx.push(oldx   (newx - oldx) / 2)
      midy.push(oldy   (newy - oldy) / 2)
    })
    let centerx = (midx[0]   (midx[2] - midx[0]) / 2)
    let centery = (midy[0]   (midy[2] - midy[0]) / 2)
    let z = (i   1).toString()
    doc
      .fontSize(10)
      .text(z, centerx-5, centery-5)
    i  
  })

  data2.forEach(line => {
    let oldx = (line[0].x   shift) * factor
    let oldy = (line[0].y   shift) * factor
    let newx = (line[1].x   shift) * factor
    let newy = (line[1].y   shift) * factor
    doc
      .moveTo(oldx, oldy)
      .lineTo(newx, newy)
      .stroke()
  })
  data3.forEach(line => {
    let oldx = (line[0].x   shift) * factor
    let oldy = (line[0].y   shift) * factor
    let newx = (line[1].x   shift) * factor
    let newy = (line[1].y   shift) * factor
    doc
      .moveTo(oldx, oldy)
      .lineTo(newx, newy)
      .stroke('red')
  })
  doc.end();

} catch (err) {
  return console.error(err.stack);
}


function biggestNumberInArray(arr) {
  const max = Math.max(...arr);
  return max;
}

function chunkArrayInGroups(arr, size) {
  let result = [];
  let pos = 0;
  while (pos < arr.length) {
    result.push(arr.slice(pos, pos   size));
    pos  = size;
  }
  return resu<
}
 

Ответ №1:

Посидев немного на улице и уставившись на забор, я снова вернулся к своему компьютеру и снова просмотрел результат. Я повернул его на 180, как делал раньше, и изучил его. Затем я представил, что он перевернулся по оси y, как будто прямо с моего компьютера. ВОТ И ВСЕ! Я взял немного бумаги и нарисовал исходные координаты, а координаты — библиотеку pdf.

входные координаты ^ >

выходные координаты v >

Я понял, что единственная разница в системах координат заключалась в том, что ось y была инвертирована! Изменение строк на

       let oldx = (line[1].x   shift) * factor
      let oldy = (-line[1].y   shift) * factor
      let newx = (line[0].x   shift) * factor
      let newy = (-line[0].y   shift) * factor
 

инвертировано относительно y и после сдвига, напечатано правильно! Математика снова побеждает, хахаха