move fillSpace into its own file

This commit is contained in:
Peter Fajdiga
2024-10-25 12:14:32 +02:00
parent 92e1c2ffd4
commit 3ccc6dd870
2 changed files with 44 additions and 45 deletions

View File

@@ -0,0 +1,44 @@
function fillSpace(availableSpace: number, items: { min: number, max: number }[]) {
let mean = Math.floor(availableSpace / items.length);
while (true) {
let requiredSpace = 0;
let increasable = 0;
let decreasable = 0;
let low = -Infinity;
let high = Infinity;
for (const constraint of items) {
const value = clamp(mean, constraint.min, constraint.max);
requiredSpace += value;
if (mean > constraint.min) {
decreasable++;
if (value > low) {
low = value;
}
}
if (mean < constraint.max) {
increasable++;
if (value < high) {
high = value;
}
}
}
const oldMean = mean;
const error = requiredSpace - availableSpace;
if (error > 0) {
// need to decrease mean
if (decreasable > 0) {
mean = Math.floor(low - error / decreasable);
}
} else if (error < 0) {
// need to increase mean
if (increasable > 0) {
mean = Math.floor(high - error / increasable);
}
}
if (mean === oldMean) {
return mean;
}
}
}

View File

@@ -42,51 +42,6 @@ function findMinPositive<T>(items: T[], evaluate: (item: T) => number) {
return bestItem;
}
function fillSpace(availableSpace: number, items: { min: number, max: number }[]) {
let mean = Math.floor(availableSpace / items.length);
while (true) {
let requiredSpace = 0;
let increasable = 0;
let decreasable = 0;
let low = -Infinity;
let high = Infinity;
for (const constraint of items) {
const value = clamp(mean, constraint.min, constraint.max);
requiredSpace += value;
if (mean > constraint.min) {
decreasable++;
if (value > low) {
low = value;
}
}
if (mean < constraint.max) {
increasable++;
if (value < high) {
high = value;
}
}
}
const oldMean = mean;
const error = requiredSpace - availableSpace;
if (error > 0) {
// need to decrease mean
if (decreasable > 0) {
mean = Math.floor(low - error / decreasable);
}
} else if (error < 0) {
// need to increase mean
if (increasable > 0) {
mean = Math.floor(high - error / increasable);
}
}
if (mean === oldMean) {
return mean;
}
}
}
function rectEquals(a: QmlRect, b: QmlRect) {
return a.x === b.x &&
a.y === b.y &&