56 lines
1.4 KiB
JavaScript
56 lines
1.4 KiB
JavaScript
const BOUNDS = {
|
|
left: 32,
|
|
right: 358,
|
|
top: 130,
|
|
bottom: 560,
|
|
}
|
|
|
|
export function createAnchorGrid(columns = 6, rows = 8) {
|
|
const anchors = []
|
|
const width = BOUNDS.right - BOUNDS.left
|
|
const height = BOUNDS.bottom - BOUNDS.top
|
|
const stepX = width / (columns - 1)
|
|
const stepY = height / (rows - 1)
|
|
|
|
for (let row = 0; row < rows; row += 1) {
|
|
for (let column = 0; column < columns; column += 1) {
|
|
anchors.push({
|
|
id: `anchor_${row}_${column}`,
|
|
x: BOUNDS.left + column * stepX,
|
|
y: BOUNDS.top + row * stepY,
|
|
})
|
|
}
|
|
}
|
|
|
|
return anchors
|
|
}
|
|
|
|
export function getLayerDistribution(density, layers) {
|
|
const presets = {
|
|
low: [0.4, 0.35, 0.25],
|
|
medium: [0.3, 0.3, 0.25, 0.15],
|
|
medium_high: [0.28, 0.27, 0.25, 0.2],
|
|
high: [0.25, 0.25, 0.25, 0.25],
|
|
}
|
|
const base = presets[density] ?? presets.medium
|
|
const sliced = base.slice(0, layers)
|
|
const total = sliced.reduce((sum, value) => sum + value, 0)
|
|
|
|
return sliced.map((value) => value / total)
|
|
}
|
|
|
|
export function allocateLayerCounts(totalPieces, density, layers) {
|
|
const distribution = getLayerDistribution(density, layers)
|
|
const counts = distribution.map((value) => Math.floor(totalPieces * value))
|
|
let assigned = counts.reduce((sum, value) => sum + value, 0)
|
|
|
|
while (assigned < totalPieces) {
|
|
for (let index = 0; index < counts.length && assigned < totalPieces; index += 1) {
|
|
counts[index] += 1
|
|
assigned += 1
|
|
}
|
|
}
|
|
|
|
return counts
|
|
}
|