move fillSpace into its own file
This commit is contained in:
44
src/lib/utils/fillSpace.ts
Normal file
44
src/lib/utils/fillSpace.ts
Normal 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;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -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 &&
|
||||
|
||||
Reference in New Issue
Block a user