[英]How to format an array of coordinates to a different reference point
我環顧四周,找不到有關該主題的任何信息……可能是因為我無法將問題准確地迭代到搜索引擎中。
我正在嘗試從 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-parser 解析 dxf 獲得的,該解析器返回描述線路徑的對象數組。 其中四個組合成一個正方形,我用它來分割
function chunkArrayInGroups(arr, size) {
let result = [];
let pos = 0;
while (pos < arr.length) {
result.push(arr.slice(pos, pos + size));
pos += size;
}
return result;
}
((大小 = 4))
這在大多數情況下表現得如預期,除了這些坐標是用屏幕中心的原點創建的。 我用來創建最終文檔的 pdf 庫不使用相同的坐標系。 我相信它從頁面左上角開始。 這使我所有的負值((模型中心左側的任何內容))都切斷了頁面。
為了解決這個問題,我遍歷數組並在一個新數組中收集“0 - 所有 x 和 y 值”,我找到給我偏移量的最大值。 我將此偏移量添加到我的 x 值中,然后將它們插入我的 pdf 創建器以繪制線條。
我不確定是什么原因造成的,但 output 是我喜歡稱之為“達芬奇風格”的,它旋轉了 180 度並向后寫。 我認為為每個單元格添加一些值可以解決負面問題......確實如此,但數據仍然是關於中心原點的。 有沒有一種方法可以重新定義這些數據以使用該庫,或者是否有其他庫可以繪制這些數據並根據我的情況在特定位置添加文本。 我想繼續使用這個庫,因為我將它用於我程序的其他部分,但我對新的和更有效的想法持開放態度。
感謝您的時間和專業知識!
它應該是什么樣子
“達芬奇”結果
代碼副本:
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 result;
}
坐在外面盯着柵欄看了一會兒后,我重新打開了電腦,又看了看output。 我像以前一樣將它旋轉了 180 度,然后研究了它。 然后我想象它在 y 軸上翻轉,就像在我的電腦上一樣。 就是這樣,我抓起一些紙,畫出了原來的坐標。 和坐標 pdf 庫。
輸入坐標 ^ >
output 坐標 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 倒置並在移位后正確打印! 數學又贏了哈哈哈
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.